0% found this document useful (0 votes)
3 views

Help4Help+

The document is a Pine Script code for a trading indicator called 'Help4Help+'. It includes various calculations for trend analysis, support and resistance levels, and alerts for buy/sell signals based on market conditions. The script also features customizable inputs for users to adjust settings related to channel lengths, overbought/oversold levels, and visual elements.

Uploaded by

skabdulafridi53
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
3 views

Help4Help+

The document is a Pine Script code for a trading indicator called 'Help4Help+'. It includes various calculations for trend analysis, support and resistance levels, and alerts for buy/sell signals based on market conditions. The script also features customizable inputs for users to adjust settings related to channel lengths, overbought/oversold levels, and visual elements.

Uploaded by

skabdulafridi53
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 13

//@version=5

//Conbined by Hamza le 02-12-2024

indicator(title="Help4Help+",overlay=false)
n1 = input.int(10, "Channel Length")
n2 = input.int(21, "Average Length")
obLevel1 = input.int(60, "Over Bought Level 1")
obLevel2 = input.int(53, "Over Bought Level 2")
osLevel1 = input.int(-60, "Over Sold Level 1")
osLevel2 = input.int(-53, "Over Sold Level 2")

ap = hlc3
esa = ta.ema(ap, n1)
d = ta.ema(math.abs(ap - esa), n1)
ci = (ap - esa) / (0.015 * d)
tci = ta.ema(ci, n2)

wt1 = tci
wt2 = ta.sma(wt1,4)

plot(0, color=color.gray)
plot(obLevel1, color=color.red)
plot(osLevel1, color=color.green)
plot(obLevel2, color=color.red, style=plot.style_circles)
plot(osLevel2, color=color.green, style=plot.style_circles)

plot(wt1, color=color.green)
plot(wt2, color=color.red, style=plot.style_line)
plot(wt1-wt2, color=color.blue, style=plot.style_areabr)

///////////////////////////////////////////////////////////////////////////////////
/

var string calcGroup = 'Calculation'


length = input.int(title='ATR Period', defval=22, group=calcGroup)
mult = input.float(title='ATR Multiplier', step=0.1, defval=3.0, group=calcGroup)
useClose = input.bool(title='Use Close Price for Extremums', defval=true,
group=calcGroup)

var string visualGroup = 'Visuals'


showLabels = input.bool(title='Show Buy/Sell Labels', defval=false,
group=visualGroup)
highlightState = input.bool(title='Highlight State', defval=true,
group=visualGroup)

var string alertGroup = 'Alerts'


awaitBarConfirmation = input.bool(title="Await Bar Confirmation", defval=true,
group=alertGroup)

atr = mult * ta.atr(length)

longStop = (useClose ? ta.highest(close, length) : ta.highest(length)) - atr


longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? math.max(longStop, longStopPrev) : longStop

shortStop = (useClose ? ta.lowest(close, length) : ta.lowest(length)) + atr


shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? math.min(shortStop, shortStopPrev) :
shortStop

var int dir = 1


dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir

var color longColor = color.green


var color shortColor = color.red
var color longFillColor = color.new(color.green, 90)
var color shortFillColor = color.new(color.red, 90)
var color textColor = color.new(color.white, 0)

longStopPlot = plot(dir == 1 ? longStop : na, title='Long Stop',


style=plot.style_linebr, linewidth=1, color=color.new(longColor,
0),force_overlay=true)
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title='Long Stop Start',
location=location.absolute, style=shape.circle, size=size.tiny,
color=color.new(longColor, 0),force_overlay=true)
plotshape(buySignal and showLabels ? longStop : na, title='Buy Label', text='Buy',
location=location.absolute, style=shape.labelup, size=size.tiny,
color=color.new(longColor, 0), textcolor=textColor,force_overlay=true)

