Price Action Toolkit
Price Action Toolkit
//   =================================
//   PLEASE SUPPORT THE TEAM
//   =================================
//
//   If this project has been helpful, consider making a donation:
//   Biance UID: 263856481
//   Telegram: https://t.me/enigmawaytrading
// =================================
// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0
International (CC BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/
//@version=5
indicator("[v1.5.9] Price Action Toolkit", "[v1.5.9] Price Action Toolkit "
  , overlay = true
  , max_labels_count = 500
  , max_lines_count = 500
  , max_boxes_count = 500
  , max_bars_back = 500)
max_bars_back = 500
max_labels_count = 500
max_lines_count = 500
//-----------------------------------------------------------------------------{
    //Boolean set
//-----------------------------------------------------------------------------{
s_BOS        = 0
s_CHoCH      = 1
i_BOS        = 2
i_CHoCH      = 3
i_pp_CHoCH   = 4
green_candle = 5
red_candle   = 6
s_CHoCHP     = 7
i_CHoCHP     = 8
boolean =
 array.from(
   false
 , false
 , false
 , false
 , false
 , false
 , false
 , false
 , false
 )
//-----------------------------------------------------------------------------{
    // User inputs
//-----------------------------------------------------------------------------{
t                                 = color.t         (ob_bull_css)
invcol                            = color.new       (color.white
, 100)
type bar
    float   o   =   open
    float   c   =   close
    float   h   =   high
    float   l   =   low
    float   v   =   volume
    int        n = bar_index
    int        t = time
type Zphl
    line     top
    line     bottom
    label    top_label
    label    bottom_label
    bool     stopcross
    bool     sbottomcross
    bool     itopcross
    bool     ibottomcross
    string   txtup
    string   txtdn
    float    topy
    float    bottomy
    float    topx
    float    bottomx
    float    tup
    float    tdn
    int      tupx
    int      tdnx
    float    itopy
    float    itopx
    float    ibottomy
    float    ibottomx
    float    uV
    float    dV
type FVG
    box []   box
    line[]   ln
    bool     bull
    float    top
    float    btm
    int      left
    int      right
type ms
      float[] p
      int [] n
    float[] l
type msDraw
      int      n
      float    p
      color    css
      string   txt
      bool     bull
type obC
    float[]    top
    float[]    btm
    int []     left
    float[]    avg
    float[]    dV
    float[]    cV
    int []     wM
    int []     blVP
    int []    brVP
    int []    dir
    float[]   h
    float[]   l
    int []    n
type obD
    box []   ob
    box []   eOB
    box []   blB
    box []   brB
    line[]   mL
type zone
    chart.point points
    float p
    int   c
    int   t
type hqlzone
    box   pbx
    box   ebx
    box   lbx
    label plb
    label elb
    label lbl
type ehl
    float   pt
    int     t
    float   pb
    int     b
type pattern
    string found     =   "None"
    bool isfound     =   false
    int   period     =   0
    bool bull        =   false
type alerts
    bool chochswing           =   false
    bool chochplusswing       =   false
    bool swingbos             =   false
    bool chochplus            =   false
    bool choch                =   false
    bool bos                  =   false
    bool equal                =   false
    bool ob                   =   false
    bool swingob              =   false
    bool zone                 =   false
    bool fvg                  =   false
    bool obtouch              =   false
bar         b            = bar.new()
var pattern p            = pattern.new()
p.period += 1
if p.period == 50
      p.period        :=   0
      p.found         :=   "None"
      p.isfound       :=   false
      p.bull          :=   na
switch
if ms_mode == "Dynamic"
switch
lstyle(style) =>
    hy   =   ta.valuewhen(h   !=   h[1]   ,   h      ,   1)
    hx   =   ta.valuewhen(h   ==   high   ,   time   ,   1)
    ly   =   ta.valuewhen(l   !=   l[1]   ,   l      ,   1)
    lx   =   ta.valuewhen(l   ==   low    ,   time   ,   1)
if barstate.islast
          line.set_xy1(hl , hx                  , hy)
        line.set_xy2(hl ,   extension   ,   hy)
        label.set_xy(hlb,   extension   ,   hy)
        line.set_xy1(ll ,   lx          ,   ly)
        line.set_xy2(ll ,   extension   ,   ly)
        label.set_xy(lbl,   extension   ,   ly)
if lvl_daily
if lvl_weekly
if lvl_monthly
if lvl_yearly
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//{ - End
}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//{ - Market Structure
}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
    id := line.new(
       d.n
     , d.p
     , b.n
     , d.p
     , color = d.css
     , width = 1
     , style = style
     )
line.delete(msline.shift())
msline.push(id)
    lbl := label.new(
       int(math.avg(d.n, b.n))
     , d.p
     , d.txt
     , color            = invcol
     , textcolor        = d.css
     , style            = d.bull ? label.style_label_down : label.style_label_up
     , size             = size
     )
msDraw drw = na
n = bar_index
     var ms up = ms.new(
              array.new<float>()
            , array.new< int >()
        , array.new<float>()
            )
     var ms dn = ms.new(
              array.new<float>()
             , array.new< int >()
         , array.new<float>()
             )
switch show_swing_ms
switch show_internal_ms
    switch
        iH =>
            up.p.unshift(b.h[iLen])
            up.l.unshift(b.h[iLen])
            up.n.unshift(n [iLen])
