Indicator · Pine Script v5 · On the chart

Premium 3

by Abishek-Tharu99· code credited to hackerheaven73

A multi-tool overlay indicator on the price chart.

View on GitHub

Repaints

GitHub stars1on the repository
Pine versionv5runs as is
Lines of code1,245
Settings40inputs
LicenceNone statedfile: MPL-2.0
Last update1 year ago31 Jul 2025

Add It to Your TradingView Chart

  1. 1Copy the scriptPress Copy script above, or the copy button on the code below.
  2. 2Open the Pine EditorOpen a TradingView chart and choose Pine Editor at the bottom of the screen.
  3. 3Paste over the templateCreate a new indicator, select all of the template text and paste. Press Save and give it a name.
  4. 4Add it to the chartPress Add to chart, then adjust the settings with the gear icon next to its name.

Source Code

1,245 lines of Pine Script v5 from Tradingview_Indicator.txt, published under MPL-2.0 (file header). Keep the author's credit and licence lines when you reuse it.

Tradingview_Indicator.txt
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © hackerheaven73

//@version=5
indicator("Premium 3", overlay=true, max_labels_count=500, max_lines_count=500, max_boxes_count=500, max_bars_back=5000)

// User Input
c_title = color.new(color.orange, 50)
s_title = 'large'
a_title = 'center'
c_subtitle = color.new(color.orange, 50)
s_subtitle = 'normal'
a_subtitle = 'center'
c_symInfo = color.new(color.orange, 50)
s_symInfo = 'normal'
a_symInfo = 'center'
c_bg = color.new(color.blue, 100) 