shortStopPlot = plot(dir == 1 ? na : shortStop, title='Short Stop',


style=plot.style_linebr, linewidth=1, color=color.new(shortColor,
0),force_overlay=true)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title='Short Stop Start',
location=location.absolute, style=shape.circle, size=size.tiny,
color=color.new(shortColor, 0),force_overlay=true)
plotshape(sellSignal and showLabels ? shortStop : na, title='Sell Label',
text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny,
color=color.new(shortColor, 0), textcolor=textColor,force_overlay=true)

midPricePlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=1,


display=display.none, editable=false,force_overlay=true)

longStateFillColor = highlightState ? dir == 1 ? longFillColor : na : na


shortStateFillColor = highlightState ? dir == -1 ? shortFillColor : na : na
fill(midPricePlot, longStopPlot, title='Long State Filling',
color=longStateFillColor)
fill(midPricePlot, shortStopPlot, title='Short State Filling',
color=shortStateFillColor)

await = awaitBarConfirmation ? barstate.isconfirmed : true


alertcondition(dir != dir[1] and await, title='Alert: CE Direction Change',
message='Chandelier Exit has changed direction!')
alertcondition(buySignal and await, title='Alert: CE Buy', message='Chandelier Exit
Buy!')
alertcondition(sellSignal and await, title='Alert: CE Sell', message='Chandelier
Exit Sell!')

///////////////////////////////////////////////////////////////////////////////////
/////

//------------------------------------------------------------------------------
//Settings
//-----------------------------------------------------------------------------{
lengtht = input.int(14, 'Swing Detection Lookback')
multt = input.float(1., 'Slope', minval = 0, step = .1)
calcMethod = input.string('Atr', 'Slope Calculation Method', options =
['Atr','Stdev','Linreg'])
backpaint = input(true, tooltip = 'Backpainting offset displayed elements in the
past. Disable backpainting to see real time information returned by the
indicator.')

//Style
upCss = input.color(color.teal, 'Up Trendline Color', group = 'Style')
dnCss = input.color(color.red, 'Down Trendline Color', group = 'Style')
showExt = input(true, 'Show Extended Lines')

//-----------------------------------------------------------------------------}
//Calculations
//-----------------------------------------------------------------------------{
var upper = 0.
var lower = 0.
var slope_ph = 0.
var slope_pl = 0.

var offset = backpaint ? lengtht : 0

n = bar_index
src = close

ph = ta.pivothigh(lengtht, lengtht)
pl = ta.pivotlow(lengtht, lengtht)

//Slope Calculation Method


slope = switch calcMethod
'Atr' => ta.atr(lengtht) / lengtht * multt
'Stdev' => ta.stdev(src,lengtht) / lengtht * multt
'Linreg' => math.abs(ta.sma(src * n, lengtht) - ta.sma(src, lengtht) *
ta.sma(n, lengtht)) / ta.variance(n, lengtht) / 2 * multt

//Get slopes and calculate trendlines


slope_ph := ph ? slope : slope_ph
slope_pl := pl ? slope : slope_pl

upper := ph ? ph : upper - slope_ph


lower := pl ? pl : lower + slope_pl

var upos = 0
var dnos = 0
upos := ph ? 0 : close > upper - slope_ph * length ? 1 : upos
dnos := pl ? 0 : close < lower + slope_pl * length ? 1 : dnos

//-----------------------------------------------------------------------------}
//Extended Lines
//-----------------------------------------------------------------------------{
var uptl = line.new(na,na,na,na, color = upCss, style = line.style_dashed, extend
= extend.right,force_overlay=true)
var dntl = line.new(na,na,na,na, color = dnCss, style = line.style_dashed, extend
= extend.right,force_overlay=true)

if ph and showExt
uptl.set_xy1(n-offset, backpaint ? ph : upper - slope_ph * lengtht)
uptl.set_xy2(n-offset+1, backpaint ? ph - slope : upper - slope_ph *
(lengtht+1))

if pl and showExt
dntl.set_xy1(n-offset, backpaint ? pl : lower + slope_pl * lengtht)
dntl.set_xy2(n-offset+1, backpaint ? pl + slope : lower + slope_pl *
(lengtht+1))

//-----------------------------------------------------------------------------}
//Plots
//-----------------------------------------------------------------------------{
plot(backpaint ? upper : upper - slope_ph * lengtht, 'Upper', color = ph ? na :
upCss, offset = -offset,force_overlay=true)
plot(backpaint ? lower : lower + slope_pl * lengtht, 'Lower', color = pl ? na :
dnCss, offset = -offset,force_overlay=true)

//Breakouts
plotshape(upos > upos[1] ? low : na, "Upper Break"
, shape.labelup
, location.absolute
, upCss
, text = "B"
, textcolor = color.white
, size = size.tiny,force_overlay=true)

plotshape(dnos > dnos[1] ? high : na, "Lower Break"


, shape.labeldown
, location.absolute
, dnCss
, text = "B"
, textcolor = color.white
, size = size.tiny,force_overlay=true)

//-----------------------------------------------------------------------------}
//Alerts
//-----------------------------------------------------------------------------{
alertcondition(upos > upos[1], 'Upward Breakout', 'Price broke the down-trendline
upward')
alertcondition(dnos > dnos[1], 'Downward Breakout', 'Price broke the up-trendline
downward')

//-----------------------------------------------------------------------------}
///////////////////////////////////////////////////////////////////////////////////
///////////////////

showRevBands = input.bool(true, "Show Reversal Bands", group="REVERSAL BANDS")


lenRevBands = input.int(30, "Length", group="REVERSAL BANDS")

// Functions
f_kc(src, len, sensitivity) =>
basis = ta.sma(src, len)
span = ta.atr(len)
[basis + span * sensitivity, basis - span * sensitivity]

[upperKC1, lowerKC1] = f_kc(close, lenRevBands, 3)


[upperKC2, lowerKC2] = f_kc(close, lenRevBands, 4)
[upperKC3, lowerKC3] = f_kc(close, lenRevBands, 5)
[upperKC4, lowerKC4] = f_kc(close, lenRevBands, 6)
cyan = #3179f5, cyan30 = color.new(cyan, 70)
pink = #f23645, pink30 =color.new(pink, 70)
red = #f23645, red30 = color.new(red , 70)
zoneupper1=plot(showRevBands ? upperKC1 : na, "Rev.Zone Upper 1",
red30,force_overlay=true)
zoneupper2=plot(showRevBands ? upperKC2 : na, "Rev.Zone Upper 2",
red30,force_overlay=true)
zonelower2=plot(showRevBands ? lowerKC2 : na, "Rev.Zone Lower 2",
cyan30,force_overlay=true)
zonelower1=plot(showRevBands ? lowerKC1 : na, "Rev.Zone Lower 1",
cyan30,force_overlay=true)
fill(zoneupper1, zoneupper2, color = red30)
fill(zonelower1, zonelower2, color = cyan30)

///////////////////////////////////////////////////////////////////////////////////
/////

// This work is licensed under Creative Commons Attribution-NonCommercial-


ShareAlike 4.0 International
// © BigBeluga

//@version=5
//indicator("Premium & Discount Delta Volume [BigBeluga]", overlay = true,
max_lines_count = 2, max_boxes_count = 3)

// INPUTS
-----------------------------------------------------------------------------------
---------------------------
// @variable: Toggle to show Support and Resistance levels
bool showSR = input.bool(true, "", inline = "0")
// @variable: Lookback period for calculating Support and Resistance
int srPeriod = input.int(50, "Premium & Discount Lookback Period", minval = 10,
step = 10, inline = "0",
tooltip = "Lookback period for Premium & Discount Levels
with Delta Volume")
// @variable: Toggle to show macro High and Low levels
bool showMacro = input.bool(true, "", inline = "1")
// @variable: Lookback period for calculating macro Highs and Lows
int macroPeriod = input.int(200, "Macro Lookback Period", minval = 10, step = 10,
inline = "1",
tooltip = "Lookback period for Macro Highs/Lows and
Delta Volume")
// Color variables for trends
color upColor = input.color(#79c1f1, "Discount", inline = "col", group =
"Color")
color downColor = input.color(#f19579, "Premium", inline = "col", group =
"Color")

// ARRAYS FOR STORING DATA


-----------------------------------------------------------------------------------
----------
// Arrays to store high/low data for S/R levels
var float[] srHighs = array.new_float(srPeriod, 0.)
var float[] srLows = array.new_float(srPeriod, 0.)
// Arrays to store high/low data for Macro levels
var float[] macroHighs = array.new_float(macroPeriod, 0.)
var float[] macroLows = array.new_float(macroPeriod, 0.)
// Arrays to store delta volume data
var float[] posVolSR = array.new_float(srPeriod, 0.)
var float[] negVolSR = array.new_float(srPeriod, 0.)
var float[] posVolMacro = array.new_float(macroPeriod, 0.)
var float[] negVolMacro = array.new_float(macroPeriod, 0.)

// VARIABLES FOR DELTA VOLUME CALCULATIONS


-----------------------------------------------------------------------------
// Variables to store delta volume percentages for S/R and Macro periods
var float deltaVolSR = na
var float deltaVolMacro = na

// VARIABLES FOR BOX DRAWING


-----------------------------------------------------------------------------------
---------
// Variables for box indices for both S/R and Macro periods
int srStartIdx = bar_index - srPeriod
int srEndIdx = bar_index + 50
int macroStartIdx = bar_index - macroPeriod
int macroEndIdx = bar_index + 70

// Variables for box drawing


var box srUpperBox = na
var box srLowerBox = na
var box macroUpperBox = na
var box macroLowerBox = na
var box midBox = na

// ATR for box scaling


float atrValue = ta.atr(200)*0.8

// VOLUME DELTA CALCULATIONS


-----------------------------------------------------------------------------------
--------
// @description: Calculate the delta volume for Macro period
if barstate.islast and showMacro
for int i = 0 to macroPeriod - 1
array.push(macroHighs, high[i])
array.push(macroLows, low[i])
// Store positive and negative volume based on candle direction
if close[i] > open[i]
posVolMacro.set(i, volume[i])
if close[i] < open[i]
negVolMacro.set(i, -volume[i])
// Calculate Macro Delta Volume
deltaVolMacro := (negVolMacro.avg() / posVolMacro.avg() + 1) * 100
deltaVolMacro := math.min(math.max(deltaVolMacro, -100), 100) // Cap delta
volume between -100 and 100

// Calculate the delta volume for S/R period


if barstate.islast and showSR
for int i = 0 to srPeriod - 1
array.push(srHighs, high[i])
array.push(srLows, low[i])
// Store positive and negative volume based on candle direction
if close[i] > open[i]
posVolSR.set(i, volume[i])
if close[i] < open[i]
negVolSR.set(i, -volume[i])
// Calculate S/R Delta Volume
deltaVolSR := (negVolSR.avg() / posVolSR.avg() + 1) * 100
deltaVolSR := math.min(math.max(deltaVolSR, -100), 100) // Cap delta volume
between -100 and 100

// BOX HANDLING AND UPDATING


-----------------------------------------------------------------------------------
--------
// Update and manage boxes based on crossover conditions
if ta.crossover(low, srUpperBox.get_top()) or ta.crossunder(high,
srLowerBox.get_bottom()) or bar_index % 100 == 0
// Set new bounds for S/R and Macro boxes
srUpperBox.set_top(srHighs.max() + atrValue)
srUpperBox.set_bottom(srHighs.min())
srLowerBox.set_top(srLows.min())
srLowerBox.set_bottom(srLows.min() - atrValue)

macroUpperBox.set_top(macroHighs.max() + atrValue)
macroUpperBox.set_bottom(macroHighs.min())
macroLowerBox.set_top(macroLows.min())
macroLowerBox.set_bottom(macroLows.min() - atrValue)

// Delete previous boxes


box.delete(srUpperBox[1])
box.delete(srLowerBox[1])
box.delete(macroUpperBox[1])
box.delete(macroLowerBox[1])

// DRAW AND UPDATE BOXES


-----------------------------------------------------------------------------------
-------------
// Draw and update lower box if not initialized for S/R period
if na(srLowerBox) and barstate.islast and showSR
srLowerBox := box.new(srStartIdx, srLows.min(), srEndIdx, srLows.min() -
atrValue,
upColor, 1,
bgcolor = color.new(upColor, 100),
text = "DISCOUNT: " + str.tostring(posVolSR.sum(),
format.volume),
text_size = size.small,
text_color= chart.fg_color, force_overlay =
true,force_overlay=true)
else
srLowerBox.set_text("DISCOUNT: " + str.tostring(posVolSR.sum(), format.volume))
box.set_left(srLowerBox, srStartIdx)
box.set_right(srLowerBox, srEndIdx)
array.clear(srLows)

// Draw and update upper box if not initialized for S/R period
if na(srUpperBox) and barstate.islast and showSR
srUpperBox := box.new(srStartIdx, srHighs.max() + atrValue, srEndIdx,
srHighs.max(),
downColor, 1,
bgcolor = color.new(downColor, 100),
text = "PREMIUM: " + str.tostring(negVolSR.sum(),
format.volume),
text_size = size.small,
text_color= chart.fg_color, force_overlay =
true,force_overlay=true)
else
srUpperBox.set_text("PREMIUM: " + str.tostring(negVolSR.sum(), format.volume))
box.set_left(srUpperBox, srStartIdx)
box.set_right(srUpperBox, srEndIdx)
array.clear(srHighs)

// DRAW BOXES FOR MACRO PERIOD


-----------------------------------------------------------------------------------
-------
// Draw and update upper box for Macro period
if na(macroUpperBox) and barstate.islast and showMacro
macroUpperBox := box.new(
macroStartIdx, macroHighs.max() + atrValue,
macroEndIdx, macroHighs.max(),
downColor, 0,
bgcolor = color.new(downColor, 60),
text = str.tostring(negVolMacro.sum(),
format.volume),
text_size = size.small,
text_color = chart.fg_color,
text_halign= showSR ? text.align_right :
text.align_center,force_overlay=true
)
else
macroUpperBox.set_text(str.tostring(negVolMacro.sum(), format.volume))
box.set_left(macroUpperBox, macroStartIdx)
box.set_right(macroUpperBox, macroEndIdx)
array.clear(macroHighs)

// Draw and update lower box for Macro period


if na(macroLowerBox) and barstate.islast and showMacro
macroLowerBox := box.new(
macroStartIdx, macroLows.min(), macroEndIdx,
macroLows.min() - atrValue,
upColor, 0,
bgcolor = color.new(upColor, 60),
text = str.tostring(posVolMacro.sum(),
format.volume),
text_size = size.small,
text_color = chart.fg_color,
text_halign= showSR ? text.align_right :
text.align_center,force_overlay=true
)
else
macroLowerBox.set_text(str.tostring(posVolMacro.sum(), format.volume))
box.set_left(macroLowerBox, macroStartIdx)
box.set_right(macroLowerBox, macroEndIdx)
array.clear(macroLows)

// ADDITIONAL PLOTTING
-----------------------------------------------------------------------------------
---------------
// Draw line for equilibrium and box for delta volume display
if barstate.islast and showSR
float mid = math.avg(srLowerBox.get_top(), srUpperBox.get_bottom())
line.delete(line.new(srStartIdx, mid, srEndIdx, mid, color=chart.fg_color,
style=line.style_dashed,force_overlay=true)[1])

midBox := box.new(srStartIdx, srUpperBox.get_bottom(), srEndIdx,


srLowerBox.get_top(),
na, 0,
bgcolor = color.new(deltaVolSR > 0 ? upColor :
downColor, 93),
text = "Delta Volume\n" + str.tostring(deltaVolSR,
format.percent),
text_size = size.normal, text_color=deltaVolSR > 0 ?
upColor : downColor,
text_halign = text.align_right,
text_valign=text.align_bottom,force_overlay=true)

box.delete(midBox[1])

// If only macro levels are shown, handle box and line drawing
if not showSR and showMacro and barstate.islast
float midMacro = math.avg(macroLowerBox.get_top(), macroUpperBox.get_bottom())
line.delete(line.new(macroStartIdx, midMacro, macroEndIdx, midMacro,
color=chart.fg_color,
style=line.style_dashed,force_overlay=true)[1])

// Display Macro Delta Volume as a table


if showMacro and barstate.islast
var table deltaTable = table.new(position.top_right, 5, 5,force_overlay=true)
table.cell(deltaTable, 0, 0,
text = "Macro\n Delta Volume:\n" +
str.tostring(deltaVolMacro, format.percent),
text_color = deltaVolMacro > 0 ? upColor : downColor,
text_size = size.large)

///////////////////////////////////////////////////////////////////////////////////
/////////////////////////

// Input parameters

candle_stability_index_param = input.float(0.5, 'Candle Stability Index', 0, 1,


step=0.1, group='Technical', tooltip='Candle Stability Index measures the ratio
between the body and the wicks of a candle. Higher - more stable.')

rsi_index_param = input.int(50, 'RSI Index', 0, 100, group='Technical',


tooltip='RSI Index measures how overbought/oversold is the market. Higher - more
overbought/oversold.')

candle_delta_length_param = input.int(5, 'Candle Delta Length', 3,


group='Technical', tooltip='Candle Delta Length measures the period over how many
candles the price increased/decreased. Higher - longer period.')

disable_repeating_signals_param = input.bool(true, 'Disable Repeating Signals',


group='Technical', tooltip='Removes repeating signals. Useful for removing clusters
of signals and general clarity')

// ATR parameters

atr_length = input.int(14, 'ATR Length', group='Risk Management', tooltip='ATR


Length determines the number of periods for calculating ATR.')

atr_multiplier_tp = input.float(1.5, 'ATR Take-Profit Multiplier', 0.1, 10,


step=0.1, group='Risk Management')
atr_multiplier_sl = input.float(1.0, 'ATR Stop-Loss Multiplier', 0.1, 10, step=0.1,
group='Risk Management')

// Trailing Stop parameters

use_trailing_stop = input.bool(true, 'Enable Trailing Stop-Loss', group='Risk


Management', tooltip='Enable trailing stop-loss to lock in profits.')

trailing_stop_multiplier = input.float(1.0, 'Trailing Stop ATR Multiplier', 0.1,


10, step=0.1, group='Risk Management')

// Colors and styles

GREEN = color.rgb(29, 255, 40)

RED = color.rgb(255, 0, 0)

TRANSPARENT = color.rgb(0, 0, 0, 100)

label_size = input.string('normal', 'Label Size', options=['huge', 'large',


'normal', 'small', 'tiny'], group='Cosmetic')

label_style = input.string('text bubble', 'Label Style', ['text bubble',


'triangle', 'arrow'], group='Cosmetic')

buy_label_color = input(GREEN, 'BUY Label Color', inline='Highlight',


group='Cosmetic')

sell_label_color = input(RED, 'SELL Label Color', inline='Highlight',


group='Cosmetic')

label_text_color = input(color.white, 'Label Text Color', inline='Highlight',


group='Cosmetic')

// Calculations

atr_value = ta.atr(atr_length)

// Technical signals

stable_candle = math.abs(close - open) / ta.tr > candle_stability_index_param

rsig = ta.rsi(close, 14)

bullish_engulfing = close[1] < open[1] and close > open and close > open[1]
rsi_below = rsig < rsi_index_param

decrease_over = close < close[candle_delta_length_param]

bull = bullish_engulfing and stable_candle and rsi_below and decrease_over and


barstate.isconfirmed

bearish_engulfing = close[1] > open[1] and close < open and close < open[1]

rsi_above = rsig > 100 - rsi_index_param

increase_over = close > close[candle_delta_length_param]

bear = bearish_engulfing and stable_candle and rsi_above and increase_over and


barstate.isconfirmed

// Track last signal

var string last_signal = na

if bull and (disable_repeating_signals_param ? (last_signal != 'buy') : true)

// Calculate BUY take-profit and stop-loss

take_profit_buy = close + (atr_value * atr_multiplier_tp)

stop_loss_buy = close - (atr_value * atr_multiplier_sl)

// Plot BUY label with TP and SL

if label_style == 'text bubble'

label.new(bar_index, low, 'BUY\nTP: ' + str.tostring(take_profit_buy,


"#.##") + '\nSL: ' + str.tostring(stop_loss_buy, "#.##"), color=buy_label_color,
style=label.style_label_up, textcolor=label_text_color,
size=label_size,force_overlay=true)

else if label_style == 'triangle'

label.new(bar_index, low, 'BUY\nTP: ' + str.tostring(take_profit_buy,


"#.##") + '\nSL: ' + str.tostring(stop_loss_buy, "#.##"), yloc=yloc.belowbar,
color=buy_label_color, style=label.style_triangleup, textcolor=TRANSPARENT,
size=label_size,force_overlay=true)

else if label_style == 'arrow'

label.new(bar_index, low, 'BUY\nTP: ' + str.tostring(take_profit_buy,


"#.##") + '\nSL: ' + str.tostring(stop_loss_buy, "#.##"), yloc=yloc.belowbar,
color=buy_label_color, style=label.style_arrowup, textcolor=TRANSPARENT,
size=label_size,force_overlay=true)

last_signal := 'buy'

if bear and (disable_repeating_signals_param ? (last_signal != 'sell') : true)

// Calculate SELL take-profit and stop-loss

take_profit_sell = close - (atr_value * atr_multiplier_tp)

stop_loss_sell = close + (atr_value * atr_multiplier_sl)

// Plot SELL label with TP and SL

if label_style == 'text bubble'

label.new(bar_index, high, 'SELL\nTP: ' + str.tostring(take_profit_sell,


"#.##") + '\nSL: ' + str.tostring(stop_loss_sell, "#.##"), color=sell_label_color,
style=label.style_label_down, textcolor=label_text_color,
size=label_size,force_overlay=true)

else if label_style == 'triangle'

label.new(bar_index, high, 'SELL\nTP: ' + str.tostring(take_profit_sell,


"#.##") + '\nSL: ' + str.tostring(stop_loss_sell, "#.##"), yloc=yloc.abovebar,
color=sell_label_color, style=label.style_triangledown, textcolor=TRANSPARENT,
size=label_size,force_overlay=true)

else if label_style == 'arrow'

label.new(bar_index, high, 'SELL\nTP: ' + str.tostring(take_profit_sell,


"#.##") + '\nSL: ' + str.tostring(stop_loss_sell, "#.##"), yloc=yloc.abovebar,
color=sell_label_color, style=label.style_arrowdown, textcolor=TRANSPARENT,
size=label_size,force_overlay=true)

last_signal := 'sell'

// Alerts

alertcondition(bull, 'BUY Signals', 'New signal: BUY')

alertcondition(bear, 'SELL Signals', 'New signal: SELL')


// Trailing Stop-Loss Logic

var float trailing_stop = na

if use_trailing_stop

if last_signal == 'buy' and close > trailing_stop[1] + (atr_value *


trailing_stop_multiplier)

trailing_stop := close - (atr_value * trailing_stop_multiplier)

if last_signal == 'sell' and close < trailing_stop[1] - (atr_value *


trailing_stop_multiplier)

trailing_stop := close + (atr_value * trailing_stop_multiplier)

You might also like