iL =>
            dn.p.unshift(b.l[iLen])
            dn.l.unshift(b.l[iLen])
            dn.n.unshift(n [iLen])
        sL =>
              sdn.p.unshift(b.l[sLen])
              sdn.l.unshift(b.l[sLen])
              sdn.n.unshift(n [sLen])
sH =>
              sup.p.unshift(b.h[sLen])
              sup.l.unshift(b.h[sLen])
              sup.n.unshift(n [sLen])
if ta.crossover(b.c, up.p.first())
                   bool CHoCH = na
                   string txt = na
if itrend < 0
CHoCH := true
switch
                                 txt := "BOS"
                                 css := i_ms_up_BOS
blalert.bos := true
                            isdrw := true
                                       drw := msDraw.new(
                                                up.n.first()
                                              , up.p.first()
                                              , i_ms_up_BOS
                                              , txt
                                              , true
                                              )
CHoCH =>
                            isdrw := true
                                       drw := msDraw.new(
                                                up.n.first()
                                              , up.p.first()
                                              , i_ms_up_BOS.darkcss(0.25, true)
                                              , txt
                                             , true
                                             )
if mtf == false
switch
                  itrend := 1
            up.n.clear()
            up.p.clear()
if ta.crossunder(b.c, dn.p.first())
                  bool CHoCH = na
                  string txt = na
if itrend > 0
CHoCH := true
switch
bralert.bos := true
                                txt := "BOS"
                                css := i_ms_dn_BOS
                           isdrw := true
                                      drw := msDraw.new(
                                               dn.n.first()
                                             , dn.p.first()
                                             , i_ms_dn_BOS
                                             , txt
                                             , false
                                             )
CHoCH =>
                           isdrw := true
                                      drw := msDraw.new(
                                               dn.n.first()
                                             , dn.p.first()
                                             , i_ms_dn_BOS.darkcss(0.25, false)
                                             , txt
                                             , false
                                             )
if mtf == false
switch
                  itrend := -1
            dn.n.clear()
            dn.p.clear()
if ta.crossover(b.c, sup.p.first())
                  bool CHoCH = na
                  string txt = na
if trend < 0
CHoCH := true
switch
blalert.swingbos := true
                                txt := "BOS"
                                icss := s_ms_up_BOS
                           isdrwS := true
                                      drw := msDraw.new(
                                               sup.n.first()
                                               ,   sup.p.first()
                                               ,   s_ms_up_BOS
                                               ,   txt
                                               ,   true
                                               )
CHoCH =>
                             isdrwS := true
                                        drw := msDraw.new(
                                                 sup.n.first()
                                               , sup.p.first()
                                               , s_ms_up_BOS.darkcss(0.25, true)
                                               , txt
                                               , true
                                               )
if mtf == false
switch
                  trend := 1
            sup.n.clear()
            sup.p.clear()
if ta.crossunder(b.c, sdn.p.first())
                    bool CHoCH = na
                    string txt = na
if trend > 0
CHoCH := true
                    switch
                         not CHoCH =>
bralert.swingbos := true
                                txt := "BOS"
                                icss := s_ms_dn_BOS
                          isdrwS := true
                                     drw := msDraw.new(
                                              sdn.n.first()
                                            , sdn.p.first()
                                            , s_ms_dn_BOS
                                            , txt
                                            , false
                                            )
CHoCH =>
                          isdrwS := true
                                     drw := msDraw.new(
                                              sdn.n.first()
                                            , sdn.p.first()
                                            , s_ms_dn_BOS.darkcss(0.25, false)
                                            , txt
                                            , false
                                            )
if mtf == false
switch
                  trend := -1
            sdn.n.clear()
            sdn.p.clear()
    [css, bear_ob, bull_ob, itrend, drw, isdrw, s_bear_ob, s_bull_ob, trend, icss,
isdrwS]
[css, bear_ob, bull_ob, itrend, drw, isdrw, s_bear_ob, s_bull_ob, trend, icss,
isdrwS] = structure(false)
if isdrw
    f_line(drw, size.small, line.style_dashed)
if isdrwS
    f_line(drw, size.small, line.style_solid)