showReversal      = input(true, "Buy/Sell", group="REVERSAL INDICATORS", inline = 'rev1', tooltip = "use ONLY in confluence with any of the price action tools listed below")
colorBuy          = input.color(#11ff0099, '', group="REVERSAL INDICATORS", inline= 'rev1')
colorSell         = input.color(#e94d1eb6, '', group="REVERSAL INDICATORS", inline= 'rev1')
obos              = input(true, "O.S/O.B", group="REVERSAL INDICATORS", inline = 'rev2')
colorOs           = input.color(#1aff0048, '', group="REVERSAL INDICATORS", inline= 'rev2')
colorOb           = input.color(#e91e1e48, '', group="REVERSAL INDICATORS", inline= 'rev2')
showRibbon        = input(true, "Trend Ribbon", group="REVERSAL INDICATORS")
uptrend           = input(#00ff0466, "Uptrend", group="REVERSAL INDICATORS")
downtrend         = input(#e91e1e66, "Downtrend", group="REVERSAL INDICATORS")
showRevBands      = input(false, "Reversal Bands", group="REVERSAL INDICATORS")
colorupperband    = input(#e91e1e3b, "Upper Bands", group="REVERSAL INDICATORS")
colorlowerband    = input(#73ff0033, "Lower Bands", group="REVERSAL INDICATORS")

showEmas          = input(false, "Moving Average S/R", group="SUPPORT & RESISTANCE")
colorEma1         = input(#eaeaea40, "Moving Average 1", group="SUPPORT & RESISTANCE")
colorEma2         = input(#3c00ffa4, "Moving Average 2", group="SUPPORT & RESISTANCE")
colorEma3         = input(#e91e62e9, "Moving Average 3", group="SUPPORT & RESISTANCE")

currentTF         = input.bool(false, title = "Liquidity Levels", group="SUPPORT & RESISTANCE")
lowLineColorHTF   = input.color(#23f71450, "Bullish", group="SUPPORT & RESISTANCE")
highLineColorHTF  = input.color(#fb0f0f50, "Bearish", group="SUPPORT & RESISTANCE")
htfTF             = input.timeframe("240", title = "Timeframe", group="SUPPORT & RESISTANCE")

show_fvg          = input(false, 'Fair Value Gaps', group="SUPPORT & RESISTANCE")
i_mtfbearishfvgcolor = input.color(#22eb07, "Bullish", group="SUPPORT & RESISTANCE")
i_mtfbullishfvgcolor = input.color(#f40909, "Bearish", group="SUPPORT & RESISTANCE")
i_tf              = input.timeframe("240", "Timeframe", group="SUPPORT & RESISTANCE")

autofib           = input(true, "Auto Golden Pocket", group="SUPPORT & RESISTANCE")
colorAll          = input.color(#D1B000, "Color", group="SUPPORT & RESISTANCE")
timeframe         = input.timeframe(defval = '240', group="SUPPORT & RESISTANCE")

showVP            = input(true, "Volume Profile", group="SUPPORT & RESISTANCE")
vp_bar_color      = input(defval=color.new(color.gray, 60), title='Volume Bars')
vp_poc_color      = input(defval=#eaeaea, title='Point of Control')

showms            = input(false,title="ChoCH & BoS", group = "MARKET STRUCTURE")
bosColor1         = input.color(#0097a7 , 'Bullish', group = "MARKET STRUCTURE")
bosColor2         = input.color(#c2185b , 'Bearish', group = "MARKET STRUCTURE")
showGann          = input(false, 'Gann Swing (One Bar Key Pivot Points)', group = "MARKET STRUCTURE")
colorGann         = input(#ff7f50, 'Swing Line', group = "MARKET STRUCTURE")

showDashboard     = input(true, "Enable", group = "TREND DASHBOARD")
tableTextColor    = input(color.white, "Text", group = "TREND DASHBOARD")
tableBgColor      = input(#13172232, "Background", group = "TREND DASHBOARD")

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

rngfilt(x, r) =>
    rngf = x
    rngf := x > nz(rngf[1]) ? x - r < nz(rngf[1]) ? nz(rngf[1]) : x - r : x + r > nz(rngf[1]) ? nz(rngf[1]) : x + r

percWidth(len, perc) => (ta.highest(len) - ta.lowest(len)) * perc / 100
securityNoRep(sym, res, src) => request.security(sym, res, src, barmerge.gaps_off, barmerge.lookahead_on)

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

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

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]

// Components
source    = close
smrng1    = smoothrng(source, 27, 1.5)
smrng     = (smrng1)
filt      = rngfilt(source, smrng)
up        = 0.0, up := filt > filt[1] ? nz(up[1]) + 1 : filt < filt[1] ? 0 : nz(up[1])
dn        = 0.0, dn := filt < filt[1] ? nz(dn[1]) + 1 : filt > filt[1] ? 0 : nz(dn[1])
bullCond  = bool(na), bullCond := source > filt and source > source[1] and up > 0 or source > filt and source < source[1] and up > 0
bearCond  = bool(na), bearCond := source < filt and source < source[1] and dn > 0 or source < filt and source > source[1] and dn > 0
lastCond  = 0, lastCond := bullCond ? 1 : bearCond ? -1 : lastCond[1]
bull      = bullCond and lastCond[1] == -1
bear      = bearCond and lastCond[1] == 1
countBull = ta.barssince(bull)
countBear = ta.barssince(bear)
trigger   = nz(countBull, bar_index) < nz(countBear, bar_index) ? 1 : 0
ribbon1   = ta.ema(hlc3, 8)
ribbon2   = ta.ema(hlc3, 13)
rsi       = ta.rsi(hlc3, 21)
rsiOb     = rsi > 70 and rsi > ta.ema(rsi, 13)
rsiOs     = rsi < 30 and rsi < ta.ema(rsi, 13)
ema1      = ta.ema(hlc3, 21)
ema2      = ta.ema(hlc3, 34)
ema3      = ta.ema(hlc3, 55)
ema = ta.ema(hlc3, 21)
emaBull = close > ema

[diplus, diminus, adx] = ta.dmi(21, 13)
adxstrong= adx > 21

equal_tf(res) => str.tonumber(res) == f_chartTfInMinutes() and not timeframe.isseconds
higher_tf(res) => str.tonumber(res) > f_chartTfInMinutes() or timeframe.isseconds
too_small_tf(res) => (timeframe.isweekly and res=="1") or (timeframe.ismonthly and str.tonumber(res) < 10)

securityNoRep1(sym, res, src) =>
    bool bull_ = false
    bull_ := na
    bull_ := equal_tf(res) ? src : bull_
    bull_ := higher_tf(res) ? request.security(sym, res, src, barmerge.gaps_off, barmerge.lookahead_on) : bull_
    bull_array = request.security_lower_tf(syminfo.tickerid, higher_tf(res) ? str.tostring(f_chartTfInMinutes()) + (timeframe.isseconds ? "S" : "") : too_small_tf(res) ? (timeframe.isweekly ? "3" : "10") : res, src)
    if array.size(bull_array) > 1 and not equal_tf(res) and not higher_tf(res)
        bull_ := array.pop(bull_array)
    array.clear(bull_array)
    bull_

TF5Bull   = securityNoRep1(syminfo.tickerid, "5"  , emaBull)
TF15Bull  = securityNoRep1(syminfo.tickerid, "15" , emaBull)
TF30Bull  = securityNoRep1(syminfo.tickerid, "30" , emaBull)
TF60Bull  = securityNoRep1(syminfo.tickerid, "60" , emaBull)
TF240Bull = securityNoRep1(syminfo.tickerid, "240", emaBull)                                                                     
TFDBull   = securityNoRep1(syminfo.tickerid, "1440", emaBull)

TF5Strong   = securityNoRep1(syminfo.tickerid, "5"  , adxstrong)
TF15Strong  = securityNoRep1(syminfo.tickerid, "15" , adxstrong)
TF30Strong  = securityNoRep1(syminfo.tickerid, "30" , adxstrong)
TF60Strong  = securityNoRep1(syminfo.tickerid, "60" , adxstrong)
TF240Strong = securityNoRep1(syminfo.tickerid, "240", adxstrong)
TFDStrong   = securityNoRep1(syminfo.tickerid, "1440", adxstrong)

[upperKC1, lowerKC1] = f_kc(close, 55, 3)
[upperKC2, lowerKC2] = f_kc(close, 55, 4)
[upperKC3, lowerKC3] = f_kc(close, 55, 5)
[upperKC4, lowerKC4] = f_kc(close, 55, 6)
[wt1, wt2] = wavetrend(hlc3, 13, 21)

cyan = #00dbff
pink = #e91e63

plotshape(showReversal and ta.crossover(wt1, wt2) and wt2 <= -55, "Reversal Buy" , shape.labelup, location.belowbar, color = colorBuy, size=size.small)
plotshape(showReversal and ta.crossunder(wt1, wt2) and wt2 >= 55, "Reversal Sell", shape.labeldown, location.abovebar, color = colorSell, size=size.small)
plotshape(showReversal and rsiOs, "Oversold" , shape.diamond, location.belowbar, color = colorOs, size=size.tiny)
plotshape(showReversal and rsiOb, "Overbought", shape.diamond, location.abovebar, color = colorOb, size=size.tiny)
plot(showEmas ? ema1 : na, "Moving Average 1", colorEma1, 2)
plot(showEmas ? ema2 : na, "Moving Average 2", colorEma2, 2)
plot(showEmas ? ema3 : na, "Moving Average 3", colorEma3, 2)

// Dashboard
var dashboard_loc  = position.top_right
var dashboard_size = size.small
var dashboard      = showDashboard ? table.new(dashboard_loc, 3, 15, tableBgColor, #000000, 2, tableBgColor, 1) : na
dashboard_cell(column, row, txt, signal=false) =>
    table.cell(dashboard, column, row, txt, 0, 0, signal ? #000000 : tableTextColor, text_size=dashboard_size)
dashboard_cell_bg(column, row, col) =>
    table.cell_set_bgcolor(dashboard, column, row, col)

if barstate.islast and showDashboard
    dashboard_cell(0, 0, "Timeframe")
    dashboard_cell(0, 1, "Chart")
    dashboard_cell(0, 2, "5 min")
    dashboard_cell(0, 3, "15 min")
    dashboard_cell(0, 4, "30 min")
    dashboard_cell(0, 5, "1H")
    dashboard_cell(0, 6, "4H")
    dashboard_cell(0, 7, "Daily")

    dashboard_cell(1, 0, "Bias")
    dashboard_cell(1, 1, emaBull ? "BULL" : "BEAR", true)
    dashboard_cell_bg(1, 1, emaBull ? color.green : color.red)
    dashboard_cell(1, 2, TF5Bull ? "BULL" : "BEAR", true)
    dashboard_cell_bg(1, 2, TF5Bull ? color.green : color.red)
    dashboard_cell(1, 3, TF15Bull ? "BULL" : "BEAR", true)
    dashboard_cell_bg(1, 3, TF15Bull ? color.green : color.red)
    dashboard_cell(1, 4, TF30Bull ? "BULL" : "BEAR", true)
    dashboard_cell_bg(1, 4, TF30Bull ? color.green : color.red)
    dashboard_cell(1, 5, TF60Bull ? "BULL" : "BEAR", true)
    dashboard_cell_bg(1, 5, TF60Bull ? color.green : color.red)
    dashboard_cell(1, 6, TF240Bull ? "BULL" : "BEAR", true)
    dashboard_cell_bg(1, 6, TF240Bull ? color.green : color.red)
    dashboard_cell(1, 7, TFDBull ? "BULL" : "BEAR", true)
    dashboard_cell_bg(1, 7, TFDBull ? color.green : color.red)

    dashboard_cell(2, 0, "Strength")
    dashboard_cell(2, 1, adxstrong ? "STRONG" : "WEAK", true)
    dashboard_cell_bg(2, 1, adxstrong ? color.green : color.red)
    dashboard_cell(2, 2, TF5Strong ? "STRONG" : "WEAK", true)
    dashboard_cell_bg(2, 2, TF5Strong ? color.green : color.red)
    dashboard_cell(2, 3, TF15Strong ? "STRONG" : "WEAK", true)
    dashboard_cell_bg(2, 3, TF15Strong ? color.green : color.red)
    dashboard_cell(2, 4, TF30Strong ? "STRONG" : "WEAK", true)
    dashboard_cell_bg(2, 4, TF30Strong ? color.green : color.red)
    dashboard_cell(2, 5, TF60Strong ? "STRONG" : "WEAK", true)
    dashboard_cell_bg(2, 5, TF60Strong ? color.green : color.red)
    dashboard_cell(2, 6, TF240Strong ? "STRONG" : "WEAK", true)
    dashboard_cell_bg(2, 6, TF240Strong ? color.green : color.red)
    dashboard_cell(2, 7, TFDStrong ? "STRONG" : "WEAK", true)
    dashboard_cell_bg(2, 7, TFDStrong ? color.green : color.red)
                                
                                
plot(showRevBands ? upperKC1 : na, "Upper Reversal Band 1", colorupperband)
plot(showRevBands ? upperKC2 : na, "Upper Reversal Band 2", colorupperband)
plot(showRevBands ? upperKC3 : na, "Upper Reversal Band 3", colorupperband)
plot(showRevBands ? upperKC4 : na, "Upper Reversal Band 4", colorupperband)
plot(showRevBands ? lowerKC1 : na, "Lower Reversal Band 1", colorlowerband)
plot(showRevBands ? lowerKC2 : na, "Lower Reversal Band 2", colorlowerband)
plot(showRevBands ? lowerKC3 : na, "Lower Reversal Band 3", colorlowerband)                                                              
plot(showRevBands ? lowerKC4 : na, "Lower Reversal Band 4", colorlowerband)

fill(plot(showRibbon ? ribbon1 : na, "", na, editable=false), plot(showRibbon ? ribbon2 : na, "", na, editable=false), ribbon1 > ribbon2 ? uptrend : downtrend)

// === ALERTS ===
alert01 = ta.crossover(wt1, wt2) and wt2 <= -55
alert02 = ta.crossunder(wt1, wt2) and wt2 >= 55

alerts(sym) =>
    if alert01 or alert02
        alert_text = alert01 ? "Buy Signal" : "Sell Signal"
        alert(alert_text, alert.freq_once_per_bar_close)
alerts(syminfo.tickerid)
// Create alert conditions for TradingView alert dialog
alertcondition(alert01, "Buy Alert", "Buy Signal, TimeFrame={{interval}}")
alertcondition(alert02, "Sell Alert", "Sell Signal, TimeFrame={{interval}}")
                                                                  

//////// MTF SUPPORT & RESISTANCE ////////

group               = "MULTI-TIMEFRAME S/R"
showSR              = input.bool(true, title = "", inline = "01", group=group)
timef               = input.timeframe("", "", inline = "01", group=group)
levels              = input.int(7 , "Levels", inline = "01", group = group)
linewidth           = input.int(1, "Width", inline = "02", group = group) * 20
supportcolor        = input.color(color.new(#00ddff, 75), "", inline = "02", group = group)
resistancecolor     = input.color(color.new(#e91e62, 75), "", inline = "02", group = group)
labelon             = input.string("On", "Label", ["On", "Off"], inline = "03", group = group)
labelsize           = input.string("Default", "Size", ["Small", "Default", "Large"], inline = "03", group = group)
labelcol            = input.color(#787b86, "", inline = "03", group = group)
labelloc            = input.int(10, "Offset", inline = "04", group = group) + 30
showtimef           = input.bool(true, "Show Timeframe", inline = "04", group = group)
showtprice          = input.bool(true, "Show Price", inline = "04", group = group)


// get data on ticker based on chosen timeframe
src_c = request.security(syminfo.tickerid,timef,close, gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_off)
src_o = request.security(syminfo.tickerid,timef,open, gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_off)
f_resInMinutes() =>
    _resInMinutes = timeframe.multiplier * (timeframe.isseconds ? 1. / 60 : timeframe.isminutes ? 1. : timeframe.isdaily ? 60. * 24 : timeframe.isweekly ? 60. * 24 * 7 : timeframe.ismonthly ? 60. * 24 * 30.4375 : na)
        
f_timefResInMinutes(_res) =>
    request.security(syminfo.tickerid, _res, f_resInMinutes())
f_timefIsIntraday(_res) =>
    [intraday, daily, weekly, monthly] = request.security(syminfo.tickerid, _res, [timeframe.isintraday, timeframe.isdaily, timeframe.isweekly, timeframe.ismonthly])
    check = intraday ? "Intraday" : daily ? "Daily" : weekly ? "Weekly" : monthly ? "Monthly" : "Error" 
    check
mtimef_multiplier = int (f_timefResInMinutes(timef) / f_resInMinutes())
prd = 10
maxnumpp = 284
ChannelW = 10
min_strength = 2
prd := prd * mtimef_multiplier
float src1 = math.max(src_c, src_o) 
float src2 = math.min(src_c, src_o)
float src3 = math.max(close, open)  
float src4 = math.min(close, open)   
float ph = ta.pivothigh(src1, prd, prd)
float pl = ta.pivotlow(src2, prd, prd)
Lstyle = line.style_solid
timef_res = f_timefIsIntraday(timef)
timef_text = str.tostring(timef)
if str.tostring(timef) == ""
    timef_text := na(timeframe.multiplier / 60) ? timeframe.period : timeframe.multiplier < 60 ?  timeframe.period + " M |" : str.tostring(timeframe.multiplier / 60) + " H |"
else if timef_res == "Intraday"
    timef_text := na(str.tonumber(timef) / 60) ? str.tostring(timef) : str.tonumber(timef) < 60 ?  str.tostring(timef) + " M |" : str.tostring(str.tonumber(timef) / 60) + " H |"
else
    timef_text := str.tostring(timef)
//calculate maximum S/R channel zone width
prdhighest = request.security(syminfo.tickerid, timef, ta.highest(300))
prdlowest = request.security(syminfo.tickerid, timef, ta.lowest(300))
cwidth = (prdhighest - prdlowest) * ChannelW / 100
var pivotvals = array.new_float(0)
if (not na(ph)) or (not na(pl))
    array.unshift(pivotvals, (not na(ph)) ? ph : pl)
    //array.unshift(pivotvals, ph ? ph : pl)
    if array.size(pivotvals) > maxnumpp  // limit the array size
        array.pop(pivotvals)
get_sr_vals(ind) =>
    float lo = array.get(pivotvals, ind)
    float hi = lo
    int numpp = 0
    for y = 0 to array.size(pivotvals) - 1 by 1
        float cpp = array.get(pivotvals, y)
        float wdth = cpp <= lo ? hi - cpp : cpp - lo
        if wdth <= cwidth  // fits the max channel width?
            lo := cpp <= lo ? cpp : lo
            hi := cpp > lo ? cpp : hi
            numpp += 1                   
            numpp                       
        [hi, lo, numpp]                                                                                                   
var sr_up_level = array.new_float(0)
var sr_dn_level = array.new_float(0)
sr_strength = array.new_float(0)

find_loc(strength) =>
    ret = array.size(sr_strength)
    for i = ret > 0 ? array.size(sr_strength) - 1 : na to 0 by 1
        if strength <= array.get(sr_strength, i)
            break
        ret := i
        ret
    ret

check_sr(hi, lo, strength) =>
    ret = true
    for i = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
     //include
        if array.get(sr_up_level, i) >= lo and array.get(sr_up_level, i) <= hi or array.get(sr_dn_level, i) >= lo and array.get(sr_dn_level, i) <= hi
            if strength >= array.get(sr_strength, i)
                array.remove(sr_strength, i)
                array.remove(sr_up_level, i)
                array.remove(sr_dn_level, i)
                ret
            else
                ret := false
                ret
            break
    ret

var sr_lines = array.new_line(11, na)
var sr_labels = array.new_label(11, na)
var timef_labels = array.new_label(11, na)
if (not na(ph)) or (not na(pl))
    //because of new calculation, remove old S/R levels
    array.clear(sr_up_level)
    array.clear(sr_dn_level)
    array.clear(sr_strength)
    //find S/R zones
    for x = 0 to array.size(pivotvals) - 1 by 1
        [hi, lo, strength] = get_sr_vals(x)
        if check_sr(hi, lo, strength)
            loc = find_loc(strength)
           // if strength is in first levels sr then insert it to the arrays 
            if loc < levels and strength >= min_strength
                array.insert(sr_strength, loc, strength)
                array.insert(sr_up_level, loc, hi)
                array.insert(sr_dn_level, loc, lo)
                // keep size of the arrays = 5
                if array.size(sr_strength) > levels
                    array.pop(sr_strength)
                    array.pop(sr_up_level)
                    array.pop(sr_dn_level)

    for x = 1 to 10 by 1
        line.delete(array.get(sr_lines, x))
        label.delete(array.get(sr_labels, x))
        label.delete(array.get(timef_labels, x))

    for x = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
        float mid = math.round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2)
        if showSR
            array.set(sr_lines, x + 1, line.new(x1=bar_index, y1=mid, x2=bar_index - 1, y2=mid, extend=extend.both, color=mid >= close ? resistancecolor : supportcolor, style=Lstyle, width=linewidth))
            if labelon == "On" 
                size = labelsize == "Small" ? size.small : labelsize == "Default" ? size.normal : size.large                                                                                                                                                     
                array.set(sr_labels, x + 1, label.new(x=bar_index + labelloc, y=mid, text=(showtimef ? timef_text : na) + (showtprice ? (" " + str.tostring(mid)) : na), color=mid >= close ? #ff525200 : #00e67700, textcolor=labelcol,size = size, style=label.style_label_left))

f_crossed_over() =>
    ret = false
    for x = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
        float mid = math.round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2)
        if close[1] <= mid and close > mid
            ret := true
            ret
    ret

f_crossed_under() =>
    ret = false
    for x = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
        float mid = math.round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2)
        if close[1] >= mid and close < mid
            ret := true
            ret
    ret

alertcondition(f_crossed_over(), title= "Price Breaks Resistance", message = "Price Breaks Resistance, TimeFrame={{interval}}")
alertcondition(f_crossed_under(), title="Price Loses Support", message="Price Loses Support, TimeFrame={{interval}}")                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  

//////// GANN ONE BAR SWING ////////

styleGann = line.style_solid
var arrayXGann = array.new_int(5, na)
var arrayYGann = array.new_float(5, na)
var arrayLineGann = array.new_line()
int drawLineGann = 0

_high = request.security(syminfo.tickerid,timeframe.period,high,lookahead=barmerge.lookahead_on)
_low = request.security(syminfo.tickerid,timeframe.period,low,lookahead=barmerge.lookahead_on)
_close = request.security(syminfo.tickerid,timeframe.period,close,lookahead=barmerge.lookahead_on)
_open = request.security(syminfo.tickerid,timeframe.period,open,lookahead=barmerge.lookahead_on)

highPrev = _high
lowPrev = _low

// drawLineGann
drawLineGann := 0
if (_high[0] > highPrev[1] and _low[0] > lowPrev[1])
    if (array.get(arrayYGann,0) > array.get(arrayYGann,1))
        if (_high[0] > array.get(arrayYGann,0))
            if (_high[0] <= high)
                array.set(arrayXGann, 0, time)
            array.set(arrayYGann, 0, _high[0])
            drawLineGann := 2
    else
        array.unshift(arrayXGann,time)
        array.unshift(arrayYGann,_high[0])
        drawLineGann := 1
else if (_high[0] < highPrev[1] and _low[0] < lowPrev[1])
    if (array.get(arrayYGann,0) > array.get(arrayYGann,1))
        array.unshift(arrayXGann,time)
        array.unshift(arrayYGann,_low[0])
        drawLineGann := 1
    else
        if (_low[0] < array.get(arrayYGann,0))
            if (_low[0] >= low)
                array.set(arrayXGann, 0, time)
            array.set(arrayYGann, 0, _low[0])
            drawLineGann := 2

else if ((_high[0] >= highPrev[1] and _low[0] < lowPrev[1]) or (_high[0] > highPrev[1] and _low[0] <= lowPrev[1]))
    if (array.get(arrayYGann,0) > array.get(arrayYGann,1))
        if (_high[0] >= array.get(arrayYGann,0) and array.get(arrayYGann,1) <= _low[0])
            if (_high[0] <= high)
                array.set(arrayXGann, 0, time)
            array.set(arrayYGann, 0, _high[0])
            drawLineGann := 2
        else if (_high[0] >= array.get(arrayYGann,0) and array.get(arrayYGann,1) >= _low[0])
            if (_close < _open)
                if (_high[0] <= high)
                    array.set(arrayXGann, 0, time)
                array.set(arrayYGann, 0, _high[0])
                array.unshift(arrayXGann,time)
                array.unshift(arrayYGann,_low[0])
                drawLineGann := 3
            else
                array.unshift(arrayXGann,time)
                array.unshift(arrayYGann,_low[0])
                array.unshift(arrayXGann,time)
                array.unshift(arrayYGann,_high[0])
                drawLineGann := 4
    else if (array.get(arrayYGann,0) < array.get(arrayYGann,1))
        if (_low[0] <= array.get(arrayYGann,0) and _high[0] <= array.get(arrayYGann,1))
            if (_low[0] >= low)
                array.set(arrayXGann, 0, time)
            array.set(arrayYGann, 0, _low[0])
            drawLineGann := 2
        else if (_low[0] <= array.get(arrayYGann,0) and _high[0] >= array.get(arrayYGann,1))
            if (_close > _open)
                if (_low[0] >= low)
                    array.set(arrayXGann, 0, time)
                array.set(arrayYGann, 0, _low[0])
                array.unshift(arrayXGann,time)
                array.unshift(arrayYGann,_high[0])
                drawLineGann := 3
            else
                array.unshift(arrayXGann,time)
                array.unshift(arrayYGann,_high[0])
                array.unshift(arrayXGann,time)
                array.unshift(arrayYGann,_low[0])
                drawLineGann := 4                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
    else
        if (array.get(arrayYGann,0) >= low)
            array.set(arrayXGann, 0, time)
            drawLineGann := 2

if (showGann and timeframe.isseconds)
    if (drawLineGann == 2)
        if (array.size(arrayLineGann) > 0)
            line.set_xy2(array.get(arrayLineGann,0),array.get(arrayXGann,0),array.get(arrayYGann,0))
        else
            array.unshift(arrayLineGann,line.new(array.get(arrayXGann,1),array.get(arrayYGann,1),array.get(arrayXGann,0),array.get(arrayYGann,0), color = colorGann,xloc = xloc.bar_time,width = 1,style=line.style_solid))
    else if (drawLineGann == 1)
        array.unshift(arrayLineGann,line.new(array.get(arrayXGann,1),array.get(arrayYGann,1),array.get(arrayXGann,0),array.get(arrayYGann,0), color = colorGann,xloc = xloc.bar_time,width = 1,style=line.style_solid))
    else if (drawLineGann == 3)
        if (array.size(arrayLineGann) > 0)
            line.set_xy2(array.get(arrayLineGann,0),array.get(arrayXGann,1),array.get(arrayYGann,1))
        else
            array.unshift(arrayLineGann,line.new(array.get(arrayXGann,2),array.get(arrayYGann,2),array.get(arrayXGann,1),array.get(arrayYGann,1), color = colorGann,xloc = xloc.bar_time,width = 1,style=line.style_solid))
        array.unshift(arrayLineGann,line.new(array.get(arrayXGann,1),array.get(arrayYGann,1),array.get(arrayXGann,0),array.get(arrayYGann,0), color = colorGann,xloc = xloc.bar_time,width = 1,style=line.style_solid))
    else if (drawLineGann == 4)
        array.unshift(arrayLineGann,line.new(array.get(arrayXGann,2),array.get(arrayYGann,2),array.get(arrayXGann,1),array.get(arrayYGann,1), color = colorGann,xloc = xloc.bar_time,width = 1,style=line.style_solid))
        array.unshift(arrayLineGann,line.new(array.get(arrayXGann,1),array.get(arrayYGann,1),array.get(arrayXGann,0),array.get(arrayYGann,0), color = colorGann,xloc = xloc.bar_time,width = 1,style=line.style_solid))

//////// AUTO GOLDEN POCKET ////////
// ] —————— Vars —————— [
var float fib0500 = close
var float fib0618 = close
var float fib0650 = close

// ] —————— Find Dev Pivots —————— [
getMultiTfPivots() =>
    float ab = ta.pivothigh(2, 2)
    float cd = ta.pivotlow(2, 2)
    phBIndexS = not na(ab) ? time[2] : na
    plBIndexS = not na(cd) ? time[2] : na
    [ab, phBIndexS, cd, plBIndexS]

// get if there if Pivot High/low and their start/end times
[ab, phBIndexS, cd, plBIndexS] = request.security(syminfo.tickerid, timeframe, getMultiTfPivots(), lookahead = barmerge.lookahead_on)

// ] —————— Fibs Handles —————— [
// Get last highs/lows.
pivothigh = na(ab[1]) and not na(ab) ? ab : na
pivotlow  = na(cd[1]) and not na(cd) ? cd : na

var bool isHighLast = true
var float curPivotP = 0.0
var float lastPivotP = 0.0
var int curPivotBi = 0
var int lastPivotBi = 0

// Special case: where high & low detected at the same time.
if not na(pivothigh) and not na(pivotlow)
    lastPivotP  := isHighLast ? cd : ab
    curPivotP   := isHighLast ? ab : cd
    lastPivotBi := isHighLast ? plBIndexS : phBIndexS
    curPivotBi  := isHighLast ? phBIndexS : plBIndexS
else
    isHighLast := not na(pivothigh) ? true : not na(pivotlow) ? false : isHighLast
    lastPivotP  := (not na(pivothigh) and not isHighLast[1]) or (not na(pivotlow) and isHighLast[1]) ? curPivotP : lastPivotP
    curPivotP   := not na(pivothigh) ? ab : not na(pivotlow) ? cd : curPivotP
    lastPivotBi := (not na(pivothigh) and not isHighLast[1]) or (not na(pivotlow) and isHighLast[1]) ? curPivotBi : lastPivotBi
    curPivotBi  := not na(pivothigh) ? phBIndexS : not na(pivotlow) ? plBIndexS : curPivotBi

// Logic fibo direction.
fiboDirUp = isHighLast

// Last Update Barindex
var barLastUpdate = 0
barLastUpdate := lastPivotBi

// Calculate fib levels.
rangeD = isHighLast ? curPivotP - lastPivotP : lastPivotP - curPivotP
fib0500 := fiboDirUp ? curPivotP - 0.5 * rangeD : curPivotP + 0.5 * rangeD
fib0618 := fiboDirUp ? curPivotP - 0.618 * rangeD : curPivotP + 0.618 * rangeD
fib0650 := fiboDirUp ? curPivotP - 0.650 * rangeD : curPivotP + 0.650 * rangeD

// ] —————— Plot —————— [
var line fib0500Line = line.new(0, low, bar_index, high)
var label fib0500Label = label.new(bar_index, low, text="Init")

var line fib0618Line = line.new(0, low, bar_index, high)
var label fib0618Label = label.new(bar_index, low, text="Init")

var line fib0650Line = line.new(0, low, bar_index, high)
var label fib0650Label = label.new(bar_index, low, text="Init")

labelOffset = 3

if autofib
    line.delete(fib0500Line)
    label.delete(fib0500Label)
    fib0500Line := line.new(barLastUpdate, fib0500, time, fib0500, xloc=xloc.bar_time, color=colorAll, width=1)
    fib0500Label := label.new(x=bar_index + labelOffset, y=fib0500, xloc=xloc.bar_index, text="0.5", style=label.style_none, size=size.small, textcolor=colorAll, textalign=text.align_center)

if autofib
    line.delete(fib0618Line)
    label.delete(fib0618Label)
    fib0618Line := line.new(barLastUpdate, fib0618, time, fib0618, xloc=xloc.bar_time, color=colorAll, width=1)
    fib0618Label := label.new(x=bar_index + labelOffset, y=fib0618, xloc=xloc.bar_index, text="0.618", style=label.style_none, size=size.small, textcolor=colorAll, textalign=text.align_center)

if autofib
    line.delete(fib0650Line)
    label.delete(fib0650Label)
    fib0650Line := line.new(barLastUpdate, fib0650, time, fib0650, xloc=xloc.bar_time, color=colorAll, width=1)
    fib0650Label := label.new(x=bar_index + labelOffset, y=fib0650, xloc=xloc.bar_index, text="0.650", style=label.style_none, size=size.small, textcolor=colorAll, textalign=text.align_center)

// === VOLUME PROFILE ===
float vp_Vmax = 0.0
int vp_VmaxId = 0
int vp_N_BARS = 377
var int vp_first = time

vp_a_P = array.new_float(vp_N_BARS + 1, 0.0)
vp_a_V = array.new_float(vp_N_BARS, 0.0)
vp_a_D = array.new_float(vp_N_BARS, 0.0)
vp_a_W = array.new_int(vp_N_BARS, 0)

float vp_HH = ta.highest(high, 233)
float vp_LL = ta.lowest(low, 233)

if barstate.islast
    float vp_HL = (vp_HH - vp_LL) / vp_N_BARS
    for j = 1 to vp_N_BARS + 1
        array.set(vp_a_P, j - 1, vp_LL + vp_HL * j)
    for i = 0 to 233 - 1
        int Dc = 0
        array.fill(vp_a_D, 0.0)
        for j = 0 to vp_N_BARS - 1
            float Pj = array.get(vp_a_P, j)
            if low[i] < Pj and high[i] > Pj
                float Dj = array.get(vp_a_D, j)
                float dDj = Dj + nz(volume[i])
                array.set(vp_a_D, j, dDj)
                Dc += 1
        for j = 0 to vp_N_BARS - 1
            float Vj = array.get(vp_a_V, j)
            float Dj = array.get(vp_a_D, j)
            float dVj = Vj + (Dc > 0 ? Dj / Dc : 0.0)
            array.set(vp_a_V, j, dVj)
    vp_Vmax := array.max(vp_a_V)
    vp_VmaxId := array.indexof(vp_a_V, vp_Vmax)
    for j = 0 to vp_N_BARS - 1
        float Vj = array.get(vp_a_V, j)
        int Aj = math.round(30 * Vj / vp_Vmax)
        array.set(vp_a_W, j, Aj)


// PLOTTING VOLUME PROFILE
if showVP and barstate.isfirst
    vp_first := time

vp_change = ta.change(time)
vp_x_loc = timenow + math.round(vp_change * 60)

f_setup_bar(n) =>
    x1 = vp_VmaxId == n ? math.max(time[233], vp_first) : timenow + math.round(vp_change * (60 - array.get(vp_a_W, n)))
    ys = array.get(vp_a_P, n)
    line.new(x1=x1, y1=ys, x2=vp_x_loc, y2=ys, xloc=xloc.bar_time, extend=extend.none, color=vp_VmaxId == n ? vp_poc_color : vp_bar_color, style=line.style_solid, width=1)

if showVP and barstate.islast
    for i = 0 to vp_N_BARS - 1
        f_setup_bar(i)            

////////SMART MONEY CONCEPTS////////

//----------------------------------------}
//Order Blocks
//----------------------------------------{

v_buy = #00dbff4d
v_sell = #e91e634d
timeframe1=' : '
show_iob = 'All'=='All' or 'All'=='Internal'
show_ob = 'All'=='All' or 'All'=='External'
ob_showlast = 5
iob_showlast = 5

styleSMC = 'Colored'
v_lookback= 10
ob_loockback=10
timediff=(time[1]-time[101])/100

//----------------------------------------}
//Liquidity Levels
//----------------------------------------{

_highLineStyleHTF  = "Solid"
highLineStyleHTF = _highLineStyleHTF=="Solid" ? line.style_solid : _highLineStyleHTF=="Dashed" ? line.style_dashed : line.style_dotted
box_width  = 2.5
lineWidthHTF=2
// User-defined colors (replace with your preferred values)
highBoxBorderColorHTF = color.new(highLineColorHTF,90)
lowBoxBorderColorHTF = color.new(lowLineColorHTF,90)
displayStyle_liq  = "Boxes"

//----------------------------------------}
//Fair Value Gaps (FVG)
//----------------------------------------{

i_bullishfvgcolor = color.new(color.green,100)
i_bearishfvgcolor = color.new(color.red,90)
i_fillByMid = true
i_deleteonfill = true
i_textColor = color.white
i_mtf = "HTF"
i_tfos = 10
i_mtfos = 50

//----------------------------------------}
//BOS and ChoCH
//----------------------------------------{

// Constants
color CLEAR = color.rgb(0,0,0,100)

// Inputs
swingSize = 8

//-----------------------------------------------------------------------------}
//Global variables
//-----------------------------------------------------------------------------{
color transparent = #ffffff00
length = 50
is_newbar(res) =>
    t = time(res)
    not na(t) and (na(t[1]) or t > t[1])

Show_MS(x, y, txt, css, dashed, down, lbl_size)=>
    label.new(int(math.avg(x, bar_index)), y, txt, color = transparent, textcolor = css, style = down ? label.style_label_down : label.style_label_up, size = lbl_size)
    line.new(x, y, bar_index, y, color = css, style = dashed ? line.style_dashed : line.style_solid)

f_barssince(_cond, _count) =>
    _barssince = bar_index - ta.valuewhen(_cond, bar_index, _count)
    _barssince

 //Swings detection/measurements
//calculate_swing_points(length)=>
  //  var prev = 0
   // prev := high[length] > ta.highest(length) ? 0 : low[length] < ta.lowest(length) ? 1 : prev[1]
   // t = prev == 0 and prev[1] != 0 ? high[length] : 0
 // b = prev == 1 and prev[1] != 1 ? low[length] : 0
  //  [t, b]

calculate_swing_points(length)=>
    var prev = 0
    hi = ta.highest(length)
    lo = ta.lowest(length)
    prev := high[length] > hi ? 0 : (low[length] < lo ? 1 : prev[1])
    t = (prev == 0 and prev[1] != 0) ? high[length] : 0
    b = (prev == 1 and prev[1] != 1) ? low[length] : 0
    [t, b]

var t_MS = 0, var int_t_MS = 0
var internal_y_up = 0., var internal_x_up = 0, var internal_y_dn = 0., var internal_x_dn = 0
var y_up = 0., var x_up = 0 , var y_dn = 0., var x_dn = 0
var crossed_up = true,  var crossed_down = true
var internal_up_broke = true, var internal_dn_broke = true
var up_trailing = high, var down_trailing = low
var up_trailing_x = 0,  var down_trailing_x = 0
var high_text = '',  var low_text = ''
bullish_OB_Break = false 
bearish_OB_Break = false


//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------       Market Structure
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bosConfType = 'Candle High'
ChoCH = true



// Functions
lineStyle(x) =>
    switch x
        'Solid' => line.style_solid
        'Dashed' => line.style_dashed
        'Dotted' => line.style_dotted

pivot_high_found = ta.pivothigh(high, 10, 10)
pivot_low_found = ta.pivotlow(low, 10, 10)

var float prevHigh_s = na,var float prevLow_s = na,var int prevHighIndex_s = na,var int prevLowIndex_s = na
bool higher_highs = false, bool lower_highs = false, bool higher_lows = false, bool lower_lows = false

var int prevSwing_s = 0

if not na(pivot_high_found)
    if pivot_high_found >= prevHigh_s
        higher_highs := true
        prevSwing_s := 2
    else
        lower_highs := true
        prevSwing_s := 1
    prevHigh_s := pivot_high_found
    prevHighIndex_s := bar_index - 10

if not na(pivot_low_found)
    if pivot_low_found >= prevLow_s
        higher_lows := true
        prevSwing_s := -1
    else
        lower_lows := true
        prevSwing_s := -2
    prevLow_s := pivot_low_found
    prevLowIndex_s := bar_index - 10

//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------       Fair Value Gaps
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

// ———————————————————— Global data {
var htfH = open
var htfL = open

if close > htfH 
    htfH:= close
if close < htfL
    htfL := close

sClose = request.security(ticker.standard(syminfo.tickerid), i_tf, close[1], barmerge.gaps_off, barmerge.lookahead_on)
sHighP2 = request.security(ticker.standard(syminfo.tickerid), i_tf, high[2], barmerge.gaps_off, barmerge.lookahead_on)
sLowP2 = request.security(ticker.standard(syminfo.tickerid), i_tf, low[2], barmerge.gaps_off, barmerge.lookahead_on)
sOpen = request.security(ticker.standard(syminfo.tickerid), i_tf, open[1], barmerge.gaps_off, barmerge.lookahead_on)
sBar = request.security(ticker.standard(syminfo.tickerid), i_tf, bar_index, barmerge.gaps_off, barmerge.lookahead_on)

var bullishgapholder = array.new_box(0)
var bearishgapholder = array.new_box(0)
var bullishgapholder_fill = array.new_box(0)
var bearishgapholder_fill = array.new_box(0)
var bullish_high_holder = array.new_line(0)
var bearish_high_holder = array.new_line(0)
var bullish_low_holder = array.new_line(0)
var bearish_low_holder = array.new_line(0)
var bullishmidholder = array.new_line(0)
var bearishmidholder = array.new_line(0)
var bullishlabelholder = array.new_label(0)
var bearishlabelholder = array.new_label(0)
var transparentcolor = color.new(color.white,100)

var fvg_apper=false
var fvg_break=false

fvg_apper:=false
fvg_break:=false

// ———————————————————— Functions {

create_fvg_func(_upperlimit,_lowerlimit,_midlimit,_bar,_boxholder,_boxholder_fill,_midholder,_highholder,_lowholder,_labelholder,_boxcolor,_mtfboxcolor, _htf)=>
    timeholder = str.tostring(i_tf)
    offset = i_mtfos
    boxbgcolor = _mtfboxcolor
    bg_color = color.new(_mtfboxcolor,90)
    if _htf == false
        timeholder := str.tostring(timeframe.period)
        offset := i_tfos
        boxbgcolor := _boxcolor
    array.push(_boxholder,box.new(_bar,_upperlimit,_bar+(timediff)*20,_lowerlimit,border_color=bg_color,bgcolor = bg_color, extend = extend.none,xloc = xloc.bar_time))
    array.push(_boxholder_fill,box.new(_bar,_upperlimit,_bar+(timediff)*20,_lowerlimit,border_color=bg_color,bgcolor = bg_color, extend = extend.none,xloc = xloc.bar_time))
    array.push(_midholder,line.new(_bar,(_lowerlimit+_upperlimit)/2.0,_bar+(timediff)*20,_midlimit,color = #787b86, extend = extend.none,style=line.style_solid,width=1,xloc = xloc.bar_time))
    array.push(_lowholder,line.new(_bar,_lowerlimit,_bar+(timediff)*20,_lowerlimit,color = i_fillByMid?boxbgcolor:na, extend = extend.none,width=1,xloc = xloc.bar_time))
    array.push(_highholder,line.new(_bar,_upperlimit,_bar+(timediff)*20,_upperlimit,color = i_fillByMid?boxbgcolor:na, extend = extend.none,width=1,xloc = xloc.bar_time))

check_fvg_func(smcclose,smchigh,_highp2,smclow,_lowp2,smcopen,_bar,_htf)=>
    gap=0
    thold_ = (ta.highest(smchigh,300) - ta.lowest(smclow,300)) * math.max(1.5, 0.1) / 100.
    if smcopen > smcclose
        if _lowp2>smchigh
            if math.abs(_lowp2 -smchigh) > thold_
                upperlimit = smchigh
                lowerlimit = _lowp2
                midlimit = lowerlimit + ((upperlimit - lowerlimit) / 2.)
                gap:=1
                create_fvg_func(upperlimit,lowerlimit,midlimit,_bar,bullishgapholder,bullishgapholder_fill,bullishmidholder,bullish_high_holder,bullish_low_holder,bullishlabelholder,i_bullishfvgcolor,i_mtfbullishfvgcolor,_htf)
    else
        if smclow>_highp2
            if math.abs(smclow - _highp2) > thold_
                upperlimit = smclow
                lowerlimit = _highp2
                midlimit = lowerlimit + ((upperlimit - lowerlimit) / 2.)
                gap:=-1
                create_fvg_func(upperlimit,lowerlimit,midlimit,_bar,bearishgapholder,bearishgapholder_fill,bearishmidholder,bearish_high_holder,bearish_low_holder,bearishlabelholder,i_bearishfvgcolor,i_mtfbearishfvgcolor,_htf)
    gap

delete_fvg_func(_currentgap,_currentgap_fill,_i,_boxholder,_boxholder_fill,_midholder,_highholder,_lowholder,_labelholder)=>
    array.remove(_boxholder,_i)
    array.remove(_boxholder_fill,_i)
    currentmid=array.get(_midholder,_i)
    currenthigh=array.get(_highholder,_i)
    currentlow=array.get(_lowholder,_i)
    array.remove(_midholder,_i)
    array.remove(_highholder,_i)
    array.remove(_lowholder,_i)
    if i_deleteonfill
        line.delete(currentmid)
        line.delete(currenthigh)
        line.delete(currentlow)
    else
        line.set_extend(currentmid, extend.none)
        line.set_x2(currentmid,time)
        line.set_extend(currenthigh, extend.none)
        line.set_x2(currenthigh,time)
        line.set_extend(currentlow, extend.none)
        line.set_x2(currentlow,time)
    if i_deleteonfill
        box.delete(_currentgap)
        box.delete(_currentgap_fill)
    else
        box.set_extend(_currentgap,extend.none)
        box.set_right(_currentgap,time)


validate_fvg_func(smchigh,smclow)=>
    fvg_removed=0
    if array.size(bullishgapholder) > 0
        for i = array.size(bullishgapholder)-1 to 0
            currentgap_fill = array.get(bullishgapholder_fill,i)
            currentgap = array.get(bullishgapholder,i)
            cmid = array.get(bullishmidholder,i)                                                    
            chigh = array.get(bullish_high_holder,i)
            clow = array.get(bullish_low_holder,i)
            line.set_x2(cmid,timenow+(timediff)*20)
            line.set_x2(chigh,timenow+(timediff)*20)
            line.set_x2(clow,timenow+(timediff)*20)
            box.set_right(currentgap_fill,timenow+(timediff)*20)
            box.set_right(currentgap,timenow+(timediff)*20)
            currenttop = box.get_top(currentgap)
            if high > currenttop
                fvg_removed:=1
                delete_fvg_func(currentgap,currentgap_fill,i,bullishgapholder,bullishgapholder_fill,bullishmidholder,bullish_high_holder,bullish_low_holder,bullishlabelholder)
    if array.size(bearishgapholder) > 0
        for i = array.size(bearishgapholder)-1 to 0
            currentgap_fill = array.get(bearishgapholder_fill,i)
            currentgap = array.get(bearishgapholder,i)
            cmid = array.get(bearishmidholder,i)
            chigh = array.get(bearish_high_holder,i)
            clow = array.get(bearish_low_holder,i)
            line.set_x2(cmid,timenow+(timediff)*20)
            line.set_x2(chigh,timenow+(timediff)*20)
            line.set_x2(clow,timenow+(timediff)*20)
            box.set_right(currentgap_fill,timenow+(timediff)*20)
            box.set_right(currentgap,timenow+(timediff)*20)
            currenttop = box.get_top(currentgap)
            if low < currenttop
                fvg_removed:=-1
                delete_fvg_func(currentgap,currentgap_fill,i,bearishgapholder,bearishgapholder_fill,bearishmidholder,bearish_high_holder,bearish_low_holder,bearishlabelholder)
    fvg_removed

if is_newbar(i_tf)
    htfH := high
    htfL := low

fvg_gap=0

//if is_newbar(i_tf) and (i_mtf == "Current + HTF" or i_mtf == "HTF") and barstate.isconfirmed
fvg_gap:=check_fvg_func(sClose,htfH,sHighP2,htfL,sLowP2,sOpen,time[2],true)

alertcondition(fvg_gap==1,"Bullish FVG","Bullish FVG Found Ez-SMC")
alertcondition(fvg_gap==-1,"Bearish FVG","Bearish FVG Found Ez-SMC")

fvg_removed=validate_fvg_func(high,low)

alertcondition(fvg_removed==1,"Bullish FVG Break","Bullish FVG Broken Ez-SMC")
alertcondition(fvg_removed==-1,"Bearish FVG Break","Bearish FVG Broken Ez-SMC")

if array.size(bullishgapholder) > 4
    d_box=array.shift(bullishgapholder)
    box.delete(d_box)

if array.size(bullishgapholder_fill) > 4
    d_box=array.shift(bullishgapholder_fill)
    box.delete(d_box)

if array.size(bullishmidholder) > 4
    d_line=array.shift(bullishmidholder)
    line.delete(d_line)

if array.size(bullish_high_holder) > 4
    d_line=array.shift(bullish_high_holder)
    line.delete(d_line)

if array.size(bullish_low_holder) > 4
    d_line=array.shift(bullish_low_holder)
    line.delete(d_line)

if array.size(bearishgapholder) > 4
    d_box_=array.shift(bearishgapholder)
    box.delete(d_box_)

if array.size(bearishgapholder_fill) > 4
    d_box_=array.shift(bearishgapholder_fill)
    box.delete(d_box_)

if array.size(bearishmidholder) > 4
    d_line_=array.shift(bearishmidholder)
    line.delete(d_line_)

if array.size(bearish_high_holder) > 4
    d_line_=array.shift(bearish_high_holder)
    line.delete(d_line_)

if array.size(bearish_low_holder) > 4
    d_line_=array.shift(bearish_low_holder)
    line.delete(d_line_)

n=bar_index

//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------       Liquidity Levels
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
highBoxBorderColor = input.color(color.red, "High Box Border Color")
lowBoxBorderColor  = input.color(color.green, "Low Box Border Color")
highLineColor = highLineColorHTF
lowLineColor = lowLineColorHTF
highBoxBgColor = highLineColorHTF
lowBoxBgColor = lowLineColorHTF
atr_liq = ta.atr(300)

float thold_liq = atr_liq * (box_width / 10)
                
// --
// ----------------------------------------------------
// Functions 
// ----------------------------------------------------

tf_multi(tf) =>
    ts = timeframe.in_seconds("")
    htfs = timeframe.in_seconds(tf)
    htfs/ts

display_limit_line(_array) =>
    if array.size(_array) > 6/2
        a = array.shift(_array)
        line.delete(a)

display_limit_box(_array) =>
    if array.size(_array) > 6/2
        a = array.shift(_array)
        box.delete(a)


remove_mitigated_lines(_array, _hl) =>
    m = false
    if array.size(_array) > 0      
        for i = array.size(_array) - 1 to 0 by 1
            l = array.get(_array, i)
            hh = "Close" == "Close" ? close[1] : high
            ll = "Close" == "Close" ? close[1] : low
            if _hl == "High" and hh > line.get_y1(l)
                array.remove(_array, i)
                if "Remove" == "Show"
                    line.new(line.get_x1(l),line.get_y1(l),time,line.get_y1(l), xloc=xloc.bar_time, color = highLineColorHTF, style=highLineStyleHTF, width = lineWidthHTF)
                line.delete(l)
                m := true
            if _hl == "Low" and ll < line.get_y1(l)
                array.remove(_array, i)
                if "Remove" == "Show"
                    line.new(line.get_x1(l),line.get_y1(l),time,line.get_y1(l), xloc=xloc.bar_time, color = lowLineColorHTF, style=highLineStyleHTF, width = lineWidthHTF)
                line.delete(l) 
                m := true                                                                                                 
    display_limit_line(_array) 
    m

remove_mitigated_boxes(_array, _hl) =>
    m = false
    if array.size(_array) > 0
        for i = array.size(_array) - 1 to 0 by 1
            l = array.get(_array, i)
            hh = "Close" == "Close" ? close[1] : high
            ll = "Close" == "Close" ? close[1] : low
            if _hl == "High" and hh > box.get_top(l)
                array.remove(_array, i)
                if "Remove" == "Show"
                    box.new(box.get_left(l),box.get_top(l),time,box.get_bottom(l), xloc=xloc.bar_time, bgcolor = color.new(highBoxBgColor, 90), border_color = color.new(highBoxBorderColor, 90), border_style = highLineStyleHTF)
                box.delete(l)
                m := true
            if _hl == "Low" and ll < box.get_top(l)
                array.remove(_array, i)
                if "Remove" == "Show"
                    box.new(box.get_left(l),box.get_top(l),time,box.get_bottom(l), xloc=xloc.bar_time, bgcolor = color.new(lowBoxBgColor, 90), border_color = color.new(lowBoxBorderColor, 90), border_style = highLineStyleHTF)
                box.delete(l)
                m := true
    display_limit_box(_array) 
    m

extend_line_to_current(lineArray) =>
    if array.size(lineArray) > 0
        for i = array.size(lineArray) - 1 to 0 by 1
            l = array.get(lineArray, i)
            timeExt = timenow + ((timediff)*20)
            line.set_x2(l, timeExt)

extend_box_to_current(boxArray) =>
    if array.size(boxArray) > 0
        for i = array.size(boxArray) - 1 to 0 by 1
            b = array.get(boxArray, i)
            timeExt = timenow + ((timediff)*20)
            box.set_right(b, timeExt)


// ----------------------------------------------------
// Higher TimeFrame
// ----------------------------------------------------
// Varibles 
// Lines
var highLineArrayHTF = array.new_line()
var lowLineArrayHTF = array.new_line()

// Boxes
var highBoxArrayHTF = array.new_box()
var lowBoxArrayHTF = array.new_box()

// Get HTF
[_time, smcopen, smchigh, smclow, smcclose] = request.security(syminfo.tickerid, htfTF, [time, open, high, low, close])

// Pivots
pivotHighHTF = ta.pivothigh(smchigh, 8*tf_multi(htfTF), 8+tf_multi(htfTF))
pivotLowHTF = ta.pivotlow(smclow, 8*tf_multi(htfTF), 8+tf_multi(htfTF))

if currentTF
    timeExt = time+((time[1]-time[2])*10)
    dis = 8+tf_multi(htfTF)
    if not na(pivotHighHTF)
        if displayStyle_liq == "Lines"
            array.push(highLineArrayHTF, line.new(_time[dis],smchigh[dis],_time[+1],smchigh[dis],color = highLineColorHTF, style=highLineStyleHTF, xloc=xloc.bar_time, width = lineWidthHTF))
        else
            y1 = smchigh[dis]-thold_liq
            array.push(highBoxArrayHTF, box.new(_time[dis],smchigh[dis],_time[+1],y1,bgcolor = highLineColorHTF, border_color=highBoxBorderColorHTF, xloc=xloc.bar_time, border_style = highLineStyleHTF, border_width = lineWidthHTF))  
    if not na(pivotLowHTF)
        if displayStyle_liq == "Lines"
            array.push(lowLineArrayHTF, line.new(_time[dis],smclow[dis],_time[+1],smclow[dis],color = lowLineColorHTF, style=highLineStyleHTF, xloc=xloc.bar_time, width = lineWidthHTF))
        else
            y1 = smclow[dis]+thold_liq
            array.push(lowBoxArrayHTF, box.new(_time[dis],smclow[dis],_time[+1],y1,bgcolor = lowLineColorHTF, border_color=lowBoxBorderColorHTF, xloc=xloc.bar_time, border_style = highLineStyleHTF, border_width = lineWidthHTF))

// ----------------------------------------------------
// Run Functions
// ----------------------------------------------------
highLineAlertHTF = remove_mitigated_lines(highLineArrayHTF, "High")
lowLineAlertHTF = remove_mitigated_lines(lowLineArrayHTF, "Low")
highBoxAlertHTF = remove_mitigated_boxes(highBoxArrayHTF, "High")
lowBoxAlertHTF = remove_mitigated_boxes(lowBoxArrayHTF, "Low")

extend_line_to_current(highLineArrayHTF)
extend_line_to_current(lowLineArrayHTF)
extend_box_to_current(highBoxArrayHTF)
extend_box_to_current(lowBoxArrayHTF)

// Alerts
alertcondition(not na(pivotHighHTF), "High Liquidity Level", "High Liquidity Level Found Ez-SMC")
alertcondition(not na(pivotLowHTF), "Low Liquidity Level", "Low Liquidity Level Found Ez-SMC")

alertcondition((highLineAlertHTF or highBoxAlertHTF) ? true : false, "High Liquidity Level Break", "High Liquidity Level Broken Ez-SMC")
alertcondition((lowLineAlertHTF or lowBoxAlertHTF) ? true : false, "Low Liquidity Level Break", "Low Liquidity Level Broken Ez-SMC")

swing_bull_css = bosColor1
swing_bear_css = bosColor2 
var bullish_col_ChoCH = swing_bull_css
var bearish_col_ChoCH = swing_bear_css
var internal_bullish_col_ChoCH = bosColor1
var internal_bearish_col_ChoCH = bosColor2
[high_ms, low_ms] = calculate_swing_points(length)
n := bar_index
//HL Output function
hl() => [high, low]
var float thold = (ta.highest(300) - ta.lowest(300)) * math.max(0.5, 0.1) / 100.
internal_structure_lbl_size=size.small
[int_high_ms, int_low_ms] = calculate_swing_points(swingSize)
swing_structure_lbl_size=size.small

if not na(low_ms)
    crossed_down := true
    y_dn := low_ms
    x_dn := n-length

if not na(high_ms)
    crossed_up := true
    y_up := high_ms
    x_up := n - length

if not na(int_low_ms)
    internal_dn_broke := true
    internal_y_dn := int_low_ms
    internal_x_dn := n - swingSize

if not na(int_high_ms)
    internal_up_broke := true
    internal_y_up := int_high_ms
    internal_x_up := n - swingSize

bull_ChoCH=false,bull_ChoCH_=false,bull_bos=false,bull_bos_=false,bear_ChoCH=false,bear_ChoCH_=false,bear_bos=false,bear_bos_=false
if ta.crossover(close, internal_y_up) and internal_up_broke and y_up != internal_y_up
    ChoCH := int_t_MS < 0
    internal_up_broke := false
    int_t_MS := 1
    bull_ChoCH:=ChoCH?true:false
    bull_bos:=ChoCH?false:true
    if showms
        Show_MS(internal_x_up, internal_y_up, ChoCH ? 'ChoCH' : 'BOS', internal_bullish_col_ChoCH, true, true, internal_structure_lbl_size)
if ta.crossunder(close, y_dn) and crossed_down
    ChoCH := t_MS > 0
    crossed_down := false
    t_MS := -1
    bear_ChoCH_:=ChoCH?true:false
    bear_bos_:=ChoCH?false:true
    if showms
        Show_MS(x_dn, y_dn, ChoCH ? 'ChoCH+' : 'BOS+', bearish_col_ChoCH, false, false, swing_structure_lbl_size)

alertcondition(bull_ChoCH,"Bullish ChoCH",'Bullish ChoCH Found Ez-SMC')
alertcondition(bear_ChoCH,"Bearish ChoCH",'Bearish ChoCH Found Ez-SMC')
alertcondition(bull_bos,"Bullish BOS",'Bullish BOS Found Ez-SMC')
alertcondition(bear_bos,"Bearish BOS",'Bearish ChoCH Found Ez-SMC')

if ta.crossover(close, y_up) and crossed_up
    ChoCH := t_MS < 0
    crossed_up := false
    t_MS := 1
    bull_ChoCH_:=ChoCH?true:false
    bull_bos_:=ChoCH?false:true
    if showms
        Show_MS(x_up, y_up, ChoCH ? 'ChoCH+' : 'BOS+', bullish_col_ChoCH, false, true, swing_structure_lbl_size)
if ta.crossunder(close, y_dn) and crossed_down
    ChoCH := t_MS > 0
    crossed_down := false
    t_MS := -1
    bear_ChoCH_:=ChoCH?true:false
    bear_bos_:=ChoCH?false:true
    if showms
        Show_MS(x_dn, y_dn, ChoCH ? 'ChoCH+' : 'BOS+', bearish_col_ChoCH, false, false, swing_structure_lbl_size)

alertcondition(bull_ChoCH_,"Bullish ChoCH+",'Bullish ChoCH+ Found Ez-SMC')
alertcondition(bear_ChoCH_,"Bearish ChoCH+",'Bearish ChoCH+ Found Ez-SMC')
alertcondition(bear_bos_,"Bearish BOS+",'Bearish BOS+ Found Ez-SMC')
alertcondition(bull_bos_,"Bullish BOS+",'Bullish BOS+ Found Ez-SMC')

//-----------------------------------------------------------------------------}
//symbol info
symInfoCheck = false
symInfo = syminfo.ticker + ' | ' + timeframe.period + (timeframe.isminutes ? 'M' : "")
date = str.tostring(dayofmonth(time_close)) + '/' + str.tostring(month(time_close)) + '/' + str.tostring(year(time_close))

//text positioning
textVPosition = "middle"
textHPosition = "center"

//symbol info positioning
symVPosition = "top"
symHPosition = "left"

// display symbol info table if enabled
var table infoTable = table.new(position.top_left, 1, 2)

if symInfoCheck
    table.cell(infoTable, 0, 0, text = symInfo, text_color = color.white, bgcolor = color.rgb(25,25,25))
    table.cell(infoTable, 0, 1, text = date, text_color = color.white, bgcolor = color.rgb(25,25,25))

Overview

Premium 3 offers reversal buy and sell markers, oversold and overbought shading, a trend ribbon, optional reversal bands and three moving average support and resistance lines. It can also show higher-timeframe liquidity levels, fair value gaps, an automatic golden pocket Fibonacci zone and a volume profile with point of control, and the code lists market structure options such as ChoCH and BoS. Each module has its own toggle and colours. The author notes the reversal signals are meant to be used with the other tools. The code reads higher-timeframe data.

Details

Published by

Abishek-Tharu99 on GitHub

Code credit

hackerheaven73, as written in the script's header

Type

Indicator, Pine Script v5

Draws

On the price chart

Category

SMC / ICT / price action, Support & resistance, Volume, Trend

Markets

Any symbol

Timeframes

Any timeframe

Risk Notes

  • Reads higher-timeframe data with lookahead on, so the history can show signals that were not there in real time

Settings

The inputs you can change from the gear icon on the chart. Defaults are the author's.

SettingTypeDefaultVariable
Buy/SellbooltrueshowReversal
colorBuycolor#11ff0099colorBuy
colorSellcolor#e94d1eb6colorSell
O.S/O.Bbooltrueobos
colorOscolor#1aff0048colorOs
colorObcolor#e91e1e48colorOb
Trend RibbonbooltrueshowRibbon
Uptrendcolor#00ff0466uptrend
Downtrendcolor#e91e1e66downtrend
Reversal BandsboolfalseshowRevBands
Upper Bandscolor#e91e1e3bcolorupperband
Lower Bandscolor#73ff0033colorlowerband
Show all 40 settings
SettingTypeDefaultVariable
Moving Average S/RboolfalseshowEmas
Moving Average 1color#eaeaea40colorEma1
Moving Average 2color#3c00ffa4colorEma2
Moving Average 3color#e91e62e9colorEma3
Liquidity LevelsboolfalsecurrentTF
Bullishcolor#23f71450lowLineColorHTF
Bearishcolor#fb0f0f50highLineColorHTF
Timeframetimeframe240htfTF
Fair Value Gapsboolfalseshow_fvg
Bullishcolor#22eb07i_mtfbearishfvgcolor
Bearishcolor#f40909i_mtfbullishfvgcolor
Timeframetimeframe240i_tf
Auto Golden Pocketbooltrueautofib
Colorcolor#D1B000colorAll
timeframetimeframe240timeframe
Volume ProfilebooltrueshowVP
Volume Barscolorcolor.new(color.gray, 60)vp_bar_color
Point of Controlcolor#eaeaeavp_poc_color
ChoCH & BoSboolfalseshowms
Bullishcolor#0097a7bosColor1
Bearishcolor#c2185bbosColor2
Gann Swing (One Bar Key Pivot Points)boolfalseshowGann
Swing Linecolor#ff7f50colorGann
EnablebooltrueshowDashboard
Textcolorcolor.whitetableTextColor
Backgroundcolor#13172232tableBgColor
showSRbooltrueshowSR
timeftimeframetimef
Third-party code. ForexR did not write, test or endorse this script, and the summary above was generated automatically from its code and README. Indicators describe the past, and a strategy's backtest can look better than live trading, especially when a script repaints. Check it in the Strategy Tester and on a demo account before you rely on it.

Similar Pine Scripts

Copilot

by milocaetano
48 stars

Copilot is an order flow range-reversal indicator designed to overlay trading setups directly on the price chart. It evaluates four criteria: market context (sideways vs trending regime based on ATR height), structure (double top or double bottom retests), abs

Indicator v5 SMC / ICT / price actionSupport & resistance
Updated 2 days ago · MIT GitHub repository of Copilot

This indicator identifies and plots volumetric order blocks alongside trend strength on the price chart. It highlights recent bullish and bearish order blocks using full candles or custom length coordinates, displaying internal buy and sell activity, mid-lines

Indicator v5 SMC / ICT / price actionVolume
575 stars

This indicator detects equal highs and lows by comparing prices within user-defined left and right bars using a tolerance percentage. It plots horizontal lines on the price chart for equal highs in one color and lows in another. A screener allows input of mult

Indicator v5 Support & resistanceTrend
Updated 1 year ago · MPL-2.0 GitHub repository of ICT Equal Highs and Lows with Screener

This Pine Script indicator plots a ZigZag on the price chart. It identifies reversal points when price moves more than a set percentage from the last pivot. The script calculates forecasts using zigzag data and labels detected geometric patterns including harm

Indicator v4 TrendSupport & resistance
218 stars

This indicator plots market structure on the price chart by identifying swing highs and lows. It connects these points with lines to visualize trend direction and detect Break of Structure (BOS) when price breaks a prior swing in the current trend. Change of C

Indicator v6 TrendSupport & resistance
Updated 3 months ago · None stated GitHub repository of Market Structure - BOS & CHoCH

Open Source Fractal

by cantolab
183 stars

This indicator implements the Fractal Model concept to plot market structure shifts, liquidity sweeps, and Change in State of Delivery (CISD) levels. It overlays custom higher-timeframe candle previews, open prices, and time markers directly on the price chart

Indicator v6 SMC / ICT / price actionSupport & resistance
Updated 2 months ago · MIT GitHub repository of Open Source Fractal

More indicators

Trade Your Charts With a Regulated Broker

Compare brokers that connect to TradingView, with spreads, minimum deposits and leverage side by side.

Compare brokers