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

algo indicator

The document is a Pine Script for a personal trading indicator named 'SHAHZAIB s PERSONAL INDICATOR'. It includes various settings for inputs, visual styles, support/resistance, and risk management parameters, allowing users to customize their trading strategies. The script also contains functions for managing arrays, drawing supply/demand zones, and calculating linear regression slopes and deviations.

Uploaded by

zooman4566
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
205 views

algo indicator

The document is a Pine Script for a personal trading indicator named 'SHAHZAIB s PERSONAL INDICATOR'. It includes various settings for inputs, visual styles, support/resistance, and risk management parameters, allowing users to customize their trading strategies. The script also contains functions for managing arrays, drawing supply/demand zones, and calculating linear regression slopes and deviations.

Uploaded by

zooman4566
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 13

//@version=5

indicator('SHAHZAIB s PERSONAL INDICATOR ', shorttitle='ALGO EXTREMEP Crypto


V6_1_24', overlay=true, explicit_plot_zorder=true)

// === DONATION INFO ===

// === INPUTS ===


res=input.timeframe('15', 'TIMEFRAME', group="NON REPAINT")
useRes=input(true, 'Use Alternate Signals')
intRes=input(10, 'Multiplier for Alternate Signals')
basisType=input.string('ALMA', 'MA Type: ', options=['TEMA', 'HullMA', 'ALMA'])
basisLen=input.int(50, 'MA Period', minval=1)
offsetSigma=input.int(5, 'Offset for LSMA / Sigma for ALMA', minval=0)
offsetALMA=input.float(2, 'Offset for ALMA', minval=0, step=0.01)
scolor=input(false, 'Show coloured Bars to indicate Trend?')
delayOffset=input.int(0, 'Delay Open/Close MA', minval=0, step=1, tooltip='Forces
Non-Repainting')
tradeType=input.string('BOTH', 'What trades should be taken : ', options=['LONG',
'SHORT', 'BOTH', 'NONE'])
h=input(false, 'Signals for Heikin Ashi Candles')

// INDICATOR SETTINGS
swing_length=input.int(10, 'Swing High/Low Length', group='Settings', minval=1,
maxval=50)
history_of_demand_to_keep=input.int(20, 'History To Keep', minval=5, maxval=50)
box_width=input.float(2.5, 'Supply/Demand Box Width', group='Settings', minval=1,
maxval=10, step=0.5)

// INDICATOR VISUAL SETTINGS


show_zigzag=input.bool(false, 'Show Zig Zag', group='Visual Settings', inline='1')
show_price_action_labels=input.bool(false, 'Show Price Action Labels',
group='Visual Settings', inline='2')
supply_color=input.color(#00000000, 'Supply', group='Visual Settings', inline='3')
supply_outline_color=input.color(#00000000, 'Outline', group='Visual Settings',
inline='3')
demand_color=input.color(#00000000, 'Demand', group='Visual Settings', inline='4')
demand_outline_color=input.color(#00000000, 'Outline', group='Visual Settings',
inline='4')
bos_label_color=input.color(#00000000, 'BOS Label', group='Visual Settings',
inline='5')
poi_label_color=input.color(#00000000, 'POI Label', group='Visual Settings',
inline='7')
poi_border_color=input.color(#00000000, 'POI border', group='Visual Settings',
inline='7')
swing_type_color=input.color(#00000000, 'Price Action Label', group='Visual
Settings', inline='8')
zigzag_color=input.color(#00000000, 'Zig Zag', group='Visual Settings', inline='9')

// SUPPORT/RESISTANCE SETTINGS
enableSR=input(false, "SR On/Off", group="SR")
colorSup=input(#00000000, "Support Color", group="SR")
colorRes=input(#00000000, "Resistance Color", group="SR")
strengthSR=input.int(2, "S/R Strength", 1, group="SR")
lineStyle=input.string("Dotted", "Line Style", ["Solid", "Dotted", "Dashed"],
group="SR")
lineWidth=input.int(2, "S/R Line Width", 1, group="SR")
useZones=input(true, "Zones On/Off", group="SR")
useHLZones=input(true, "High Low Zones On/Off", group="SR")
zoneWidth=input.int(2, "Zone Width %", 0, tooltip="it's calculated using % of the
distance between highest/lowest in last 300 bars", group="SR")
expandSR=input(true, "Expand SR")

// RISK MANAGEMENT INPUTS


i_lxLvlTP1=input.float(0.2, 'Level TP1', group='Risk Management', tooltip='(%) Exit
Level')
i_lxLvlTP2=input.float(0.5, 'Level TP2', group='Risk Management', tooltip='(%) Exit
Level')
i_lxLvlTP3=input.float(7.0, 'Level TP3', group='Risk Management', tooltip='(%) Exit
Level')
i_lxLvlSL=input.float(0.5, 'Stop Loss', group='Risk Management', tooltip='(%) Exit
Level')
i_sxLvlTP1=i_lxLvlTP1
i_sxLvlTP2=i_lxLvlTP2
i_sxLvlTP3=i_lxLvlTP3
i_sxLvlSL=i_lxLvlSL

// DISPLAY SETTINGS
i_alertOn=input.bool(true, 'Alert Labels On/Off', group='Display')
i_barColOn=input.bool(true, 'Bar Color On/Off', group='Display')

// === FUNCTIONS ===

// Array management
f_array_add_pop(array, new_value_to_add)=>
array.unshift(array, new_value_to_add)
array.pop(array)

// Swing high/low labels


f_sh_sl_labels(array, swing_type)=>
var string label_text=na
if swing_type==1
label_text:=array.get(array, 0)>=array.get(array, 1) ? 'HH' : 'LH'
label.new(bar_index-swing_length, array.get(array,0), text=label_text,
style=label.style_label_down, textcolor=swing_type_color, color=swing_type_color,
size=size.tiny)
else if swing_type==-1
label_text:=array.get(array, 0)>=array.get(array, 1) ? 'HL' : 'LL'
label.new(bar_index-swing_length, array.get(array,0), text=label_text,
style=label.style_label_up, textcolor=swing_type_color, color=swing_type_color,
size=size.tiny)

// Check for overlapping supply/demand zones


f_check_overlapping(new_poi, box_array, atrValue)=>
atr_threshold=atrValue*2
okay_to_draw=true
for i=0 to array.size(box_array)-1
top=box.get_top(array.get(box_array, i))
bottom=box.get_bottom(array.get(box_array, i))
poi=(top+bottom)/2
upper_boundary=poi+atr_threshold
lower_boundary=poi-atr_threshold
if new_poi>=lower_boundary and new_poi<=upper_boundary
okay_to_draw:=false
break
else
okay_to_draw:=true
okay_to_draw

// Draw supply/demand zones


f_supply_demand(value_array, bn_array, box_array, label_array, box_type,
atrValue)=>
atr_buffer=atrValue*(box_width/10)
box_left=array.get(bn_array, 0)
box_right=bar_index
var float box_top=0.00
var float box_bottom=0.00
var float poi=0.00
if box_type==1
box_top:=array.get(value_array, 0)
box_bottom:=box_top-atr_buffer
poi:=(box_top+box_bottom)/2
else if box_type==-1
box_bottom:=array.get(value_array, 0)
box_top:=box_bottom+atr_buffer
poi:=(box_top+box_bottom)/2
okay_to_draw=f_check_overlapping(poi, box_array, atrValue)
if box_type==1 and okay_to_draw
box.delete(array.get(box_array, array.size(box_array)-1))
f_array_add_pop(box_array, box.new(left=box_left, top=box_top,
right=box_right, bottom=box_bottom, border_color=supply_outline_color,
bgcolor=supply_color, extend=extend.right, text='SUPPLY',
text_halign=text.align_center, text_valign=text.align_center,
text_color=poi_label_color, text_size=size.small, xloc=xloc.bar_index))
box.delete(array.get(label_array, array.size(label_array)-1))
f_array_add_pop(label_array, box.new(left=box_left, top=poi,
right=box_right, bottom=poi, border_color=poi_border_color,
bgcolor=poi_border_color, extend=extend.right, text='POI',
text_halign=text.align_left, text_valign=text.align_center,
text_color=poi_label_color, text_size=size.small, xloc=xloc.bar_index))
else if box_type==-1 and okay_to_draw
box.delete(array.get(box_array, array.size(box_array)-1))
f_array_add_pop(box_array, box.new(left=box_left, top=box_top,
right=box_right, bottom=box_bottom, border_color=demand_outline_color,
bgcolor=demand_color, extend=extend.right, text='DEMAND',
text_halign=text.align_center, text_valign=text.align_center,
text_color=poi_label_color, text_size=size.small, xloc=xloc.bar_index))
box.delete(array.get(label_array, array.size(label_array)-1))
f_array_add_pop(label_array, box.new(left=box_left, top=poi,
right=box_right, bottom=poi, border_color=poi_border_color,
bgcolor=poi_border_color, extend=extend.right, text='POI',
text_halign=text.align_left, text_valign=text.align_center,
text_color=poi_label_color, text_size=size.small, xloc=xloc.bar_index))

// Convert supply/demand to BOS if broken


f_sd_to_bos(box_array, bos_array, label_array, zone_type)=>
if zone_type==1
for i=0 to array.size(box_array)-1
level_to_break=box.get_top(array.get(box_array,i))
if close>=level_to_break
copied_box=box.copy(array.get(box_array,i))
f_array_add_pop(bos_array, copied_box)
mid=(box.get_top(array.get(box_array,i))
+box.get_bottom(array.get(box_array,i)))/2
box.set_top(array.get(bos_array,0), mid)
box.set_bottom(array.get(bos_array,0), mid)
box.set_extend(array.get(bos_array,0), extend.none)
box.set_right(array.get(bos_array,0), bar_index)
box.set_text(array.get(bos_array,0), 'BOS')
box.set_text_color(array.get(bos_array,0), bos_label_color)
box.set_text_size(array.get(bos_array,0), size.small)
box.set_text_halign(array.get(bos_array,0), text.align_center)
box.set_text_valign(array.get(bos_array,0), text.align_center)
box.delete(array.get(box_array, i))
box.delete(array.get(label_array, i))
if zone_type==-1
for i=0 to array.size(box_array)-1
level_to_break=box.get_bottom(array.get(box_array,i))
if close<=level_to_break
copied_box=box.copy(array.get(box_array,i))
f_array_add_pop(bos_array, copied_box)
mid=(box.get_top(array.get(box_array,i))
+box.get_bottom(array.get(box_array,i)))/2
box.set_top(array.get(bos_array,0), mid)
box.set_bottom(array.get(bos_array,0), mid)
box.set_extend(array.get(bos_array,0), extend.none)
box.set_right(array.get(bos_array,0), bar_index)
box.set_text(array.get(bos_array,0), 'BOS')
box.set_text_color(array.get(bos_array,0), bos_label_color)
box.set_text_size(array.get(bos_array,0), size.small)
box.set_text_halign(array.get(bos_array,0), text.align_center)
box.set_text_valign(array.get(bos_array,0), text.align_center)
box.delete(array.get(box_array, i))
box.delete(array.get(label_array, i))

// Extend box endpoints


f_extend_box_endpoint(box_array)=>
for i=0 to array.size(box_array)-1
box.set_right(array.get(box_array, i), bar_index+100)

// Linear regression slope


lr_slope(_src, _len)=>
x=0.0, y=0.0, x2=0.0, xy=0.0
for i=0 to _len-1
val=_src[i]
per=i+1
x+=per
y+=val
x2+=per*per
xy+=val*per
_slp=(_len*xy-x*y)/(_len*x2-x*x)
_avg=y/_len
_int=_avg-_slp*x/_len+_slp
[_slp, _avg, _int]

// Linear regression deviation


lr_dev(_src, _len, _slp, _avg, _int)=>
upDev=0.0, dnDev=0.0
val=_int
for j=0 to _len-1
price=high[j]-val
if price>upDev
upDev:=price
price:=val-low[j]
if price>dnDev
dnDev:=price
price:=_src[j]
val+=_slp
[upDev, dnDev]

// Get line style


//get_line_style(style)=> switch style 'Solid' ? line.style_solid : 'Dotted' ?
line.style_dotted : 'Dashed' ? line.style_dashed : line.style_solid

// Get order block coordinates


get_coordinates(condition, top, btm, ob_val)=>
var ob_top=array.new_float(0)
var ob_btm=array.new_float(0)
var ob_avg=array.new_float(0)
var ob_left=array.new_int(0)
float ob=na
if condition
avg=math.avg(top, btm)
array.unshift(ob_top, top)
array.unshift(ob_btm, btm)
array.unshift(ob_avg, avg)
ob:=ob_val
[ob_top, ob_btm, ob_avg, ob_left, ob]

// Remove mitigated order blocks


remove_mitigated(ob_top, ob_btm, ob_left, ob_avg, target, bull)=>
mitigated=false
target_array=bull ? ob_btm : ob_top
for element in target_array
idx=array.indexof(target_array, element)
if (bull ? target<element : target>element)
mitigated:=true
array.remove(ob_top, idx)
array.remove(ob_btm, idx)
array.remove(ob_avg, idx)
array.remove(ob_left, idx)
mitigated

// Set order blocks


set_order_blocks(ob_top, ob_btm, ob_left, ob_avg, ext_last, bg_css, border_css,
lvl_css)=>
var ob_box=array.new_box(0)
var ob_lvl=array.new_line(0)

// Non-repainting security
rp_security(_symbol, _res, _src)=> request.security(_symbol, _res,
_src[barstate.isrealtime ? 1 : 0])

// Smooth range
smoothrng(x, t, m)=>
wper=t*2-1
avrng=ta.ema(math.abs(x-x[1]), t)
smoothrng=ta.ema(avrng, wper)*m

// Range filter
rngfilt(x, r)=>
rngfilt=x
rngfilt:=x>nz(rngfilt[1]) ? x-r<nz(rngfilt[1]) ? nz(rngfilt[1]) : x-r :
x+r>nz(rngfilt[1]) ? nz(rngfilt[1]) : x+r
// Percentage width
percWidth(len, perc)=> (ta.highest(len)-ta.lowest(len))*perc/100

// Security no repaint
securityNoRep(sym, res, src)=> request.security(sym, res, src, barmerge.gaps_off,
barmerge.lookahead_on)

// Swing points
swingPoints(prd)=>
pivHi=ta.pivothigh(prd, prd)
pivLo=ta.pivotlow(prd, prd)
last_pivHi=ta.valuewhen(pivHi, pivHi, 1)
last_pivLo=ta.valuewhen(pivLo, pivLo, 1)
hh=pivHi and pivHi>last_pivHi ? pivHi : na
lh=pivHi and pivHi<last_pivHi ? pivHi : na
hl=pivLo and pivLo>last_pivLo ? pivLo : na
ll=pivLo and pivLo<last_pivLo ? pivLo : na
[hh, lh, hl, ll]

// Chart timeframe in minutes


f_chartTfInMinutes()=> float
_resInMinutes=timeframe.multiplier*(timeframe.isseconds ? 1 : timeframe.isminutes ?
1. : timeframe.isdaily ? 60.*24 : timeframe.isweekly ? 60.*24*7 :
timeframe.ismonthly ? 60.*24*30.4375 : na)

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

// Wave trend
wavetrend(src, chlLen, avgLen)=>
esa=ta.ema(src, chlLen)
d=ta.ema(math.abs(src-esa), chlLen)
ci=(src-esa)/(0.015*d)
wt1=ta.ema(ci, avgLen)
wt2=ta.sma(wt1, 3)
[wt1, wt2]

// Fractal functions
f_top_fractal(_src)=> _src[4]<_src[2] and _src[3]<_src[2] and _src[2]>_src[1] and
_src[2]>_src[0]
f_bot_fractal(_src)=> _src[4]>_src[2] and _src[3]>_src[2] and _src[2]<_src[1] and
_src[2]<_src[0]
f_fractalize(_src)=> top_fractal=f_top_fractal(_src) ? 1 : f_bot_fractal(_src) ? -1
: 0

// Find divergences
f_findDivs(src, topLimit, botLimit)=>
fractalTop=f_fractalize(src)>0 and src[2]>=topLimit ? src[2] : na
fractalBot=f_fractalize(src)<0 and src[2]<=botLimit ? src[2] : na
highPrev=ta.valuewhen(fractalTop, src[2], 0)[2]
highPrice=ta.valuewhen(fractalTop, high[2], 0)[2]
lowPrev=ta.valuewhen(fractalBot, src[2], 0)[2]
lowPrice=ta.valuewhen(fractalBot, low[2], 0)[2]
bearSignal=fractalTop and high[1]>highPrice and src[1]<highPrev
bullSignal=fractalBot and low[1]<lowPrice and src[1]>lowPrev
[bearSignal, bullSignal]

// MA variant
variant(type, src, len, offSig, offALMA)=>
v1=ta.sma(src, len)
v2=ta.ema(src, len)
v3=2*v2-ta.ema(v2, len)
v4=3*(v2-ta.ema(v2, len))+ta.ema(ta.ema(v2, len), len)
v5=ta.wma(src, len)
v6=ta.vwma(src, len)
v7=0.0
sma_1=ta.sma(src, len)
v7:=na(v7[1]) ? sma_1 : (v7[1]*(len-1)+src)/len
v8=ta.wma(2*ta.wma(src, len/2)-ta.wma(src, len), math.round(math.sqrt(len)))
v9=ta.linreg(src, len, offSig)
v10=ta.alma(src, len, offALMA, offSig)
v11=ta.sma(v1, len)
a1=math.exp(-1.414*3.14159/len)
b1=2*a1*math.cos(1.414*3.14159/len)
c2=b1
c3=-a1*a1
c1=1-c2-c3
v12=0.0
v12:=c1*(src+nz(src[1]))/2+c2*nz(v12[1])+c3*nz(v12[2])
type=='EMA' ? v2 : type=='DEMA' ? v3 : type=='TEMA' ? v4 : type=='WMA' ? v5 :
type=='VWMA' ? v6 : type=='SMMA' ? v7 : type=='HullMA' ? v8 : type=='LSMA' ? v9 :
type=='ALMA' ? v10 : type=='TMA' ? v11 : type=='SSMA' ? v12 : v1

// Security wrapper
reso(exp, use, res)=> use ? request.security(syminfo.tickerid, res, exp,
gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on) : exp

// Take profit calculation


f_tp(_condition, _conditionValue, _leTrigger, _seTrigger, _src, _lxLvlTP,
_sxLvlTP)=>
var float _tpLine=0.0
_topLvl=_src+(_src*(_lxLvlTP/100))
_botLvl=_src-(_src*(_sxLvlTP/100))
_tpLine:=_condition[1]!=_conditionValue and _leTrigger ? _topLvl :
_condition[1]!=-_conditionValue and _seTrigger ? _botLvl : nz(_tpLine[1])
[_tpLine]

// Cross detection
f_cross(_scr1, _scr2, _over)=> _over ? _scr1>_scr2 and _scr1[1]<_scr2[1] :
_scr1<_scr2 and _scr1[1]>_scr2[1]

// Queue and dequeue


f_qDq(_array, _val)=>
array.push(_array, _val)
array.shift(_array)

// === CALCULATIONS ===

// Source selection
src=h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period,
close, lookahead=barmerge.lookahead_off) : close

// ATR
atrValue=ta.atr(50)
// Swing highs/lows
swing_high=ta.pivothigh(high, swing_length, swing_length)
swing_low=ta.pivotlow(low, swing_length, swing_length)

// Arrays
var swing_high_values=array.new_float(5, 0.00)
var swing_low_values=array.new_float(5, 0.00)
var swing_high_bns=array.new_int(5, 0)
var swing_low_bns=array.new_int(5, 0)
var current_supply_box=array.new_box(history_of_demand_to_keep, na)
var current_demand_box=array.new_box(history_of_demand_to_keep, na)
var current_supply_poi=array.new_box(history_of_demand_to_keep, na)
var current_demand_poi=array.new_box(history_of_demand_to_keep, na)
var supply_bos=array.new_box(5, na)
var demand_bos=array.new_box(5, na)

// Handle new swing highs


if not na(swing_high)
f_array_add_pop(swing_high_values, swing_high)
f_array_add_pop(swing_high_bns, bar_index[swing_length])
if show_price_action_labels
f_sh_sl_labels(swing_high_values, 1)
f_supply_demand(swing_high_values, swing_high_bns, current_supply_box,
current_supply_poi, 1, atrValue)

// Handle new swing lows


else if not na(swing_low)
f_array_add_pop(swing_low_values, swing_low)
f_array_add_pop(swing_low_bns, bar_index[swing_length])
if show_price_action_labels
f_sh_sl_labels(swing_low_values, -1)
f_supply_demand(swing_low_values, swing_low_bns, current_demand_box,
current_demand_poi, -1, atrValue)

// Update supply/demand to BOS


f_sd_to_bos(current_supply_box, supply_bos, current_supply_poi, 1)
f_sd_to_bos(current_demand_box, demand_bos, current_demand_poi, -1)

// Extend box endpoints


f_extend_box_endpoint(current_supply_box)
f_extend_box_endpoint(current_demand_box)

// Support/Resistance calculations
rb=10
prd=284
ChannelW=10
label_loc=55
style=lineStyle=="Solid" ? line.style_solid : lineStyle=="Dotted" ?
line.style_dotted : line.style_dashed
ph=ta.pivothigh(rb, rb)
pl=ta.pivotlow(rb, rb)
sr_levels=array.new_float(21, na)
prdhighest=ta.highest(prd)
prdlowest=ta.lowest(prd)
cwidth=percWidth(prd, ChannelW)
zonePerc=percWidth(300, zoneWidth)
aas=array.new_bool(41, true)
u1=0.0, u1:=nz(u1[1])
d1=0.0, d1:=nz(d1[1])
highestph=0.0, highestph:=highestph[1]
lowestpl=0.0, lowestpl:=lowestpl[1]
var sr_levs=array.new_float(21, na)
label hlabel=na, label.delete(hlabel[1])
label llabel=na, label.delete(llabel[1])
var sr_lines=array.new_line(21, na)
var sr_linesH=array.new_line(21, na)
var sr_linesL=array.new_line(21, na)
var sr_linesF=array.new_linefill(21, na)
var sr_labels=array.new_label(21, na)

if (not na(ph) or not na(pl))


for x=0 to array.size(sr_levels)-1
array.set(sr_levels, x, na)
highestph:=prdlowest
lowestpl:=prdhighest
countpp=0
for x=0 to prd
if na(close[x])
break
if not na(ph[x]) or not na(pl[x])
highestph:=math.max(highestph, nz(ph[x], prdlowest), nz(pl[x],
prdlowest))
lowestpl:=math.min(lowestpl, nz(ph[x], prdhighest), nz(pl[x],
prdhighest))
countpp+=1
if countpp>40
break
if array.get(aas, countpp)
upl=(not na(ph[x]) and (ph[x]!=0) ? high[x+rb] : low[x+rb])+cwidth
dnl=(not na(ph[x]) and (ph[x]!=0) ? high[x+rb] : low[x+rb])-cwidth
u1:=countpp==1 ? upl : u1
d1:=countpp==1 ? dnl : d1
tmp=array.new_bool(41, true)
cnt=0
tpoint=0
for xx=0 to prd
if na(close[xx])
break
if not na(ph[xx]) or not na(pl[xx])
chg=false
cnt+=1
if cnt>40
break
if array.get(aas, cnt)
if not na(ph[xx])
if high[xx+rb]<=upl and high[xx+rb]>=dnl
tpoint+=1
chg:=true
if not na(pl[xx])
if low[xx+rb]<=upl and low[xx+rb]>=dnl
tpoint+=1
chg:=true
if chg and cnt<41
array.set(tmp, cnt, false)
if tpoint>=strengthSR
for g=0 to 40 by 1
if not array.get(tmp, g)
array.set(aas, g, false)
if (not na(ph[x]) and countpp<21)
array.set(sr_levels, countpp, high[x+rb])
if (not na(pl[x]) and countpp<21)
array.set(sr_levels, countpp, low[x+rb])

// Plot S/R
var line highest_=na, line.delete(highest_)
var line lowest_=na, line.delete(lowest_)
var line highest_fill1=na, line.delete(highest_fill1)
var line highest_fill2=na, line.delete(highest_fill2)
var line lowest_fill1=na, line.delete(lowest_fill1)
var line lowest_fill2=na, line.delete(lowest_fill2)
hi_col=close>=highestph ? colorSup : colorRes
lo_col=close>=lowestpl ? colorSup : colorRes

if enableSR
highest_:=line.new(bar_index-311, highestph, bar_index, highestph,
xloc.bar_index, expandSR ? extend.both : extend.right, hi_col, style, lineWidth)
lowest_:=line.new(bar_index-311, lowestpl, bar_index, lowestpl, xloc.bar_index,
expandSR ? extend.both : extend.right, lo_col, style, lineWidth)
if useHLZones
highest_fill1:=line.new(bar_index-311, highestph+zonePerc, bar_index,
highestph+zonePerc, xloc.bar_index, expandSR ? extend.both : extend.right, na)
highest_fill2:=line.new(bar_index-311, highestph-zonePerc, bar_index,
highestph-zonePerc, xloc.bar_index, expandSR ? extend.both : extend.right, na)
lowest_fill1:=line.new(bar_index-311, lowestpl+zonePerc, bar_index,
lowestpl+zonePerc, xloc.bar_index, expandSR ? extend.both : extend.right, na)
lowest_fill2:=line.new(bar_index-311, lowestpl-zonePerc, bar_index,
lowestpl-zonePerc, xloc.bar_index, expandSR ? extend.both : extend.right, na)
linefill.new(highest_fill1, highest_fill2, hi_col)
linefill.new(lowest_fill1, lowest_fill2, lo_col)

if (not na(ph) or not na(pl))


for x=0 to array.size(sr_lines)-1
array.set(sr_levs, x, array.get(sr_levels, x))
for x=0 to array.size(sr_lines)-1
line.delete(array.get(sr_lines, x))
line.delete(array.get(sr_linesH, x))
line.delete(array.get(sr_linesL, x))
linefill.delete(array.get(sr_linesF, x))
if (not na(array.get(sr_levs, x)) and enableSR)
line_col=close>=array.get(sr_levs, x) ? colorSup : colorRes
array.set(sr_lines, x, line.new(bar_index-355, array.get(sr_levs, x),
bar_index, array.get(sr_levs, x), xloc.bar_index, expandSR ? extend.both :
extend.right, line_col, style, lineWidth))
if useZones
array.set(sr_linesH, x, line.new(bar_index-355, array.get(sr_levs,
x)+zonePerc, bar_index, array.get(sr_levs, x)+zonePerc, xloc.bar_index, expandSR ?
extend.both : extend.right, na))
array.set(sr_linesL, x, line.new(bar_index-355, array.get(sr_levs,
x)-zonePerc, bar_index, array.get(sr_levs, x)-zonePerc, xloc.bar_index, expandSR ?
extend.both : extend.right, na))
array.set(sr_linesF, x, linefill.new(array.get(sr_linesH, x),
array.get(sr_linesL, x), line_col))
for x=0 to array.size(sr_labels)-1
label.delete(array.get(sr_labels, x))
if (not na(array.get(sr_levs, x)) and enableSR)
lab_loc=close>=array.get(sr_levs, x) ? label.style_label_up :
label.style_label_down
lab_col=close>=array.get(sr_levs, x) ? colorSup : colorRes
array.set(sr_labels, x, label.new(bar_index+label_loc,
array.get(sr_levs, x), str.tostring(math.round_to_mintick(array.get(sr_levs, x))),
color=lab_col, textcolor=#000000, style=lab_loc))
hlabel:=enableSR ?
label.new(bar_index+label_loc+math.round(math.sign(label_loc))*20, highestph, "High
Level : "+str.tostring(highestph), color=hi_col, textcolor=#000000,
style=label.style_label_down) : na
llabel:=enableSR ?
label.new(bar_index+label_loc+math.round(math.sign(label_loc))*20, lowestpl, "Low
Level : "+str.tostring(lowestpl), color=lo_col, textcolor=#000000,
style=label.style_label_up) : na

// RSI
rsi=ta.rsi(close, 28)
rsiOb=rsi>65 and rsi>ta.ema(rsi, 10)
rsiOs=rsi<35 and rsi<ta.ema(rsi, 10)

// Daily data
dHigh=securityNoRep(syminfo.tickerid, "D", high[1])
dLow=securityNoRep(syminfo.tickerid, "D", low[1])
dClose=securityNoRep(syminfo.tickerid, "D", close[1])

// EMA
ema=ta.ema(close, 144)
emaBull=close>ema

// Series setup
stratRes=timeframe.ismonthly ? str.tostring(timeframe.multiplier*intRes, '###M') :
timeframe.isweekly ? str.tostring(timeframe.multiplier*intRes, '###W') :
timeframe.isdaily ? str.tostring(timeframe.multiplier*intRes, '###D') :
timeframe.isintraday ? str.tostring(timeframe.multiplier*intRes, '####') : '60'
closeSeries=variant(basisType, close[delayOffset], basisLen, offsetSigma,
offsetALMA)
openSeries=variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)
closeSeriesAlt=reso(closeSeries, useRes, stratRes)
openSeriesAlt=reso(openSeries, useRes, stratRes)

// Triggers
lxTrigger=false
sxTrigger=false
leTrigger=ta.crossover(closeSeriesAlt, openSeriesAlt)
seTrigger=ta.crossunder(closeSeriesAlt, openSeriesAlt)

// === RISK MANAGEMENT ===

// Initial values
var float condition=0.0
var float slLine=0.0
var float entryLine=0.0

// Entry & exit orders


entryLine:=leTrigger and condition[1]<=0.0 ? close : seTrigger and
condition[1]>=0.0 ? close : nz(entryLine[1])

// Stop Loss
slTopLvl=close+(close*(i_lxLvlSL/100))
slBotLvl=close-(close*(i_sxLvlSL/100))
slLine:=condition[1]<=0.0 and leTrigger ? slBotLvl : condition[1]>=0.0 and
seTrigger ? slTopLvl : nz(slLine[1])
slLong=f_cross(low, slLine, false)
slShort=f_cross(high, slLine, true)

// Take Profits
[tp3Line]=f_tp(condition, 1.2, leTrigger, seTrigger, close, i_lxLvlTP3, i_sxLvlTP3)
[tp2Line]=f_tp(condition, 1.1, leTrigger, seTrigger, close, i_lxLvlTP2, i_sxLvlTP2)
[tp1Line]=f_tp(condition, 1.0, leTrigger, seTrigger, close, i_lxLvlTP1, i_sxLvlTP1)
tp3Long=f_cross(high, tp3Line, true)
tp3Short=f_cross(low, tp3Line, false)
tp2Long=f_cross(high, tp2Line, true)
tp2Short=f_cross(low, tp2Line, false)
tp1Long=f_cross(high, tp1Line, true)
tp1Short=f_cross(low, tp1Line, false)

// Condition state machine


switch
leTrigger and condition[1]<=0.0 => condition:=1.0
seTrigger and condition[1]>=0.0 => condition:=-1.0
tp3Long and condition[1]==1.2 => condition:=1.3
tp3Short and condition[1]==-1.2 => condition:=-1.3
tp2Long and condition[1]==1.1 => condition:=1.2
tp2Short and condition[1]==-1.1 => condition:=-1.2
tp1Long and condition[1]==1.0 => condition:=1.1
tp1Short and condition[1]==-1.0 => condition:=-1.1
slLong and condition[1]>=1.0 => condition:=0.0
slShort and condition[1]<=-1.0 => condition:=0.0
lxTrigger and condition[1]>=1.0 => condition:=0.0
sxTrigger and condition[1]<=-1.0 => condition:=0.0

// Trade signals
longE=leTrigger and condition[1]<=0.0 and condition==1.0 and (tradeType=='LONG' or
tradeType=='BOTH')
shortE=seTrigger and condition[1]>=0.0 and condition==-1.0 and (tradeType=='SHORT'
or tradeType=='BOTH')
longX=lxTrigger and condition[1]>=1.0 and condition==0.0
shortX=sxTrigger and condition[1]<=-1.0 and condition==0.0
longSL=slLong and condition[1]>=1.0 and condition==0.0
shortSL=slShort and condition[1]<=-1.0 and condition==0.0
longTP3=tp3Long and condition[1]==1.2 and condition==1.3
shortTP3=tp3Short and condition[1]==-1.2 and condition==-1.3
longTP2=tp2Long and condition[1]==1.1 and condition==1.2
shortTP2=tp2Short and condition[1]==-1.1 and condition==-1.2
longTP1=tp1Long and condition[1]==1.0 and condition==1.1
shortTP1=tp1Short and condition[1]==-1.0 and condition==-1.1

// === VISUALS ===

// Plot lines
c_tp=leTrigger or seTrigger ? na : condition==0.0 ? na : color.green
c_entry=leTrigger or seTrigger ? na : condition==0.0 ? na : color.blue
c_sl=leTrigger or seTrigger ? na : condition==0.0 ? na : color.red

p_tp1Line=plot(condition==1.0 or condition==-1.0 ? tp1Line : na, title="TP Line 1",


color=c_tp, linewidth=1, style=plot.style_linebr)
p_tp2Line=plot(condition==1.0 or condition==-1.0 or condition==1.1 or condition==-
1.1 ? tp2Line : na, title="TP Line 2", color=c_tp, linewidth=1,
style=plot.style_linebr)
p_tp3Line=plot(condition==1.0 or condition==-1.0 or condition==1.1 or condition==-
1.1 or condition==1.2 or condition==-1.2 ? tp3Line : na, title="TP Line 3",
color=c_tp, linewidth=1, style=plot.style_linebr)
p_entryLine=plot(condition>=1.0 or condition<=-1.0 ? entryLine : na, title="Entry
Line", color=c_entry, linewidth=1, style=plot.style_linebr)
p_slLine=plot(condition>=1.0 or condition<=-1.0 ? slLine : na, title="SL Line",
color=c_sl, linewidth=1, style=plot.style_linebr)

// Fill plots
fill(p_entryLine, p_tp1Line, color=color.new(color.green, 80), title="Profit Zone")
fill(p_entryLine, p_slLine, color=color.new(color.red, 80), title="Loss Zone")

// Bar coloring
barcolor(i_barColOn and scolor ? condition>0 ? color.green : condition<0 ?
color.red : na : na)

// Plot shapes
plotshape(i_alertOn and longE, title="Long Entry", style=shape.triangleup,
location=location.belowbar, color=color.green, size=size.tiny, text="Long")
plotshape(i_alertOn and shortE, title="Short Entry", style=shape.triangledown,
location=location.abovebar, color=color.red, size=size.tiny, text="Short")
plotshape(i_alertOn and longTP1, title="Long TP1", style=shape.circle,
location=location.abovebar, color=color.green, size=size.tiny, text="TP1")
plotshape(i_alertOn and longTP2, title="Long TP2", style=shape.circle,
location=location.abovebar, color=color.green, size=size.tiny, text="TP2")
plotshape(i_alertOn and longTP3, title="Long TP3", style=shape.circle,
location=location.abovebar, color=color.green, size=size.tiny, text="TP3")
plotshape(i_alertOn and shortTP1, title="Short TP1", style=shape.circle,
location=location.belowbar, color=color.red, size=size.tiny, text="TP1")
plotshape(i_alertOn and shortTP2, title="Short TP2", style=shape.circle,
location=location.belowbar, color=color.red, size=size.tiny, text="TP2")
plotshape(i_alertOn and shortTP3, title="Short TP3", style=shape.circle,
location=location.belowbar, color=color.red, size=size.tiny, text="TP3")
plotshape(i_alertOn and longSL, title="Long SL", style=shape.xcross,
location=location.belowbar, color=color.red, size=size.tiny, text="SL")
plotshape(i_alertOn and shortSL, title="Short SL", style=shape.xcross,
location=location.abovebar, color=color.red, size=size.tiny, text="SL")
plotshape(i_alertOn and longX, title="Long Exit", style=shape.square,
location=location.belowbar, color=color.blue, size=size.tiny, text="Close")
plotshape(i_alertOn and shortX, title="Short Exit", style=shape.square,
location=location.abovebar, color=color.blue, size=size.tiny, text="Close")

// === ALERTS ===


alertcondition(longE, title="Long Entry", message="Long Entry Signal")
alertcondition(shortE, title="Short Entry", message="Short Entry Signal")
alertcondition(longTP1, title="Long TP1", message="Long TP1 Hit")
alertcondition(longTP2, title="Long TP2", message="Long TP2 Hit")
alertcondition(longTP3, title="Long TP3", message="Long TP3 Hit")
alertcondition(shortTP1, title="Short TP1", message="Short TP1 Hit")
alertcondition(shortTP2, title="Short TP2", message="Short TP2 Hit")
alertcondition(shortTP3, title="Short TP3", message="Short TP3 Hit")
alertcondition(longSL, title="Long SL", message="Long SL Hit")
alertcondition(shortSL, title="Short SL", message="Short SL Hit")
alertcondition(longX, title="Long Exit", message="Long Exit Signal")
alertcondition(shortX, title="Short Exit", message="Short Exit Signal")

You might also like