// ADX Function
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
    up = ta.change(high)
    down = -ta.change(low)
    plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
    truerange = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
    minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
    [plus, minus]
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//{ - END
}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
// Multi-Timeframe Analysis
[_, _, _, itrend5, _, _, _, _, _, _, _]    = request.security("", "5"      ,
structure(true))
[_, _, _, itrend15, _, _, _, _, _, _, _]   = request.security("", "15"     ,
structure(true))
[_, _, _, itrend30, _, _, _, _, _, _, _]   = request.security("", "30"     ,
structure(true))
[_, _, _, itrend1H, _, _, _, _, _, _, _]   = request.security("", "60"     ,
structure(true))
[_, _, _, itrend4H, _, _, _, _, _, _, _]   = request.security("", "240"    ,
structure(true))
[_, _, _, itrend1D, _, _, _, _, _, _, _]   = request.security("", "1440"   ,
structure(true))
[_, _, _, itrend1W, _, _, _, _, _, _, _]   = request.security("", "1W"     ,
structure(true))
[_, _, _, itrend1M, _, _, _, _, _, _, _]   = request.security("", "1M"     ,
structure(true))
// Table headers
if show_itrend5 and show_mtf_str
    table.cell(tab, 0, 1, text = show_itrend5 ? "5m" : "", text_color =
color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor =
chart.bg_color, text_font_family = font.family_monospace, width = 4)
if show_itrend15 and show_mtf_str
    table.cell(tab, 0, 2, text = show_itrend15 ? "15m" : "", text_color =
color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor =
chart.bg_color, text_font_family = font.family_monospace, width = 4)
if show_itrend30 and show_mtf_str
    table.cell(tab, 0, 3, text = show_itrend30 ? "30m" : "", text_color =
color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor =
chart.bg_color, text_font_family = font.family_monospace, width = 4)
if show_itrend1H and show_mtf_str
    table.cell(tab, 0, 4, text = show_itrend1H ? "1H" : "", text_color =
color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor =
chart.bg_color, text_font_family = font.family_monospace, width = 4)
if show_itrend4H and show_mtf_str
    table.cell(tab, 0, 5, text = show_itrend4H ? "4H" : "", text_color =
color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor =
chart.bg_color, text_font_family = font.family_monospace, width = 4)
if show_itrend1D and show_mtf_str
    table.cell(tab, 0, 6, text = show_itrend1D ? "1D" : "", text_color =
color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor =
chart.bg_color, text_font_family = font.family_monospace, width = 4)
if show_itrend1W and show_mtf_str
    table.cell(tab, 0, 7, text = show_itrend1W ? "1W" : "", text_color =
color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor =
chart.bg_color, text_font_family = font.family_monospace, width = 4)
if show_itrend1M and show_mtf_str
    table.cell(tab, 0, 8, text = show_itrend1M ? "1M" : "", text_color =
color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor =
chart.bg_color, text_font_family = font.family_monospace, width = 4)
if show_rsi and show_mtf_str
    table.cell(tab, 0, 9, text = show_rsi ? "RSI" : "", text_color = color.yellow,
text_halign = text.align_center, text_size = size.normal, bgcolor = chart.bg_color,
text_font_family = font.family_monospace, width = 4)
if barstate.isfirst
    var table errorBox = table.new(position.bottom_right, 1, 1, bgcolor =
color.new(#363a45, 100))
    table.cell(errorBox, 0, 0, "© God Slayer",      text_color = color.gray,
text_halign = text.align_center, text_size = size.normal)
zhl(len)=>
    upper = ta.highest(len)
    lower = ta.lowest(len)
[top, btm]
upphl(trend) =>
if top
        phl.stopcross := true
        phl.txtup     := top > phl.topy ? "HH" : "HL"
        if show_lbl
          topl = label.new(
             b.n - swing_r_lookback
           , top
           , phl.txtup
           , color     = invcol
           , textcolor = toplvl
           , style     = label.style_label_down
           , size      = size.small
           )
line.delete(phl.top[1])
    phl.top := line.new(
           b.n - sLen
         , top
         , b.n
         , top
         , color = toplvl)
    phl.topy        :=   top
    phl.topx        :=   b.n - sLen
    phl.tup         :=   top
    phl.tupx        :=   b.n - sLen
if itop
    phl.itopcross := true
    phl.itopy     := itop
    phl.itopx     := b.n - iLen
if barstate.islast
    line.set_xy1(
           phl.top
         , phl.tupx
         , phl.tup
         )
    line.set_xy2(
           phl.top
         , b.n + 50
         , phl.tup
         )
    label.set_x(
           lbl
         , b.n + 50
         )
    label.set_y(
           lbl
         , phl.tup
         )
        dist = math.abs(phl.uV / (phl.uV + phl.dV)) * 100
        label.set_text (lbl, trend < 0
             ? "Strong High | " + str.tostring(phl.uV, format.volume) + " (" +
str.tostring(math.round(dist,0)) + "%)"
             : "Weak High | "   + str.tostring(phl.uV, format.volume) + " (" +
str.tostring(math.round(dist,0)) + "%)")
dnphl(trend) =>
if btm
        phl.sbottomcross := true
        phl.txtdn        := btm > phl.bottomy ? "LH" : "LL"
if show_lbl
              btml = label.new(
                 b.n - swing_r_lookback
               , btm, phl.txtdn
               , color = invcol
               , textcolor = btmlvl
               , style = label.style_label_up
               , size = size.small
               )
line.delete(phl.bottom[1])
        phl.bottom := line.new(
           b.n - sLen
         , btm
         , b.n
         , btm
         , color = btmlvl
         )
        phl.bottomy        :=   btm
        phl.bottomx        :=   b.n - sLen
        phl.tdn            :=   btm
        phl.tdnx           :=   b.n - sLen
if ibtm
        phl.ibottomcross := true
        phl.ibottomy     := ibtm
        phl.ibottomx     := b.n - iLen
        line.set_xy1(
           phl.bottom
         , phl.tdnx
         , phl.tdn
         )
        line.set_xy2(
           phl.bottom
         , b.n + 50
         , phl.tdn
         )
        label.set_x(
           lbl
         , b.n + 50
         )
        label.set_y(
           lbl
         , phl.tdn
         )
midphl() =>
if barstate.islast
hqlzone() =>
if barstate.islast
        dZone.pbx.set_lefttop(int(math.max(phl.topx, phl.bottomx))
, phl.tup)
        dZone.pbx.set_rightbottom(b.n + 50                         , 0.95   * phl.tup
+ 0.05 * phl.tdn)
if show_mtb
    upphl (trend)
    dnphl (trend)
    hqlzone()
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//{ - End
}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//{ - Volumetric Order Block
}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
method drawVOB(bool cdn, bool bull, color css, int loc, bool swing) =>
, [
                 close
             ,   open
             ,   high
             ,   low
             ,   volume
         , lookahead = barmerge.lookahead_off
                                           )
    var obC obj = obC.new(
                   array.new<float>()
                 , array.new<float>()
                 , array.new< int >()
                 , array.new<float>()
                 , array.new<float>()
                 , array.new<float>()
                 , array.new< int >()
                 , array.new< int >()
                 , array.new< int >()
                 , array.new< int >()
                 , array.new<float>()
                 , array.new<float>()
                 , array.new< int >()
                 )
    if barstate.isfirst
        for i = 0 to ob_num - 1
