//@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")