if cdn
        obj.h.clear()
        obj.l.clear()
        obj.n.clear()
             obj.h.push(hH[i])
             obj.l.push(lL[i])
             obj.n.push(b.t[i])
        // obj.h.reverse()
        // obj.l.reverse()
        int iU = obj.l.indexof(obj.l.min()) + 1
        int iD = obj.h.indexof(obj.h.max()) + 1
        obj.dir.unshift(
             bull
                  ? (b.c[iU] > b.o[iU] ? 1 : -1)
                  : (b.c[iD] > b.o[iD] ? 1 : -1)
             )
        obj.top.unshift(
             bull
                  ? pos[iU]
                  : obj.h.max()
             )
        obj.btm.unshift(
             bull
                  ? obj.l.min()
                  : pos[iD]
             )
        obj.left.unshift(
             bull
                  ? obj.n.get(obj.l.indexof(obj.l.min()))
                  : obj.n.get(obj.h.indexof(obj.h.max()))
             )
        obj.avg.unshift(
             math.avg(obj.top.first(), obj.btm.first())
             )
        obj.cV.unshift(
             bull
                  ? b.v[iU]
                  : b.v[iD]
             )
if ob_pos == "Precise"
            switch bull
                true =>
                    if obj.avg.get(0) < (b.c[iU] < b.o[iU] ? b.c[iU] : b.o[iU]) and
obj.top.get(0) > hlcc4[iU]
                         obj.top.set(0, obj.avg.get(0))
                         obj.avg.set(0, math.avg(obj.top.first(), obj.btm.first()))
                false =>
                    if obj.avg.get(0) > (b.c[iU] < b.o[iU] ? b.o[iD] : b.c[iD]) and
obj.btm.get(0) < hlcc4[iD]
                         obj.btm.set(0, obj.avg.get(0))
                         obj.avg.set(0, math.avg(obj.top.first(), obj.btm.first()))
        obj.blVP.unshift ( 0 )
        obj.brVP.unshift ( 0 )
        obj.wM .unshift ( 1 )
if use_overlap
if obj.avg.size() > 1
if bull
if barstate.isconfirmed
for x = 0 to ob_num - 1
            tg = switch ob_mitigation
                "Middle"   => obj.avg
                "Absolute" => bull ? obj.btm : obj.top
             for [idx, pt] in tg
                 if show_breakers
             // Determine the direction of the order block
                     var block_color = bull ? ob_bull_css : ob_bear_css
//
                     if (bull ? cC < pt : cC > pt)
                 // If the condition for mitigated order block is met, swap the
color
                         block_color := bull ? ob_bear_css : ob_bull_css
             // Update the color of the order block accordingly
                         draw.eOB.get(x).set_bgcolor(block_color)
                 else
                     if (bull ? cC < pt : cC > pt)
                         obj.wM   .remove(idx)
                         obj.cV   .remove(idx)
                         obj.dir .remove(idx)
                         obj.top .remove(idx)
                         obj.avg .remove(idx)
                         obj.btm .remove(idx)
                         obj.left .remove(idx)
                         obj.blVP .remove(idx)
                         obj.brVP .remove(idx)
if barstate.islast
if obj.avg.size() > 0
// Alert
             if bull
                  ? ta.crossunder(low , obj.top.get(0))
                  : ta.crossover (high, obj.btm.get(0))
                 switch bull
                     true => blalert.obtouch := true
                     false => bralert.obtouch := true
             float tV = 0
             obj.dV.clear()
             seq = math.min(ob_num - 1, obj.avg.size() - 1)
for j = 0 to seq
tV += obj.cV.get(j)
if j == seq
for y = 0 to seq
                          obj.dV.unshift(
                               math.floor(
                                   (obj.cV.get(y) / tV) * 100)
                           )
                 obj.dV.reverse()
            for i = 0 to math.min(ob_num - 1, obj.avg.size() - 1)
if use_middle_line
                     dmL.set_xy1(obj.left.get(i), obj.avg.get(i))
                     dmL.set_xy2(b.t            , obj.avg.get(i))
if ob_metrics_show
                     rpBL = dblB.get_right()
                     rpBR = dbrB.get_right()
                     dbrB.set_right(rpBR + (b.t - b.t[1]) * obj.brVP.get(i))
                     dblB.set_right(rpBL + (b.t - b.t[1]) * obj.blVP.get(i))
if use_show_metric
txt = switch
                     deOB.set_text(
                          str.tostring(
                          txt + " (" + str.tostring(obj.dV.get(i)) + "%)")
                          )
                     deOB.set_text_size (obtxt.txSz())
                     deOB.set_text_halign(text.align_left)
                     deOB.set_text_color (use_grayscale ? color.silver :
color.new(css, 0))
if obj.wM.size() > 0
            for i = 0 to obj.avg.size() - 1
                      switch obj.dir.get(i)
1 =>
switch obj.wM.get(i)
switch obj.wM.get(i)
if iH
      hN.pop()
      hN.unshift(int(b.n[iLen]))
if iL
      lN.pop()
      lN.unshift(int(b.n[iLen]))
if sH
      hS.pop()
      hS.unshift(int(b.n[sLen]))
if sL
      lS.pop()
      lS.unshift(int(b.n[sLen]))
if ob_show
if bull_ob
    blalert.ob := true
if bear_ob
    bralert.ob := true
if s_bull_ob
    blalert.swingob := true
if s_bear_ob
    blalert.swingob := true
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//{ - End
}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//{ - FVG | VI | OG
}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
    [h, l, c, o]     = ghl()
    [go, gh, gl, gc] = tfG()
    float   pup   =   na
    float   pdn   =   na
    bool    cdn   =   na
    int     pos   =   2
    cc            =   timeframe.change(fvg_tf)
    if barstate.isfirst
for i = 0 to fvg_num - 1
switch what_fvg
"FVG" =>
             pup   :=   bull ?            gl : l
             pdn   :=   bull ?      h        : gh
             cdn   :=   bull ? gl > h and cc : gh < l and cc
             pos   :=   2
"VI" =>
             pup := bull
                  ? (gc > go
                   ? go
                    : gc)
                  : (gc[1] > go[1]
                   ? go[1]
                    : gc[1])
             pdn := bull
                  ? (gc[1] > go[1]
                   ? gc[1]
                    : go[1])
                  : (gc > go
                   ? gc
                    : go)
             cdn := bull
                  ? go > gc[1] and gh[1] > gl and gc > gc[1] and go > go[1] and
gh[1]   < math.min(gc, go) and cc
                  : go < gc[1] and gl[1] < gh and gc < gc[1] and go < go[1] and
gl[1]   > math.max(gc, go) and cc
             pos := 1
"OG" =>
         cords.unshift(
              FVG.new(
                na
              , na
              , bull
               ? true
               : false
              , pup
              , pdn
             , b.t - (b.t - b.t[1]) * pos
             , b.t + (b.t - b.t[1]) * fvg_extend)
             )
        if bull
             blalert.fvg := true
        else
             bralert.fvg := true
if barstate.isconfirmed
cords.remove(idx)
if barstate.islast
if cords.size() > 0
                gbx = draw.box.get(i)
                gln = draw.ln.get(i)
                gcd = cords.get(i)
                gtop   = gcd.top
                gbtm   = gcd.btm
                left = gcd.left
                right = gcd.right
                gbx.set_lefttop(left, gtop)
                gbx.set_rightbottom(right, gbtm)
                gbx.set_bgcolor(gcd.bull ? fvg_upcss : fvg_dncss)
if fvg_enable
    cG(true )
    cG(false)
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//{ - END
}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//{ - Accumulation And Distribution
}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
    if iH
        z.unshift(
             zone.new(
                 chart.point.from_time(
                        time[len]
                      , high [len]
                      )
                      , high [len]
                      , 1
                      , time[len]
                 )
             )
    if iL
        z.unshift(
             zone.new(
                 chart.point.from_time(
                        time[len]
                      , low [len]
                      )
                      , low [len]
                      , -1
                      , time[len]
                 )
             )
    if z.size() > 1
        if z.get(0).c == z.get(1).c
            z.clear()
switch
if z.size() > 5
blalert.zone := true
for i = 0 to 5
slice.unshift(z.get(i).points)
bralert.zone := true
for i = 0 to 5
slice.unshift(z.get(i).points)
if z.size() > 3
blalert.zone := true
for i = 0 to 3
slice.unshift(z.get(i).points)
bralert.zone := true
for i = 0 to 3
slice.unshift(z.get(i).points)
if show_acc_dist_zone
drawZone(iLen)
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//{ - END
}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//{ - EQH / EQL
}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
dEHL() =>
switch
top =>
              mx = math.max(top, w.pt)
              mn = math.min(top, w.pt)
switch
                       var aZ = array.new<line>()
                       var aL = array.new<label>()
if aZ.size() > 50
                           aZ.pop().delete()
                           aL.pop().delete()
bralert.equal := true
              w.pt := top
              w.t := b.n - 1
btm =>
              mx = math.max(btm, w.pb)
              mn = math.min(btm, w.pb)
switch
                       var aZ = array.new<line>()
                       var aL = array.new<label>()
if aZ.size() > 50
                           aZ.pop().delete()
                           aL.pop().delete()
blalert.equal := true
              w.pb := btm
              w.b := b.n - 1
if show_eql
    dEHL()
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//{ - End
}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//
{----------------------------------------------------------------------------------
------------------------------------------------------------}
//Trendlines
trelen = input.int(5, "Period ", tooltip = "Lookback period", inline = "b", group =
"SETTINGS")
cup = input.color(#089981, "", "")
cdn = input.color(#ff0000, "", "")
space = input.float(2, "Padding", tooltip = "Padding distance", inline = "c", group
= "SETTINGS", step = 0.1)
shs = input.bool(false, "Show Breakouts", inline = "z", group = "SETTINGS")
type store
    float src
    int n
type draw
    line[] upln
    line[] dnln
atr = ta.atr(200)
vol() =>
    math.min(atr * 0.1, close * (0.1 / 100))
if ph
    bool remove = false
    var bool valid = false
    upbin.unshift(store.new(b.h[trelen], b.n[trelen]))
    if upbin.size() > 1
        current = upbin.get(0)
        before = upbin.get(1)
        if current.src < before.src
            if broken
                 valid := true
            else
                 valid := false
                 if upbin.size() > 3
                      pastold = upbin.get(3)
                      pastcur = upbin.get(2)
                      now = upbin.get(1)
                      late = upbin.get(0)
                      if now.src < pastcur.src and now.src < pastold.src and late.src
< pastcur.src and late.src < pastold.src
                           valid := true
                      else
                           valid := false
                 else
                      valid := false
            if valid
                if showTrendlines
                     d.upln.unshift(line.new(x1 = before.n, x2 = current.n, y1 =
before.src, y2 = current.src, color = cdn))
                     d.upln.unshift(line.new(x1 = before.n, x2 = current.n, y1 =
before.src - vol() * space, y2 = current.src - vol() * space, color = cdn))
                    ln = d.upln.get(1)
                    for i = 0 to (b.n - before.n)
                        slope = ln.slope()
                        ln.set_x2(b.n[i])
                        ln.set_y2(ln.get_y2() - slope)
                        if low[i] > ln.get_y2()
                            remove := true
                            break
                      if remove
                           d.upln.get(0).delete()
                           d.upln.get(1).delete()
                           d.upln.clear()
                           upbin.clear()
                           broken := true
                      else
                           d.upln.get(0).delete()
                           d.upln.get(1).delete()
                           d.upln.clear()
if d.upln.size() > 1
    btm = d.upln.get(0)
    top = d.upln.get(1)
if d.upln.size() > 1
        slup = top.slope()
        sldn = btm.slope()
        top.set_x2(b.n)
        top.set_y2(top.get_y2() + slup)
        btm.set_x2(b.n)
        btm.set_y2(btm.get_y2() + sldn)
if pl
    bool remove = false
    var bool valid = false
    dnbin.unshift(store.new(b.l[trelen], b.n[trelen]))
    if dnbin.size() > 1
        current = dnbin.get(0)
        before = dnbin.get(1)
        if current.src > before.src
            if broken
                 valid := true
            else
                 valid := false
                 if dnbin.size() > 3
                     pastold = dnbin.get(3)
                     pastcur = dnbin.get(2)
                     now = dnbin.get(1)
                     late = dnbin.get(0)
            if valid
                if showTrendlines
                     d.dnln.unshift(line.new(x1 = before.n, x2 = current.n, y1 =
before.src, y2 = current.src, color = cup))
                     d.dnln.unshift(line.new(x1 = before.n, x2 = current.n, y1 =
before.src + vol() * space, y2 = current.src + vol() * space, color = cup))
                      ln = d.dnln.get(1)
                      for i = 0 to (b.n - before.n)
                          slope = ln.slope()
                          ln.set_x2(b.n[i])
                          ln.set_y2(ln.get_y2() - slope)
                          if high[i] < ln.get_y2()
                              remove := true
                              break
                      if remove
                           d.dnln.get(0).delete()
                           d.dnln.get(1).delete()
                           d.dnln.clear()
                           dnbin.clear()
                           broken := true
                      else
                           d.dnln.get(0).delete()
                           d.dnln.get(1).delete()
                           d.dnln.clear()
if d.dnln.size() > 1
    btm = d.dnln.get(0)
    top = d.dnln.get(1)
if d.dnln.size() > 1
          slup = top.slope()
          sldn = btm.slope()
          top.set_x2(b.n)
          top.set_y2(top.get_y2() + slup)
          btm.set_x2(b.n)
          btm.set_y2(btm.get_y2() + sldn)
// Killzones
//------------------------------------------------------------------------------
//Settings
//-----------------------------------------------------------------------------{
kzGR      = 'Killzones'
asSH      = input(false, '', inline = 'asia', group = kzGR)
asST     = input.string('Asian', '', inline = 'asia', group = kzGR, display = disp)
asS      = input.session('2000-0000', '', inline = 'asia', group = kzGR, display =
disp)
asC      = input.color(color.new(#e91e63, 90), '', inline = 'asia', group = kzGR)
//-----------------------------------------------------------------------------}
// User Defined Types
//-----------------------------------------------------------------------------{
type BB
    box    bxOB
    box    bxBB
    bool   ext    =   true
    bool   bb     =   false
    int    bbI    =   na
    int    lst    =   na
type swing
    float y = na
    int    i = na
    bool    x = false
type pivotPoint
    float h
    int    hi
    bool   hx
    float   l
    int     li
    bool    lx
type KZ
    line    lnT
    line    lnM
    line    lnB
    line    lnO
    label   lb
    label   lbO
type DWM
    line ln
    label lb
type MSS
    line    ln
    box     bx
//-----------------------------------------------------------------------------}
// Variables
//-----------------------------------------------------------------------------{
tfM = timeframe.multiplier
nyam    = not na(time(timeframe.period, nyS   , 'UTC-5')) and nySH   and tfM <= kzSH
ldnO = not na(time(timeframe.period, ldnOS,   'UTC-5')) and ldnOSH and tfM <= kzSH
ldnC = not na(time(timeframe.period, ldnCS,   'UTC-5')) and ldnCSH and tfM <= kzSH
asian = not na(time(timeframe.period, asS ,   'UTC-5')) and asSH   and tfM <= kzSH
//-----------------------------------------------------------------------------}
// Functions / Methods
//-----------------------------------------------------------------------------{
method killzones(KZ _id, _s, _kz, _o, _h, _l, _c, _t, _cr, _tx, _mml, _ml, _lb,
_le, _ol, _olC, _olL, areaCss)=>
    var float max = na, var float mid = na, var float min = na
    var int sbT = na, var bool xt = na, var bool xb = na
    var box area = na
    var tC = color.rgb(color.r(_cr), color.g(_cr), color.b(_cr))
        if _mml
            _id.lnT := line.new(sbT, max, sbT, max, xloc.bar_time, color = tC)//,
xt := true
            _id.lnB := line.new(sbT, min, sbT, min, xloc.bar_time, color = tC)//,
xb := true
        if _ml
            _id.lnM := line.new(sbT, mid, sbT, mid, xloc.bar_time, color = tC,
style = line.style_dotted)
        if _ol
            _id.lnO := line.new(sbT, _o, sbT, _o, xloc.bar_time, color =
color.new(_olC, 0), style = line.style_dotted)
            if _olL
                _id.lbO := label.new(sbT, _o, 'KZO(' + str.tostring(_o,
format.mintick) + ')', xloc.bar_time, color = color(na), style =
label.style_label_left, textcolor = color.new(_olC, 0), size = size.tiny)
        if _lb
            _id.lb := label.new(sbT, max, _tx, xloc.bar_time, color = #ffffff00,
style = label.style_label_down, textcolor = tC, size = size.small)
    if _s
        max := math.max(_h, max)
        min := math.min(_l, min)
        mid := math.avg(max, min)
        xt := true
        xb := true
        area.set_top(max)
        area.set_rightbottom(bar_index, min)
        if _lb
            label.set_x(_id.lb, int(math.avg(_t, sbT))), label.set_y(_id.lb, max)
        if _mml
            _id.lnT.set_y1(max), _id.lnT.set_xy2(_t, max)
            _id.lnB.set_y1(min), _id.lnB.set_xy2(_t, min)
        if _ml
            _id.lnM.set_y1(mid), _id.lnM.set_xy2(_t, mid)
        if _ol
            _id.lnO.set_x2(_t)
            if _olL
                _id.lbO.set_x(_t)
        if _mml
            if xt
                if _h < _id.lnT.get_y1()
                     _id.lnT.set_x2(_t)
                else
                     _id.lnT.set_x2(_t)
                     xt := false
            if xb
                if _l > _id.lnB.get_y1()
                     _id.lnB.set_x2(_t)
                else
                     _id.lnB.set_x2(_t)
                     xb := false
        if _ml
            _id.lnM.set_x2(_t)
method pDWM(DWM _id, _tC, _t, _o, _cl, _lbTX, _olL) =>
    if _tC
        _id.lb.delete()
        _id.ln := line.new(_t, _o, _t, _o, xloc.bar_time, extend.none,
color.new(_cl, 0), line.style_dotted, 1)
         if _olL
             _id.lb := label.new(_t, _o, _lbTX + '(' + str.tostring(_o,
format.mintick) + ')', xloc.bar_time, yloc.price, color(na),
label.style_label_left, color.new(_cl, 0), size.tiny)
    else
         _id.ln.set_x2(_t)
        if _olL
            _id.lb.set_x(_t)
        na
//-----------------------------------------------------------------------------}
// Calculations - Killzones
//-----------------------------------------------------------------------------{
kzO = dwmO == 'Killzones'
bgcolor(dwmS and not kzO and timeframe.isintraday and tfM <= kzSH ? xChg ? dwmC :
na : na)
pvhh = ta.pivothigh(pvllen, 0)
pvll = ta.pivotlow(pvllen, 0)
f_get_candle(_index) =>
    [open[_index], high[_index], low[_index], close[_index], bar_index[_index]]
f_sfp() =>
    [so, sh, sl, sc, si] = f_get_candle(0)
    // High SFP
    hc1 = pvhh
    maxp = high[1]
    hc2 = false
    hx = 0
    hy = 0.0
    for i=1 to lookback
        [co, ch, cl, cc, ci] = f_get_candle(i)
        if ch >= sh
             break
        if ch < sh and ch > math.max(so, sc) and pvhh[bar_index - ci] and ch > maxp
             hc2 := true
             hx := bar_index[i]
             hy := ch
        if ch > maxp
             maxp := ch
    // Low SFP
    lc1 = pvll
    minp = low[1]
    lc2 = false
    lx = 0
    ly = 0.0
    for i=2 to lookback
        [co, ch, cl, cc, ci] = f_get_candle(i)
        if cl < sl
             break
        if sl < cl and math.min(so, sc) > cl and pvll[bar_index - ci] and cl < minp
             lc2 := true
             lx := bar_index[i]
             ly := cl
        if cl < minp
             minp := cl
if show_sfp
    if hsfp
        line.new(hx, hy, bar_index + 1, hy, color=#f23645)
        alert("High SFP Detected!", alert.freq_once_per_bar)
plotshape(hsfp ? high : na, "High SFP", style=shape.triangledown,
location=location.abovebar, color=#f23645, text="SFP", textcolor=#f23645,
size=size.tiny)
if lsfp
    line.new(lx, ly, bar_index + 1, ly, color=#089981)
    alert("Low SFP Detected!", alert.freq_once_per_bar)
plotshape(lsfp ? low : na, "Low SFP", style=shape.triangleup,
location=location.belowbar, color=#089981, text="SFP", textcolor=#089981,
size=size.tiny)
// Internal Bullish
bool i_bull_bos     = input.bool(false, "I - Bullish BOS     ", inline = 'Bull BOS',
group = 'MARKET STRUCTURES ANY ALERT()')
bool i_bull_choch = input.bool(false, "I - Bullish CHoCH ", inline = 'Bull
CHoCH', group = 'MARKET STRUCTURES ANY ALERT()')
bool i_bull_chochp = input.bool(false, "I - Bullish CHoCH+ ", inline = 'Bull
CHoCH+', group = 'MARKET STRUCTURES ANY ALERT()')
var bool bl_alert_fvg = input(false, "Bullish FVG", inline = 'Bull FVG', group =
'MARKET STRUCTURES ANY ALERT()')
var bool bl_alert_ob = input(false, "I - Bullish OB", inline = 'Bull OB', group =
'MARKET STRUCTURES ANY ALERT()')
var bool bl_alert_swingob = input(false, "S - Bullish OB", inline = 'Bull OB',
group = 'MARKET STRUCTURES ANY ALERT()')
var bool bl_alert_zone = input(false, "Accumulation Zone", inline = 'Bull FVG',
group = 'MARKET STRUCTURES ANY ALERT()')
var bool bl_alert_obtouch = input(false, "Candle Inside Bullish OB ", inline =
'Bull OB', group = 'MARKET STRUCTURES ANY ALERT()')
// Swing Bullish
bool s_bull_bos     = input.bool(false, "S - Bullish BOS", inline = 'Bull BOS',
group = 'MARKET STRUCTURES ANY ALERT()')
bool s_bull_choch = input.bool(false, "S - Bullish CHoCH", inline = 'Bull CHoCH',
group = 'MARKET STRUCTURES ANY ALERT()')
bool s_bull_chochp = input.bool(false, "S - Bullish CHoCH+", inline = 'Bull
CHoCH+', group = "MARKET STRUCTURES ANY ALERT()")
// Internal Bearish
bool i_bear_bos     = input.bool(false, "I - Bearish BOS   ", inline = 'Bear BOS',
group = 'MARKET STRUCTURES ANY ALERT()')
bool i_bear_choch = input.bool(false, "I - Bearish CHoCH ", inline = 'Bear
CHoCH', group = 'MARKET STRUCTURES ANY ALERT()')
bool i_bear_chochp = input.bool(false, "I - Bearish CHoCH+ ", inline = 'Bear
CHoCH+', group = 'MARKET STRUCTURES ANY ALERT()')
var bool br_alert_fvg = input(false, "Bearish FVG", inline = 'Bear FVG', group =
'MARKET STRUCTURES ANY ALERT()')
var bool br_alert_ob = input(false, "I - Bearish OB", inline = 'Bear OB', group =
'MARKET STRUCTURES ANY ALERT()')
var bool br_alert_swingob = input(false, "S - Bearish OB", inline = 'Bear OB',
group = 'MARKET STRUCTURES ANY ALERT()')
var bool br_alert_zone = input(false, "Distribution Zone", inline = 'Bear FVG',
group = 'MARKET STRUCTURES ANY ALERT()')
var bool br_alert_obtouch = input(false, "Candle Inside Bearish OB", inline = 'Bear
OB', group = 'MARKET STRUCTURES ANY ALERT()')
// Swing Bearish
bool s_bear_bos    = input.bool(false, "S - Bearish BOS", inline = 'Bear BOS',
group = 'MARKET STRUCTURES ANY ALERT()')
bool s_bear_choch = input.bool(false, "S - Bearish CHoCH", inline = 'Bear CHoCH',
group = 'MARKET STRUCTURES ANY ALERT()')
bool s_bear_chochp = input.bool(false, "S - Bearish CHoCH+", inline = 'Bear
CHoCH+', group = 'MARKET STRUCTURES ANY ALERT()')
//-----------------------------------------------------------------------------}
    // Alerts
//-----------------------------------------------------------------------------{
var bool any_condition_triggered = false
// Internal Bullish
alertcondition(blalert.bos              , title = "Bullish BOS", message = "Bullish
BOS has occured")
alertcondition(blalert.choch            , "Bullish CHOCH", "Bullish CHOCH has
occured")
alertcondition(blalert.chochplus        , "Bullish CHOCH+", "Bullish CHOCH+ has
occured")
// Swing Bullish
alertcondition(blalert.swingbos         , "Bullish Swing BOS", "Bullish Swing BOS
has occured")
alertcondition(blalert.chochswing       , "Bullish Swing CHOCH", "Bullish CHOCH has
occured")
alertcondition(blalert.chochplusswing   , "Bullish Swing CHOCH+", "Bullish Swing
CHOCH+ has occured")
// Internal Bearish
alertcondition(bralert.bos              , "Bearish BOS", "Bearish BOS has occured")
alertcondition(bralert.choch            , "Bearish CHOCH", "Bearish CHOCH has
occured")
alertcondition(bralert.chochplus        , "Bearish CHOCH+", "Bearish CHOCH+ has
occured")
// Swing Bearish
alertcondition(bralert.swingbos         , "Bearish Swing BOS", "Bearish Swing BOS
has occured")
alertcondition(bralert.chochswing       , "Bearish Swing CHOCH", "Bearish CHOCH has
occured")
alertcondition(bralert.chochplusswing   , "Bearish Swing CHOCH+", "Bearish Swing
CHOCH+ has occured")
// Equal High/Low
alertcondition(blalert.equal , "EQL", "Equal lows formed")
alertcondition(bralert.equal , "EQH", "Equal highs formed")