Smart money concepts [LuxAlgo]

Viewing 13 posts - 1 through 13 (of 13 total)
  • Author
    Posts
  • #222137 quote
    vaddan
    Participant
    Junior

    Hi !

    Is it possible to convert this indicator into PRT code, this smart money indicator is free on TradingView and it is most advanced and complete out there.

    Here is a link to the TradingView version of this with descriptions etc.

    https://www.tradingview.com/script/CnB3fSph-Smart-Money-Concepts-LuxAlgo/

    Thanks in advance 🙂

    Here is the code.

    // 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/
    // © LuxAlgo

    //@version=5
    indicator(“Smart Money Concepts [LuxAlgo]”, “Smart Money Concepts [LuxAlgo]”
    , overlay = true
    , max_labels_count = 500
    , max_lines_count = 500
    , max_boxes_count = 500
    , max_bars_back = 500)
    //—————————————————————————–{
    //Constants
    //—————————————————————————–{
    color TRANSP_CSS = #ffffff00

    //Tooltips
    string MODE_TOOLTIP = ‘Allows to display historical Structure or only the recent ones’
    string STYLE_TOOLTIP = ‘Indicator color theme’
    string COLOR_CANDLES_TOOLTIP = ‘Display additional candles with a color reflecting the current trend detected by structure’
    string SHOW_INTERNAL = ‘Display internal market structure’
    string CONFLUENCE_FILTER = ‘Filter non significant internal structure breakouts’
    string SHOW_SWING = ‘Display swing market Structure’
    string SHOW_SWING_POINTS = ‘Display swing point as labels on the chart’
    string SHOW_SWHL_POINTS = ‘Highlight most recent strong and weak high/low points on the chart’
    string INTERNAL_OB = ‘Display internal order blocks on the chart\n\nNumber of internal order blocks to display on the chart’
    string SWING_OB = ‘Display swing order blocks on the chart\n\nNumber of internal swing blocks to display on the chart’
    string FILTER_OB = ‘Method used to filter out volatile order blocks \n\nIt is recommended to use the cumulative mean range method when a low amount of data is available’
    string SHOW_EQHL = ‘Display equal highs and equal lows on the chart’
    string EQHL_BARS = ‘Number of bars used to confirm equal highs and equal lows’
    string EQHL_THRESHOLD = ‘Sensitivity threshold in a range (0, 1) used for the detection of equal highs & lows\n\nLower values will return fewer but more pertinent results’
    string SHOW_FVG = ‘Display fair values gaps on the chart’
    string AUTO_FVG = ‘Filter out non significant fair value gaps’
    string FVG_TF = ‘Fair value gaps timeframe’
    string EXTEND_FVG = ‘Determine how many bars to extend the Fair Value Gap boxes on chart’
    string PED_ZONES = ‘Display premium, discount, and equilibrium zones on chart’

    //—————————————————————————–{
    //Settings
    //—————————————————————————–{
    //General
    //—————————————-{
    mode = input.string(‘Historical’
    , options = [‘Historical’, ‘Present’]
    , group = ‘Smart Money Concepts’
    , tooltip = MODE_TOOLTIP)

    style = input.string(‘Colored’
    , options = [‘Colored’, ‘Monochrome’]
    , group = ‘Smart Money Concepts’
    , tooltip = STYLE_TOOLTIP)

    show_trend = input(false, ‘Color Candles’
    , group = ‘Smart Money Concepts’
    , tooltip = COLOR_CANDLES_TOOLTIP)

    //—————————————-}
    //Internal Structure
    //—————————————-{
    show_internals = input(true, ‘Show Internal Structure’
    , group = ‘Real Time Internal Structure’
    , tooltip = SHOW_INTERNAL)

    show_ibull = input.string(‘All’, ‘Bullish Structure’
    , options = [‘All’, ‘BOS’, ‘CHoCH’]
    , inline = ‘ibull’
    , group = ‘Real Time Internal Structure’)

    swing_ibull_css = input(#089981, ”
    , inline = ‘ibull’
    , group = ‘Real Time Internal Structure’)

    //Bear Structure
    show_ibear = input.string(‘All’, ‘Bearish Structure’
    , options = [‘All’, ‘BOS’, ‘CHoCH’]
    , inline = ‘ibear’
    , group = ‘Real Time Internal Structure’)

    swing_ibear_css = input(#f23645, ”
    , inline = ‘ibear’
    , group = ‘Real Time Internal Structure’)

    ifilter_confluence = input(false, ‘Confluence Filter’
    , group = ‘Real Time Internal Structure’
    , tooltip = CONFLUENCE_FILTER)

    internal_structure_size = input.string(‘Tiny’, ‘Internal Label Size’
    , options = [‘Tiny’, ‘Small’, ‘Normal’]
    , group = ‘Real Time Internal Structure’)

    //—————————————-}
    //Swing Structure
    //—————————————-{
    show_Structure = input(true, ‘Show Swing Structure’
    , group = ‘Real Time Swing Structure’
    , tooltip = SHOW_SWING)

    //Bull Structure
    show_bull = input.string(‘All’, ‘Bullish Structure’
    , options = [‘All’, ‘BOS’, ‘CHoCH’]
    , inline = ‘bull’
    , group = ‘Real Time Swing Structure’)

    swing_bull_css = input(#089981, ”
    , inline = ‘bull’
    , group = ‘Real Time Swing Structure’)

    //Bear Structure
    show_bear = input.string(‘All’, ‘Bearish Structure’
    , options = [‘All’, ‘BOS’, ‘CHoCH’]
    , inline = ‘bear’
    , group = ‘Real Time Swing Structure’)

    swing_bear_css = input(#f23645, ”
    , inline = ‘bear’
    , group = ‘Real Time Swing Structure’)

    swing_structure_size = input.string(‘Small’, ‘Swing Label Size’
    , options = [‘Tiny’, ‘Small’, ‘Normal’]
    , group = ‘Real Time Swing Structure’)

    //Swings
    show_swings = input(false, ‘Show Swings Points’
    , inline = ‘swings’
    , group = ‘Real Time Swing Structure’
    , tooltip = SHOW_SWING_POINTS)

    length = input.int(50, ”
    , minval = 10
    , inline = ‘swings’
    , group = ‘Real Time Swing Structure’)

    show_hl_swings = input(true, ‘Show Strong/Weak High/Low’
    , group = ‘Real Time Swing Structure’
    , tooltip = SHOW_SWHL_POINTS)

    //—————————————-}
    //Order Blocks
    //—————————————-{
    show_iob = input(true, ‘Internal Order Blocks’
    , inline = ‘iob’
    , group = ‘Order Blocks’
    , tooltip = INTERNAL_OB)

    iob_showlast = input.int(5, ”
    , minval = 1
    , inline = ‘iob’
    , group = ‘Order Blocks’)

    show_ob = input(false, ‘Swing Order Blocks’
    , inline = ‘ob’
    , group = ‘Order Blocks’
    , tooltip = SWING_OB)

    ob_showlast = input.int(5, ”
    , minval = 1
    , inline = ‘ob’
    , group = ‘Order Blocks’)

    ob_filter = input.string(‘Atr’, ‘Order Block Filter’
    , options = [‘Atr’, ‘Cumulative Mean Range’]
    , group = ‘Order Blocks’
    , tooltip = FILTER_OB)

    ibull_ob_css = input.color(color.new(#3179f5, 80), ‘Internal Bullish OB’
    , group = ‘Order Blocks’)

    ibear_ob_css = input.color(color.new(#f77c80, 80), ‘Internal Bearish OB’
    , group = ‘Order Blocks’)

    bull_ob_css = input.color(color.new(#1848cc, 80), ‘Bullish OB’
    , group = ‘Order Blocks’)

    bear_ob_css = input.color(color.new(#b22833, 80), ‘Bearish OB’
    , group = ‘Order Blocks’)

    //—————————————-}
    //EQH/EQL
    //—————————————-{
    show_eq = input(true, ‘Equal High/Low’
    , group = ‘EQH/EQL’
    , tooltip = SHOW_EQHL)

    eq_len = input.int(3, ‘Bars Confirmation’
    , minval = 1
    , group = ‘EQH/EQL’
    , tooltip = EQHL_BARS)

    eq_threshold = input.float(0.1, ‘Threshold’
    , minval = 0
    , maxval = 0.5
    , step = 0.1
    , group = ‘EQH/EQL’
    , tooltip = EQHL_THRESHOLD)

    eq_size = input.string(‘Tiny’, ‘Label Size’
    , options = [‘Tiny’, ‘Small’, ‘Normal’]
    , group = ‘EQH/EQL’)

    //—————————————-}
    //Fair Value Gaps
    //—————————————-{
    show_fvg = input(false, ‘Fair Value Gaps’
    , group = ‘Fair Value Gaps’
    , tooltip = SHOW_FVG)

    fvg_auto = input(true, “Auto Threshold”
    , group = ‘Fair Value Gaps’
    , tooltip = AUTO_FVG)

    fvg_tf = input.timeframe(”, “Timeframe”
    , group = ‘Fair Value Gaps’
    , tooltip = FVG_TF)

    bull_fvg_css = input.color(color.new(#00ff68, 70), ‘Bullish FVG’
    , group = ‘Fair Value Gaps’)

    bear_fvg_css = input.color(color.new(#ff0008, 70), ‘Bearish FVG’
    , group = ‘Fair Value Gaps’)

    fvg_extend = input.int(1, “Extend FVG”
    , minval = 0
    , group = ‘Fair Value Gaps’
    , tooltip = EXTEND_FVG)

    //—————————————-}
    //Previous day/week high/low
    //—————————————-{
    //Daily
    show_pdhl = input(false, ‘Daily’
    , inline = ‘daily’
    , group = ‘Highs & Lows MTF’)

    pdhl_style = input.string(‘⎯⎯⎯’, ”
    , options = [‘⎯⎯⎯’, ‘—-‘, ‘····’]
    , inline = ‘daily’
    , group = ‘Highs & Lows MTF’)

    pdhl_css = input(#2157f3, ”
    , inline = ‘daily’
    , group = ‘Highs & Lows MTF’)

    //Weekly
    show_pwhl = input(false, ‘Weekly’
    , inline = ‘weekly’
    , group = ‘Highs & Lows MTF’)

    pwhl_style = input.string(‘⎯⎯⎯’, ”
    , options = [‘⎯⎯⎯’, ‘—-‘, ‘····’]
    , inline = ‘weekly’
    , group = ‘Highs & Lows MTF’)

    pwhl_css = input(#2157f3, ”
    , inline = ‘weekly’
    , group = ‘Highs & Lows MTF’)

    //Monthly
    show_pmhl = input(false, ‘Monthly’
    , inline = ‘monthly’
    , group = ‘Highs & Lows MTF’)

    pmhl_style = input.string(‘⎯⎯⎯’, ”
    , options = [‘⎯⎯⎯’, ‘—-‘, ‘····’]
    , inline = ‘monthly’
    , group = ‘Highs & Lows MTF’)

    pmhl_css = input(#2157f3, ”
    , inline = ‘monthly’
    , group = ‘Highs & Lows MTF’)

    //—————————————-}
    //Premium/Discount zones
    //—————————————-{
    show_sd = input(false, ‘Premium/Discount Zones’
    , group = ‘Premium & Discount Zones’
    , tooltip = PED_ZONES)

    premium_css = input.color(#f23645, ‘Premium Zone’
    , group = ‘Premium & Discount Zones’)

    eq_css = input.color(#b2b5be, ‘Equilibrium Zone’
    , group = ‘Premium & Discount Zones’)

    discount_css = input.color(#089981, ‘Discount Zone’
    , group = ‘Premium & Discount Zones’)

    //—————————————————————————–}
    //Functions
    //—————————————————————————–{
    n = bar_index

    atr = ta.atr(200)
    cmean_range = ta.cum(high – low) / n

    //HL Output function
    hl() => [high, low]

    //Get ohlc values function
    get_ohlc()=> [close[1], open[1], high, low, high[2], low[2]]

    //Display Structure function
    display_Structure(x, y, txt, css, dashed, down, lbl_size)=>
    structure_line = line.new(x, y, n, y
    , color = css
    , style = dashed ? line.style_dashed : line.style_solid)

    structure_lbl = label.new(int(math.avg(x, n)), y, txt
    , color = TRANSP_CSS
    , textcolor = css
    , style = down ? label.style_label_down : label.style_label_up
    , size = lbl_size)

    if mode == ‘Present’
    line.delete(structure_line[1])
    label.delete(structure_lbl[1])

    //Swings detection/measurements
    swings(len)=>
    var os = 0

    upper = ta.highest(len)
    lower = ta.lowest(len)

    os := high[len] > upper ? 0 : low[len] < lower ? 1 : os[1]

    top = os == 0 and os[1] != 0 ? high[len] : 0
    btm = os == 1 and os[1] != 1 ? low[len] : 0

    [top, btm]

    //Order block coordinates function
    ob_coord(use_max, loc, target_top, target_btm, target_left, target_type)=>
    min = 99999999.
    max = 0.
    idx = 1

    ob_threshold = ob_filter == ‘Atr’ ? atr : cmean_range

    //Search for highest/lowest high within the structure interval and get range
    if use_max
    for i = 1 to (n – loc)-1
    if (high[i] – low[i]) < ob_threshold[i] * 2
    max := math.max(high[i], max)
    min := max == high[i] ? low[i] : min
    idx := max == high[i] ? i : idx
    else
    for i = 1 to (n – loc)-1
    if (high[i] – low[i]) < ob_threshold[i] * 2
    min := math.min(low[i], min)
    max := min == low[i] ? high[i] : max
    idx := min == low[i] ? i : idx

    array.unshift(target_top, max)
    array.unshift(target_btm, min)
    array.unshift(target_left, time[idx])
    array.unshift(target_type, use_max ? -1 : 1)

    //Set order blocks
    display_ob(boxes, target_top, target_btm, target_left, target_type, show_last, swing, size)=>
    for i = 0 to math.min(show_last-1, size-1)
    get_box = array.get(boxes, i)

    box.set_lefttop(get_box, array.get(target_left, i), array.get(target_top, i))
    box.set_rightbottom(get_box, array.get(target_left, i), array.get(target_btm, i))
    box.set_extend(get_box, extend.right)

    color css = na

    if swing
    if style == ‘Monochrome’
    css := array.get(target_type, i) == 1 ? color.new(#b2b5be, 80) : color.new(#5d606b, 80)
    border_css = array.get(target_type, i) == 1 ? #b2b5be : #5d606b
    box.set_border_color(get_box, border_css)
    else
    css := array.get(target_type, i) == 1 ? bull_ob_css : bear_ob_css
    box.set_border_color(get_box, css)

    box.set_bgcolor(get_box, css)
    else
    if style == ‘Monochrome’
    css := array.get(target_type, i) == 1 ? color.new(#b2b5be, 80) : color.new(#5d606b, 80)
    else
    css := array.get(target_type, i) == 1 ? ibull_ob_css : ibear_ob_css

    box.set_border_color(get_box, css)
    box.set_bgcolor(get_box, css)

    //Line Style function
    get_line_style(style) =>
    out = switch style
    ‘⎯⎯⎯’ => line.style_solid
    ‘—-‘ => line.style_dashed
    ‘····’ => line.style_dotted

    //Set line/labels function for previous high/lows
    phl(h, l, tf, css)=>
    var line high_line = line.new(na,na,na,na
    , xloc = xloc.bar_time
    , color = css
    , style = get_line_style(pdhl_style))

    var label high_lbl = label.new(na,na
    , xloc = xloc.bar_time
    , text = str.format(‘P{0}H’, tf)
    , color = TRANSP_CSS
    , textcolor = css
    , size = size.small
    , style = label.style_label_left)

    var line low_line = line.new(na,na,na,na
    , xloc = xloc.bar_time
    , color = css
    , style = get_line_style(pdhl_style))

    var label low_lbl = label.new(na,na
    , xloc = xloc.bar_time
    , text = str.format(‘P{0}L’, tf)
    , color = TRANSP_CSS
    , textcolor = css
    , size = size.small
    , style = label.style_label_left)

    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
    ext = time + (time – time[1])*20

    //High
    line.set_xy1(high_line, hx, hy)
    line.set_xy2(high_line, ext, hy)

    label.set_xy(high_lbl, ext, hy)

    //Low
    line.set_xy1(low_line, lx, ly)
    line.set_xy2(low_line, ext, ly)

    label.set_xy(low_lbl, ext, ly)

    //—————————————————————————–}
    //Global variables
    //—————————————————————————–{
    var trend = 0, var itrend = 0

    var top_y = 0., var top_x = 0
    var btm_y = 0., var btm_x = 0

    var itop_y = 0., var itop_x = 0
    var ibtm_y = 0., var ibtm_x = 0

    var trail_up = high, var trail_dn = low
    var trail_up_x = 0, var trail_dn_x = 0

    var top_cross = true, var btm_cross = true
    var itop_cross = true, var ibtm_cross = true

    var txt_top = ”, var txt_btm = ”

    //Alerts
    bull_choch_alert = false
    bull_bos_alert = false

    bear_choch_alert = false
    bear_bos_alert = false

    bull_ichoch_alert = false
    bull_ibos_alert = false

    bear_ichoch_alert = false
    bear_ibos_alert = false

    bull_iob_break = false
    bear_iob_break = false

    bull_ob_break = false
    bear_ob_break = false

    eqh_alert = false
    eql_alert = false

    //Structure colors
    var bull_css = style == ‘Monochrome’ ? #b2b5be
    : swing_bull_css

    var bear_css = style == ‘Monochrome’ ? #b2b5be
    : swing_bear_css

    var ibull_css = style == ‘Monochrome’ ? #b2b5be
    : swing_ibull_css

    var ibear_css = style == ‘Monochrome’ ? #b2b5be
    : swing_ibear_css

    //Labels size
    var internal_structure_lbl_size = internal_structure_size == ‘Tiny’
    ? size.tiny
    : internal_structure_size == ‘Small’
    ? size.small
    : size.normal

    var swing_structure_lbl_size = swing_structure_size == ‘Tiny’
    ? size.tiny
    : swing_structure_size == ‘Small’
    ? size.small
    : size.normal

    var eqhl_lbl_size = eq_size == ‘Tiny’
    ? size.tiny
    : eq_size == ‘Small’
    ? size.small
    : size.normal

    //Swings
    [top, btm] = swings(length)

    [itop, ibtm] = swings(5)

    //—————————————————————————–}
    //Pivot High
    //—————————————————————————–{
    var line extend_top = na

    var label extend_top_lbl = label.new(na, na
    , color = TRANSP_CSS
    , textcolor = bear_css
    , style = label.style_label_down
    , size = size.tiny)

    if top
    top_cross := true
    txt_top := top > top_y ? ‘HH’ : ‘LH’

    if show_swings
    top_lbl = label.new(n-length, top, txt_top
    , color = TRANSP_CSS
    , textcolor = bear_css
    , style = label.style_label_down
    , size = swing_structure_lbl_size)

    if mode == ‘Present’
    label.delete(top_lbl[1])

    //Extend recent top to last bar
    line.delete(extend_top[1])
    extend_top := line.new(n-length, top, n, top
    , color = bear_css)

    top_y := top
    top_x := n – length

    trail_up := top
    trail_up_x := n – length

    if itop
    itop_cross := true

    itop_y := itop
    itop_x := n – 5

    //Trailing maximum
    trail_up := math.max(high, trail_up)
    trail_up_x := trail_up == high ? n : trail_up_x

    //Set top extension label/line
    if barstate.islast and show_hl_swings
    line.set_xy1(extend_top, trail_up_x, trail_up)
    line.set_xy2(extend_top, n + 20, trail_up)

    label.set_x(extend_top_lbl, n + 20)
    label.set_y(extend_top_lbl, trail_up)
    label.set_text(extend_top_lbl, trend < 0 ? ‘Strong High’ : ‘Weak High’)

    //—————————————————————————–}
    //Pivot Low
    //—————————————————————————–{
    var line extend_btm = na

    var label extend_btm_lbl = label.new(na, na
    , color = TRANSP_CSS
    , textcolor = bull_css
    , style = label.style_label_up
    , size = size.tiny)

    if btm
    btm_cross := true
    txt_btm := btm < btm_y ? ‘LL’ : ‘HL’

    if show_swings
    btm_lbl = label.new(n – length, btm, txt_btm
    , color = TRANSP_CSS
    , textcolor = bull_css
    , style = label.style_label_up
    , size = swing_structure_lbl_size)

    if mode == ‘Present’
    label.delete(btm_lbl[1])

    //Extend recent btm to last bar
    line.delete(extend_btm[1])
    extend_btm := line.new(n – length, btm, n, btm
    , color = bull_css)

    btm_y := btm
    btm_x := n-length

    trail_dn := btm
    trail_dn_x := n-length

    if ibtm
    ibtm_cross := true

    ibtm_y := ibtm
    ibtm_x := n – 5

    //Trailing minimum
    trail_dn := math.min(low, trail_dn)
    trail_dn_x := trail_dn == low ? n : trail_dn_x

    //Set btm extension label/line
    if barstate.islast and show_hl_swings
    line.set_xy1(extend_btm, trail_dn_x, trail_dn)
    line.set_xy2(extend_btm, n + 20, trail_dn)

    label.set_x(extend_btm_lbl, n + 20)
    label.set_y(extend_btm_lbl, trail_dn)
    label.set_text(extend_btm_lbl, trend > 0 ? ‘Strong Low’ : ‘Weak Low’)

    //—————————————————————————–}
    //Order Blocks Arrays
    //—————————————————————————–{
    var iob_top = array.new_float(0)
    var iob_btm = array.new_float(0)
    var iob_left = array.new_int(0)
    var iob_type = array.new_int(0)

    var ob_top = array.new_float(0)
    var ob_btm = array.new_float(0)
    var ob_left = array.new_int(0)
    var ob_type = array.new_int(0)

    //—————————————————————————–}
    //Pivot High BOS/CHoCH
    //—————————————————————————–{
    //Filtering
    var bull_concordant = true

    if ifilter_confluence
    bull_concordant := high – math.max(close, open) > math.min(close, open – low)

    //Detect internal bullish Structure
    if ta.crossover(close, itop_y) and itop_cross and top_y != itop_y and bull_concordant
    bool choch = na

    if itrend < 0
    choch := true
    bull_ichoch_alert := true
    else
    bull_ibos_alert := true

    txt = choch ? ‘CHoCH’ : ‘BOS’

    if show_internals
    if show_ibull == ‘All’ or (show_ibull == ‘BOS’ and not choch) or (show_ibull == ‘CHoCH’ and choch)
    display_Structure(itop_x, itop_y, txt, ibull_css, true, true, internal_structure_lbl_size)

    itop_cross := false
    itrend := 1

    //Internal Order Block
    if show_iob
    ob_coord(false, itop_x, iob_top, iob_btm, iob_left, iob_type)

    //Detect bullish Structure
    if ta.crossover(close, top_y) and top_cross
    bool choch = na

    if trend < 0
    choch := true
    bull_choch_alert := true
    else
    bull_bos_alert := true

    txt = choch ? ‘CHoCH’ : ‘BOS’

    if show_Structure
    if show_bull == ‘All’ or (show_bull == ‘BOS’ and not choch) or (show_bull == ‘CHoCH’ and choch)
    display_Structure(top_x, top_y, txt, bull_css, false, true, swing_structure_lbl_size)

    //Order Block
    if show_ob
    ob_coord(false, top_x, ob_top, ob_btm, ob_left, ob_type)

    top_cross := false
    trend := 1

    //—————————————————————————–}
    //Pivot Low BOS/CHoCH
    //—————————————————————————–{
    var bear_concordant = true

    if ifilter_confluence
    bear_concordant := high – math.max(close, open) < math.min(close, open – low)

    //Detect internal bearish Structure
    if ta.crossunder(close, ibtm_y) and ibtm_cross and btm_y != ibtm_y and bear_concordant
    bool choch = false

    if itrend > 0
    choch := true
    bear_ichoch_alert := true
    else
    bear_ibos_alert := true

    txt = choch ? ‘CHoCH’ : ‘BOS’

    if show_internals
    if show_ibear == ‘All’ or (show_ibear == ‘BOS’ and not choch) or (show_ibear == ‘CHoCH’ and choch)
    display_Structure(ibtm_x, ibtm_y, txt, ibear_css, true, false, internal_structure_lbl_size)

    ibtm_cross := false
    itrend := -1

    //Internal Order Block
    if show_iob
    ob_coord(true, ibtm_x, iob_top, iob_btm, iob_left, iob_type)

    //Detect bearish Structure
    if ta.crossunder(close, btm_y) and btm_cross
    bool choch = na

    if trend > 0
    choch := true
    bear_choch_alert := true
    else
    bear_bos_alert := true

    txt = choch ? ‘CHoCH’ : ‘BOS’

    if show_Structure
    if show_bear == ‘All’ or (show_bear == ‘BOS’ and not choch) or (show_bear == ‘CHoCH’ and choch)
    display_Structure(btm_x, btm_y, txt, bear_css, false, false, swing_structure_lbl_size)

    //Order Block
    if show_ob
    ob_coord(true, btm_x, ob_top, ob_btm, ob_left, ob_type)

    btm_cross := false
    trend := -1

    //—————————————————————————–}
    //Order Blocks
    //—————————————————————————–{
    //Set order blocks
    var iob_boxes = array.new_box(0)
    var ob_boxes = array.new_box(0)

    //Delete internal order blocks box coordinates if top/bottom is broken
    for element in iob_type
    index = array.indexof(iob_type, element)

    if close < array.get(iob_btm, index) and element == 1
    array.remove(iob_top, index)
    array.remove(iob_btm, index)
    array.remove(iob_left, index)
    array.remove(iob_type, index)
    bull_iob_break := true

    else if close > array.get(iob_top, index) and element == -1
    array.remove(iob_top, index)
    array.remove(iob_btm, index)
    array.remove(iob_left, index)
    array.remove(iob_type, index)
    bear_iob_break := true

    //Delete internal order blocks box coordinates if top/bottom is broken
    for element in ob_type
    index = array.indexof(ob_type, element)

    if close < array.get(ob_btm, index) and element == 1
    array.remove(ob_top, index)
    array.remove(ob_btm, index)
    array.remove(ob_left, index)
    array.remove(ob_type, index)
    bull_ob_break := true

    else if close > array.get(ob_top, index) and element == -1
    array.remove(ob_top, index)
    array.remove(ob_btm, index)
    array.remove(ob_left, index)
    array.remove(ob_type, index)
    bear_ob_break := true

    iob_size = array.size(iob_type)
    ob_size = array.size(ob_type)

    if barstate.isfirst
    if show_iob
    for i = 0 to iob_showlast-1
    array.push(iob_boxes, box.new(na,na,na,na, xloc = xloc.bar_time))
    if show_ob
    for i = 0 to ob_showlast-1
    array.push(ob_boxes, box.new(na,na,na,na, xloc = xloc.bar_time))

    if iob_size > 0
    if barstate.islast
    display_ob(iob_boxes, iob_top, iob_btm, iob_left, iob_type, iob_showlast, false, iob_size)

    if ob_size > 0
    if barstate.islast
    display_ob(ob_boxes, ob_top, ob_btm, ob_left, ob_type, ob_showlast, true, ob_size)

    //—————————————————————————–}
    //EQH/EQL
    //—————————————————————————–{
    var eq_prev_top = 0.
    var eq_top_x = 0

    var eq_prev_btm = 0.
    var eq_btm_x = 0

    if show_eq
    eq_top = ta.pivothigh(eq_len, eq_len)
    eq_btm = ta.pivotlow(eq_len, eq_len)

    if eq_top
    max = math.max(eq_top, eq_prev_top)
    min = math.min(eq_top, eq_prev_top)

    if max < min + atr * eq_threshold
    eqh_line = line.new(eq_top_x, eq_prev_top, n-eq_len, eq_top
    , color = bear_css
    , style = line.style_dotted)

    eqh_lbl = label.new(int(math.avg(n-eq_len, eq_top_x)), eq_top, ‘EQH’
    , color = #00000000
    , textcolor = bear_css
    , style = label.style_label_down
    , size = eqhl_lbl_size)

    if mode == ‘Present’
    line.delete(eqh_line[1])
    label.delete(eqh_lbl[1])

    eqh_alert := true

    eq_prev_top := eq_top
    eq_top_x := n-eq_len

    if eq_btm
    max = math.max(eq_btm, eq_prev_btm)
    min = math.min(eq_btm, eq_prev_btm)

    if min > max – atr * eq_threshold
    eql_line = line.new(eq_btm_x, eq_prev_btm, n-eq_len, eq_btm
    , color = bull_css
    , style = line.style_dotted)

    eql_lbl = label.new(int(math.avg(n-eq_len, eq_btm_x)), eq_btm, ‘EQL’
    , color = #00000000
    , textcolor = bull_css
    , style = label.style_label_up
    , size = eqhl_lbl_size)

    eql_alert := true

    if mode == ‘Present’
    line.delete(eql_line[1])
    label.delete(eql_lbl[1])

    eq_prev_btm := eq_btm
    eq_btm_x := n-eq_len

    //—————————————————————————–}
    //Fair Value Gaps
    //—————————————————————————–{
    var bullish_fvg_max = array.new_box(0)
    var bullish_fvg_min = array.new_box(0)

    var bearish_fvg_max = array.new_box(0)
    var bearish_fvg_min = array.new_box(0)

    float bullish_fvg_avg = na
    float bearish_fvg_avg = na

    bullish_fvg_cnd = false
    bearish_fvg_cnd = false

    [src_c1, src_o1, src_h, src_l, src_h2, src_l2] =
    request.security(syminfo.tickerid, fvg_tf, get_ohlc())

    if show_fvg
    delta_per = (src_c1 – src_o1) / src_o1 * 100

    change_tf = timeframe.change(fvg_tf)

    threshold = fvg_auto ? ta.cum(math.abs(change_tf ? delta_per : 0)) / n * 2
    : 0

    //FVG conditions
    bullish_fvg_cnd := src_l > src_h2
    and src_c1 > src_h2
    and delta_per > threshold
    and change_tf

    bearish_fvg_cnd := src_h < src_l2
    and src_c1 < src_l2
    and -delta_per > threshold
    and change_tf

    //FVG Areas
    if bullish_fvg_cnd
    array.unshift(bullish_fvg_max, box.new(n-1, src_l, n + fvg_extend, math.avg(src_l, src_h2)
    , border_color = bull_fvg_css
    , bgcolor = bull_fvg_css))

    array.unshift(bullish_fvg_min, box.new(n-1, math.avg(src_l, src_h2), n + fvg_extend, src_h2
    , border_color = bull_fvg_css
    , bgcolor = bull_fvg_css))

    if bearish_fvg_cnd
    array.unshift(bearish_fvg_max, box.new(n-1, src_h, n + fvg_extend, math.avg(src_h, src_l2)
    , border_color = bear_fvg_css
    , bgcolor = bear_fvg_css))

    array.unshift(bearish_fvg_min, box.new(n-1, math.avg(src_h, src_l2), n + fvg_extend, src_l2
    , border_color = bear_fvg_css
    , bgcolor = bear_fvg_css))

    for bx in bullish_fvg_min
    if low < box.get_bottom(bx)
    box.delete(bx)
    box.delete(array.get(bullish_fvg_max, array.indexof(bullish_fvg_min, bx)))

    for bx in bearish_fvg_max
    if high > box.get_top(bx)
    box.delete(bx)
    box.delete(array.get(bearish_fvg_min, array.indexof(bearish_fvg_max, bx)))

    //—————————————————————————–}
    //Previous day/week high/lows
    //—————————————————————————–{
    //Daily high/low
    [pdh, pdl] = request.security(syminfo.tickerid, ‘D’, hl()
    , lookahead = barmerge.lookahead_on)

    //Weekly high/low
    [pwh, pwl] = request.security(syminfo.tickerid, ‘W’, hl()
    , lookahead = barmerge.lookahead_on)

    //Monthly high/low
    [pmh, pml] = request.security(syminfo.tickerid, ‘M’, hl()
    , lookahead = barmerge.lookahead_on)

    //Display Daily
    if show_pdhl
    phl(pdh, pdl, ‘D’, pdhl_css)

    //Display Weekly
    if show_pwhl
    phl(pwh, pwl, ‘W’, pwhl_css)

    //Display Monthly
    if show_pmhl
    phl(pmh, pml, ‘M’, pmhl_css)

    //—————————————————————————–}
    //Premium/Discount/Equilibrium zones
    //—————————————————————————–{
    var premium = box.new(na, na, na, na
    , bgcolor = color.new(premium_css, 80)
    , border_color = na)

    var premium_lbl = label.new(na, na
    , text = ‘Premium’
    , color = TRANSP_CSS
    , textcolor = premium_css
    , style = label.style_label_down
    , size = size.small)

    var eq = box.new(na, na, na, na
    , bgcolor = color.rgb(120, 123, 134, 80)
    , border_color = na)

    var eq_lbl = label.new(na, na
    , text = ‘Equilibrium’
    , color = TRANSP_CSS
    , textcolor = eq_css
    , style = label.style_label_left
    , size = size.small)

    var discount = box.new(na, na, na, na
    , bgcolor = color.new(discount_css, 80)
    , border_color = na)

    var discount_lbl = label.new(na, na
    , text = ‘Discount’
    , color = TRANSP_CSS
    , textcolor = discount_css
    , style = label.style_label_up
    , size = size.small)

    //Show Premium/Discount Areas
    if barstate.islast and show_sd
    avg = math.avg(trail_up, trail_dn)

    box.set_lefttop(premium, math.max(top_x, btm_x), trail_up)
    box.set_rightbottom(premium, n, .95 * trail_up + .05 * trail_dn)

    label.set_xy(premium_lbl, int(math.avg(math.max(top_x, btm_x), n)), trail_up)

    box.set_lefttop(eq, math.max(top_x, btm_x), .525 * trail_up + .475*trail_dn)
    box.set_rightbottom(eq, n, .525 * trail_dn + .475 * trail_up)

    label.set_xy(eq_lbl, n, avg)

    box.set_lefttop(discount, math.max(top_x, btm_x), .95 * trail_dn + .05 * trail_up)
    box.set_rightbottom(discount, n, trail_dn)
    label.set_xy(discount_lbl, int(math.avg(math.max(top_x, btm_x), n)), trail_dn)

    //—————————————————————————–}
    //Trend
    //—————————————————————————–{
    var color trend_css = na

    if show_trend
    if style == ‘Colored’
    trend_css := itrend == 1 ? bull_css : bear_css
    else if style == ‘Monochrome’
    trend_css := itrend == 1 ? #b2b5be : #5d606b

    plotcandle(open, high, low, close
    , color = trend_css
    , wickcolor = trend_css
    , bordercolor = trend_css
    , editable = false)

    //—————————————————————————–}
    //Alerts
    //—————————————————————————–{
    //Internal Structure
    alertcondition(bull_ibos_alert, ‘Internal Bullish BOS’, ‘Internal Bullish BOS formed’)
    alertcondition(bull_ichoch_alert, ‘Internal Bullish CHoCH’, ‘Internal Bullish CHoCH formed’)

    alertcondition(bear_ibos_alert, ‘Internal Bearish BOS’, ‘Internal Bearish BOS formed’)
    alertcondition(bear_ichoch_alert, ‘Internal Bearish CHoCH’, ‘Internal Bearish CHoCH formed’)

    //Swing Structure
    alertcondition(bull_bos_alert, ‘Bullish BOS’, ‘Internal Bullish BOS formed’)
    alertcondition(bull_choch_alert, ‘Bullish CHoCH’, ‘Internal Bullish CHoCH formed’)

    alertcondition(bear_bos_alert, ‘Bearish BOS’, ‘Bearish BOS formed’)
    alertcondition(bear_choch_alert, ‘Bearish CHoCH’, ‘Bearish CHoCH formed’)

    //order Blocks
    alertcondition(bull_iob_break, ‘Bullish Internal OB Breakout’, ‘Price broke bullish internal OB’)
    alertcondition(bear_iob_break, ‘Bearish Internal OB Breakout’, ‘Price broke bearish internal OB’)

    alertcondition(bull_ob_break, ‘Bullish Swing OB Breakout’, ‘Price broke bullish swing OB’)
    alertcondition(bear_ob_break, ‘Bearish Swing OB Breakout’, ‘Price broke bearish swing OB’)

    //EQH/EQL
    alertcondition(eqh_alert, ‘Equal Highs’, ‘Equal highs detected’)
    alertcondition(eql_alert, ‘Equal Lows’, ‘Equal lows detected’)

    //FVG
    alertcondition(bullish_fvg_cnd, ‘Bullish FVG’, ‘Bullish FVG formed’)
    alertcondition(bearish_fvg_cnd, ‘Bearish FVG’, ‘Bearish FVG formed’)

    //—————————————————————————–}

    #235900 quote
    Iván González
    Moderator
    Master

    Hi,
    Here you have the code:

    //--------------------------------------------------------------------------------//
    //PRC_Smart Money Concepts
    //version = 0
    //29.07.2024
    //Iván González @ www.prorealcode.com
    //Sharing ProRealTime knowledge
    //--------------------------------------------------------------------------------//
    //-----Inputs---------------------------------------------------------------------//
    length=50
    n=barindex
    showswings=1
    showHLswings=1
    showinternals=1
    showibull=1//1=all 2=bos 3=CHoCH
    showibear=1//1=all 2=bos 3=CHoCH
    showStructure=1
    showbull=1//1=all 2=bos 3=CHoCH
    showbear=1//1=all 2=bos 3=CHoCH
    showOB=1
    showiOB=1
    showlastOB=5
    ifilterConfluence=0
    obFilter=1 //1=ATR 0=Cumulative mean Range
    //--------------------------------------------------------------------------------//
    //--------------------------------------------------------------------------------//
    atr=averagetruerange[200](close)
    cmeanrange=summation[max(1,n)](high-low)/n
    //--------------------------------------------------------------------------------//
    //-----Swings---------------------------------------------------------------------//
    //---Swing length
    os=0
    upper=highest[length](high)
    lower=lowest[length](low)
    
    if high[length]>upper then
    os=0
    elsif low[length]<lower then
    os=1
    else
    os=os[1]
    endif
    
    if os=0 and os[1]<>0 then
    mytop=high[length]
    else
    mytop=0
    endif
    
    if os=1 and os[1]<>1 then
    mybot=low[length]
    else
    mybot=0
    endif
    //---Swing 5
    os1=0
    upper1=highest[5](high)
    lower1=lowest[5](low)
    
    if high[5]>upper1 then
    os1=0
    elsif low[5]<lower1 then
    os1=1
    else
    os1=os1[1]
    endif
    
    if os1=0 and os1[1]<>0 then
    itop=high[5]
    else
    itop=0
    endif
    
    if os1=1 and os1[1]<>1 then
    ibot=low[5]
    else
    ibot=0
    endif
    //--------------------------------------------------------------------------------//
    //-----Pivot High-----------------------------------------------------------------//
    if mytop then
    topcross=1
    
    if showswings then
    if mytop>topy then
    drawtext("HH",n-length,mytop+atr*0.5)coloured("red")
    else
    drawtext("LH",n-length,mytop+atr*0.5)coloured("red")
    endif
    endif
    
    topy=mytop
    topx=n-length
    
    trailup=mytop
    trailupx=n-length
    endif
    
    if itop then
    itopcross=1
    
    itopy=itop
    itopx=n-5
    endif
    
    //Trailing maximun
    trailup=max(high,trailup)
    if trailup=high then
    trailupx=n
    else
    trailupx=trailupx
    endif
    
    //--------------------------------------------------------------------------------//
    //-----Pivot Low------------------------------------------------------------------//
    if mybot then
    botcross=1
    
    if showswings then
    if mybot<boty then
    drawtext("LL",n-length,mybot-atr*0.5)coloured("green")
    else
    drawtext("HL",n-length,mybot-atr*0.5)coloured("green")
    endif
    endif
    
    boty=mybot
    botx=n-length
    
    traildn=mybot
    traildnx=n-length
    endif
    
    if ibot then
    ibotcross=1
    
    iboty=ibot
    ibotx=n-5
    endif
    
    //Trailing maximun
    traildn=min(low,traildn)
    if traildn=low then
    traildnx=n
    else
    traildnx=traildnx
    endif
    //--------------------------------------------------------------------------------//
    //-----Pivot High BOS/CHoCH-------------------------------------------------------//
    bullConcordant=1
    if ifilterConfluence then
    bullConcordant=high-max(close,open)>min(close,open-low)
    endif
    //Detect internal bullish structure
    if close crosses over itopy and itopcross and topy<>itopy and bullConcordant then
    choch=undefined
    if itrend<0 then
    choch=1
    bullichochalert=1
    else
    bullibosalert=1
    endif
    if showinternals then
    if showibull=1 or (showibull=2 and not choch) or (showibull=3 and choch) then
    drawsegment(itopx,itopy,barindex,itopy)style(dottedline)coloured("green")
    if choch then
    drawtext("CHoCH",(itopx+barindex)/2,itopy+0.25*atr)coloured("green")
    else
    drawtext("BOS",(itopx+barindex)/2,itopy+0.25*atr)coloured("green")
    endif
    endif
    endif
    
    itopcross=0
    itrend=1
    
    //Internal order block
    if showiOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-itopx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    minim=min(low[i],minim)
    if minim=low[i] then
    maxim=high[i]
    idx=i
    else
    maxim=maxim
    idx=idx
    endif
    endif
    next
    
    $itargetTop[t+1]=maxim
    $itargetBot[t+1]=minim
    $itargetLeft[t+1]=barindex[idx]
    $itargetRight[t+1]=n
    $itargetType[t+1]=1
    t=t+1
    endif
    endif
    //Detect bullish Structure
    if close crosses over topy and topcross then
    choch=undefined
    if trend<0 then
    choch=1
    bullchochalert=1
    else
    bulbosalert=1
    endif
    
    if showStructure then
    if showbull=1 or (showbull=2 and not choch) or (showbull=3 and choch) then
    drawsegment(topx,topy,barindex,topy)style(line)coloured("green")
    if choch then
    drawtext("CHoCH",(topx+barindex)/2,topy+0.25*atr)coloured("green")
    else
    drawtext("BOS",(topx+barindex)/2,topy+0.25*atr)coloured("green")
    endif
    endif
    endif
    //order block
    if showOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-topx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    minim=min(low[i],minim)
    if minim=low[i] then
    maxim=high[i]
    idx=i
    else
    maxim=maxim
    idx=idx
    endif
    endif
    next
    
    $targetTop[r+1]=maxim
    $targetBot[r+1]=minim
    $targetLeft[r+1]=barindex[idx]
    $targetRight[r+1]=n
    $targetType[r+1]=1
    r=r+1
    endif
    
    topcross=0
    trend=1
    endif
    //--------------------------------------------------------------------------------//
    //-----Pivot Low BOS/CHoCH--------------------------------------------------------//
    bearConcordant=1
    if ifilterConfluence then
    bearConcordant=high-max(close,open)<min(close,open-low)
    endif
    //Detect internal bearish Structure
    if close crosses under iboty and ibotcross and boty<>iboty and bearConcordant then
    choch=0
    if itrend>0 then
    choch=1
    bearichochalert=1
    else
    bearichochalert=1
    endif
    if showinternals then
    if showibear=1 or (showibear=2 and not choch) or (showibear=3 and choch) then
    drawsegment(ibotx,iboty,barindex,iboty)style(dottedline)coloured("red")
    if choch then
    drawtext("CHoCH",(ibotx+barindex)/2,iboty-0.25*atr)coloured("red")
    else
    drawtext("BOS",(ibotx+barindex)/2,iboty-0.25*atr)coloured("red")
    endif
    endif
    endif
    
    ibotcross=0
    itrend=-1
    
    //Internal order block
    if showiOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-ibotx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    maxim=max(high[i],maxim)
    if maxim=high[i] then
    minim=low[i]
    idx=i
    else
    minim=minim
    idx=idx
    endif
    endif
    next
    
    $itargetTop[t+1]=maxim
    $itargetBot[t+1]=minim
    $itargetLeft[t+1]=barindex[idx]
    $itargetRight[t+1]=n
    $itargetType[t+1]=-1
    t=t+1
    endif
    endif
    //Detect Bullish Strcuture
    if close crosses under boty and botcross then
    choch=undefined
    if trend>0 then
    choch=1
    bearchochalert=1
    else
    bearbosalert=1
    endif
    
    if showStructure then
    if showbear=1 or (showbear=2 and not choch) or (showbear=3 and choch) then
    drawsegment(botx,boty,n,boty)style(line)coloured("red")
    if choch then
    drawtext("CHoCH",(botx+n)/2,boty+0.25*atr)coloured("red")
    else
    drawtext("BOS",(botx+n)/2,boty+0.25*atr)coloured("red")
    endif
    endif
    endif
    //order block
    if showOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-botx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    maxim=max(high[i],maxim)
    if maxim=high[i] then
    minim=low[i]
    idx=i
    else
    minim=minim
    idx=idx
    endif
    endif
    next
    
    $targetTop[r+1]=maxim
    $targetBot[r+1]=minim
    $targetLeft[r+1]=barindex[idx]
    $targetRight[r+1]=n
    $targetType[r+1]=-1
    r=r+1
    endif
    
    botcross=0
    trend=-1
    endif
    //--------------------------------------------------------------------------------//
    //-----Order Blocks---------------------------------------------------------------//
    //---Delete internal Order Blocks
    for j=t downto 0 do
    if close < $itargetBot[j] and $itargetType[j]=1 then
    $itargetTop[j]=0
    $itargetBot[j]=0
    $itargetLeft[j]=0
    $itargetRight[j]=0
    $itargetType[j]=undefined
    elsif close > $itargetTop[j] and $itargetType[j]=-1 then
    $itargetTop[j]=0
    $itargetBot[j]=0
    $itargetLeft[j]=0
    $itargetRight[j]=0
    $itargetType[j]=0
    endif
    next
    //---Delete structural Order Blocks
    for j=r downto 0 do
    if close < $targetBot[j] and $targetType[j]=1 then
    $targetTop[j]=0
    $targetBot[j]=0
    $targetLeft[j]=0
    $targetRight[j]=0
    $targetType[j]=undefined
    elsif close > $targetTop[j] and $targetType[j]=-1 then
    $targetTop[j]=0
    $targetBot[j]=0
    $targetLeft[j]=0
    $targetRight[j]=0
    $targetType[j]=0
    endif
    next
    //---Plot Order Blocks if not broken
    countiOB=0
    countOB=0
    if islastbarupdate then
    //---Internal Order Blocks
    for i=t downto 0 do
    if $itargetBot[i]=0 then
    countiOB=countiOB
    else
    countiOB=countiOB+1
    if countiOB = showlastOB then
    break
    else
    if close > $itargetTop[i] then
    drawrectangle($itargetLeft[i],$itargetBot[i],n+20,$itargetTop[i])coloured("green",0)fillcolor("green",50)
    elsif close <$itargetBot[i] then
    drawrectangle($itargetLeft[i],$itargetBot[i],n+20,$itargetTop[i])coloured("red",0)fillcolor("red",50)
    else
    drawrectangle($itargetLeft[i],$itargetBot[i],n+20,$itargetTop[i])coloured("yellow",0)fillcolor("yellow",50)
    endif
    endif
    endif
    next
    //---Structural Order Blocks
    for i=r downto 0 do
    if $targetBot[i]=0 then
    countOB=countOB
    else
    countOB=countOB+1
    if countOB = showlastOB then
    break
    else
    if close > $targetTop[i] then
    drawrectangle($targetLeft[i],$targetBot[i],n+20,$targetTop[i])coloured("green",0)fillcolor("green",100)
    elsif close <$targetBot[i] then
    drawrectangle($targetLeft[i],$targetBot[i],n+20,$targetTop[i])coloured("red",0)fillcolor("red",100)
    else
    drawrectangle($targetLeft[i],$targetBot[i],n+20,$targetTop[i])coloured("yellow",0)fillcolor("yellow",100)
    endif
    endif
    endif
    next
    endif
    //--------------------------------------------------------------------------------//
    //-----Top and Bottom extension---------------------------------------------------//
    if islastbarupdate and showhlswings then
    drawsegment(traildnx,traildn,n+20,traildn)coloured("blue")
    drawsegment(trailupx,trailup,n+20,trailup)coloured("red")
    if trend>0 then
    drawtext("Strong Low",(traildnx+n+20)/2,traildn-0.35*atr)coloured("blue")
    drawtext("Weak High",(trailupx+n+20)/2,trailup+0.35*atr)coloured("red")
    else
    drawtext("Weak Low",(traildnx+n+20)/2,traildn-0.35*atr)coloured("blue")
    drawtext("Strong High",(trailupx+n+20)/2,trailup+0.35*atr)coloured("red")
    endif
    endif
    //--------------------------------------------------------------------------------//
    return 
    Razz thanked this post
    #235907 quote
    Razz
    Participant
    Master

    Good morning Iván Thank you for your great work!

    The indicator does have errors when it runs for a while, the fonts for Weak High/Low + Strong High overlap. Some bars overlap and become darker. If the time setting is changed everything is fine again and after a few minutes it starts again from the beginning.

    #235914 quote
    Iván González
    Moderator
    Master

    Hi, yes. you can solve it with defparam drawlastonlastbaronly=true

    #235915 quote
    Iván González
    Moderator
    Master

    Or better if we work just with arrays. Now the code should work fine

    defparam drawonlastbaronly=true
    //--------------------------------------------------------------------------------//
    //PRC_Smart Money Concepts
    //version = 1
    //29.07.2024
    //Iván González @ www.prorealcode.com
    //Sharing ProRealTime knowledge
    //--------------------------------------------------------------------------------//
    //-----Inputs---------------------------------------------------------------------//
    length=50
    n=barindex
    showswings=1
    showHLswings=1
    showinternals=1
    showibull=1//1=all 2=bos 3=CHoCH
    showibear=1//1=all 2=bos 3=CHoCH
    showStructure=1
    showbull=1//1=all 2=bos 3=CHoCH
    showbear=1//1=all 2=bos 3=CHoCH
    showOB=1
    showiOB=1
    showlastOB=5
    ifilterConfluence=0
    obFilter=1 //1=ATR 0=Cumulative mean Range
    //--------------------------------------------------------------------------------//
    //--------------------------------------------------------------------------------//
    atr=averagetruerange[200](close)
    cmeanrange=summation[max(1,n)](high-low)/n
    //--------------------------------------------------------------------------------//
    //-----Swings---------------------------------------------------------------------//
    //---Swing length
    os=0
    upper=highest[length](high)
    lower=lowest[length](low)
    
    if high[length]>upper then
    os=0
    elsif low[length]<lower then
    os=1
    else
    os=os[1]
    endif
    
    if os=0 and os[1]<>0 then
    mytop=high[length]
    else
    mytop=0
    endif
    
    if os=1 and os[1]<>1 then
    mybot=low[length]
    else
    mybot=0
    endif
    //---Swing 5
    os1=0
    upper1=highest[5](high)
    lower1=lowest[5](low)
    
    if high[5]>upper1 then
    os1=0
    elsif low[5]<lower1 then
    os1=1
    else
    os1=os1[1]
    endif
    
    if os1=0 and os1[1]<>0 then
    itop=high[5]
    else
    itop=0
    endif
    
    if os1=1 and os1[1]<>1 then
    ibot=low[5]
    else
    ibot=0
    endif
    //--------------------------------------------------------------------------------//
    //-----Pivot High-----------------------------------------------------------------//
    if mytop then
    topcross=1
    
    if showswings then
    if mytop>topy then
    $phy[z+1]=mytop
    $phx[z+1]=n-length
    $phtype[z+1]=1
    z=z+1
    else
    $phy[z+1]=mytop
    $phx[z+1]=n-length
    $phtype[z+1]=-1
    z=z+1
    endif
    endif
    
    topy=mytop
    topx=n-length
    
    trailup=mytop
    trailupx=n-length
    endif
    
    if itop then
    itopcross=1
    
    itopy=itop
    itopx=n-5
    endif
    
    //Trailing maximun
    trailup=max(high,trailup)
    if trailup=high then
    trailupx=n
    else
    trailupx=trailupx
    endif
    
    //--------------------------------------------------------------------------------//
    //-----Pivot Low------------------------------------------------------------------//
    if mybot then
    botcross=1
    
    if showswings then
    if mybot<boty then
    $ply[k+1]=mybot
    $plx[k+1]=n-length
    $pltype[k+1]=1
    k=k+1
    else
    $ply[k+1]=mybot
    $plx[k+1]=n-length
    $pltype[k+1]=-1
    k=k+1
    endif
    endif
    
    boty=mybot
    botx=n-length
    
    traildn=mybot
    traildnx=n-length
    endif
    
    if ibot then
    ibotcross=1
    
    iboty=ibot
    ibotx=n-5
    endif
    
    //Trailing maximun
    traildn=min(low,traildn)
    if traildn=low then
    traildnx=n
    else
    traildnx=traildnx
    endif
    //--------------------------------------------------------------------------------//
    //-----Pivot High BOS/CHoCH-------------------------------------------------------//
    bullConcordant=1
    if ifilterConfluence then
    bullConcordant=high-max(close,open)>min(close,open-low)
    endif
    //Detect internal bullish structure
    if close crosses over itopy and itopcross and topy<>itopy and bullConcordant then
    choch=undefined
    if itrend<0 then
    choch=1
    bullichochalert=1
    else
    bullibosalert=1
    endif
    if showinternals then
    if showibull=1 or (showibull=2 and not choch) or (showibull=3 and choch) then
    $itopx[m+1]=itopx
    $itopy[m+1]=itopy
    $ichoch[m+1]=choch
    $iright[m+1]=barindex
    m=m+1
    endif
    endif
    
    itopcross=0
    itrend=1
    
    //Internal order block
    if showiOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-itopx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    minim=min(low[i],minim)
    if minim=low[i] then
    maxim=high[i]
    idx=i
    else
    maxim=maxim
    idx=idx
    endif
    endif
    next
    
    $itargetTop[t+1]=maxim
    $itargetBot[t+1]=minim
    $itargetLeft[t+1]=barindex[idx]
    $itargetRight[t+1]=n
    $itargetType[t+1]=1
    t=t+1
    endif
    endif
    //Detect bullish Structure
    if close crosses over topy and topcross then
    choch=undefined
    if trend<0 then
    choch=1
    endif
    
    if showStructure then
    if showbull=1 or (showbull=2 and not choch) or (showbull=3 and choch) then
    $topx[g+1]=topx
    $topy[g+1]=topy
    $topchoch[g+1]=choch
    $right[g+1]=barindex
    g=g+1
    endif
    endif
    //order block
    if showOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-topx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    minim=min(low[i],minim)
    if minim=low[i] then
    maxim=high[i]
    idx=i
    else
    maxim=maxim
    idx=idx
    endif
    endif
    next
    
    $targetTop[r+1]=maxim
    $targetBot[r+1]=minim
    $targetLeft[r+1]=barindex[idx]
    $targetRight[r+1]=n
    $targetType[r+1]=1
    r=r+1
    endif
    
    topcross=0
    trend=1
    endif
    //--------------------------------------------------------------------------------//
    //-----Pivot Low BOS/CHoCH--------------------------------------------------------//
    bearConcordant=1
    if ifilterConfluence then
    bearConcordant=high-max(close,open)<min(close,open-low)
    endif
    //Detect internal bearish Structure
    if close crosses under iboty and ibotcross and boty<>iboty and bearConcordant then
    choch=0
    if itrend>0 then
    choch=1
    bearichochalert=1
    else
    bearichochalert=1
    endif
    if showinternals then
    if showibear=1 or (showibear=2 and not choch) or (showibear=3 and choch) then
    $ibotx[s+1]=ibotx
    $iboty[s+1]=iboty
    $ibotchoch[s+1]=choch
    $ibotright[s+1]=barindex
    s=s+1
    endif
    endif
    
    ibotcross=0
    itrend=-1
    
    //Internal order block
    if showiOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-ibotx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    maxim=max(high[i],maxim)
    if maxim=high[i] then
    minim=low[i]
    idx=i
    else
    minim=minim
    idx=idx
    endif
    endif
    next
    
    $itargetTop[t+1]=maxim
    $itargetBot[t+1]=minim
    $itargetLeft[t+1]=barindex[idx]
    $itargetRight[t+1]=n
    $itargetType[t+1]=-1
    t=t+1
    endif
    endif
    //Detect Bullish Strcuture
    if close crosses under boty and botcross then
    choch=undefined
    if trend>0 then
    choch=1
    bearchochalert=1
    else
    bearbosalert=1
    endif
    
    if showStructure then
    if showbear=1 or (showbear=2 and not choch) or (showbear=3 and choch) then
    $botx[w+1]=botx
    $boty[w+1]=boty
    $botchoch[w+1]=choch
    $botright[w+1]=barindex
    w=w+1
    endif
    endif
    //order block
    if showOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-botx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    maxim=max(high[i],maxim)
    if maxim=high[i] then
    minim=low[i]
    idx=i
    else
    minim=minim
    idx=idx
    endif
    endif
    next
    
    $targetTop[r+1]=maxim
    $targetBot[r+1]=minim
    $targetLeft[r+1]=barindex[idx]
    $targetRight[r+1]=n
    $targetType[r+1]=-1
    r=r+1
    endif
    
    botcross=0
    trend=-1
    endif
    //--------------------------------------------------------------------------------//
    //-----Order Blocks---------------------------------------------------------------//
    //--------------------------------------------------------------------------------//
    //Delete internal Order Blocks
    for j=t downto 0 do
    if close < $itargetBot[j] and $itargetType[j]=1 then
    $itargetTop[j]=0
    $itargetBot[j]=0
    $itargetLeft[j]=0
    $itargetRight[j]=0
    $itargetType[j]=undefined
    elsif close > $itargetTop[j] and $itargetType[j]=-1 then
    $itargetTop[j]=0
    $itargetBot[j]=0
    $itargetLeft[j]=0
    $itargetRight[j]=0
    $itargetType[j]=0
    endif
    next
    //Delete structural Order Blocks
    for j=r downto 0 do
    if close < $targetBot[j] and $targetType[j]=1 then
    $targetTop[j]=0
    $targetBot[j]=0
    $targetLeft[j]=0
    $targetRight[j]=0
    $targetType[j]=undefined
    elsif close > $targetTop[j] and $targetType[j]=-1 then
    $targetTop[j]=0
    $targetBot[j]=0
    $targetLeft[j]=0
    $targetRight[j]=0
    $targetType[j]=0
    endif
    next
    //Plot Order Blocks if not broken
    countiOB=0
    countOB=0
    if islastbarupdate then
    //---Internal Order Blocks
    for i=t downto 0 do
    if $itargetBot[i]=0 then
    countiOB=countiOB
    else
    countiOB=countiOB+1
    if countiOB = showlastOB then
    break
    else
    if close > $itargetTop[i] then
    drawrectangle($itargetLeft[i],$itargetBot[i],n+20,$itargetTop[i])coloured("green",0)fillcolor("green",50)
    elsif close <$itargetBot[i] then
    drawrectangle($itargetLeft[i],$itargetBot[i],n+20,$itargetTop[i])coloured("red",0)fillcolor("red",50)
    else
    drawrectangle($itargetLeft[i],$itargetBot[i],n+20,$itargetTop[i])coloured("yellow",0)fillcolor("yellow",50)
    endif
    endif
    endif
    next
    //---Structural Order Blocks
    for i=r downto 0 do
    if $targetBot[i]=0 then
    countOB=countOB
    else
    countOB=countOB+1
    if countOB = showlastOB then
    break
    else
    if close > $targetTop[i] then
    drawrectangle($targetLeft[i],$targetBot[i],n+20,$targetTop[i])coloured("green",0)fillcolor("green",100)
    elsif close <$targetBot[i] then
    drawrectangle($targetLeft[i],$targetBot[i],n+20,$targetTop[i])coloured("red",0)fillcolor("red",100)
    else
    drawrectangle($targetLeft[i],$targetBot[i],n+20,$targetTop[i])coloured("yellow",0)fillcolor("yellow",100)PRC_Smart Money Concepts(1)
    endif
    endif
    endif
    next
    //-----------------------------------------------------------------------------//
    //------Draw Pivot Points------------------------------------------------------//
    //-----------------------------------------------------------------------------//
    //---Pivot High
    for i=z downto 0 do
    if $phtype[i]=1 then
    drawtext("HH",$phx[i],$phy[i]+atr*0.5)coloured("red")
    else
    drawtext("LH",$phx[i],$phy[i]+atr*0.5)coloured("red")
    endif
    next
    //---Pivot Low
    for i=k downto 0 do
    if $pltype[i]=1 then
    drawtext("LL",$plx[i],$ply[i]-atr*0.5)coloured("green")
    else
    drawtext("HL",$plx[i],$ply[i]-atr*0.5)coloured("green")
    endif
    next
    //-----------------------------------------------------------------------------//
    //------Draw Internal Structure------------------------------------------------//
    //-----------------------------------------------------------------------------//
    for i=m downto 0 do
    drawsegment($itopx[i],$itopy[i],$iright[i],$itopy[i])style(dottedline)coloured("green")
    if $ichoch[i]=1 then
    drawtext("CHoCH",($itopx[i]+$iright[i])/2,$itopy[i]+0.25*atr)coloured("green")
    else
    drawtext("BOS",($itopx[i]+$iright[i])/2,$itopy[i]+0.25*atr)coloured("green")
    endif
    next
    //-----------------------------------------------------------------------------//
    for i=s downto 0 do
    drawsegment($ibotx[i],$iboty[i],$ibotright[i],$iboty[i])style(dottedline)coloured("red")
    if $ibotchoch[i]=1 then
    drawtext("CHoCH",($ibotx[i]+$ibotright[i])/2,$iboty[i]-0.25*atr)coloured("red")
    else
    drawtext("BOS",($ibotx[i]+$ibotright[i])/2,$iboty[i]-0.25*atr)coloured("red")
    endif
    next
    //-----------------------------------------------------------------------------//
    //------Draw Structure---------------------------------------------------------//
    //-----------------------------------------------------------------------------//
    for i=g downto 0 do
    drawsegment($topx[i],$topy[i],$right[i],$topy[i])style(line)coloured("green")
    if $topchoch[i]=1 then
    drawtext("CHoCH",($topx[i]+$right[i])/2,$topy[i]+0.25*atr)coloured("green")
    else
    drawtext("BOS",($topx[i]+$right[i])/2,$topy[i]+0.25*atr)coloured("green")
    endif
    next
    //-----------------------------------------------------------------------------//
    for i=w downto 0 do
    drawsegment($botx[i],$boty[i],$botright[i],$boty[i])style(line)coloured("red")
    if $botchoch[i]=1 then
    drawtext("CHoCH",($botx[i]+$botright[i])/2,$boty[i]+0.25*atr)coloured("red")
    else
    drawtext("BOS",($botx[i]+$botright[i])/2,$boty[i]+0.25*atr)coloured("red")
    endif
    next
    //-----------------------------------------------------------------------------//
    //-----Top and Bottom extension------------------------------------------------//
    //-----------------------------------------------------------------------------//
    if showhlswings then
    drawsegment(traildnx,traildn,n+20,traildn)coloured("blue")
    drawsegment(trailupx,trailup,n+20,trailup)coloured("red")
    if trend>0 then
    drawtext("Strong Low",(traildnx+n+20)/2,traildn-0.35*atr)coloured("blue")
    drawtext("Weak High",(trailupx+n+20)/2,trailup+0.35*atr)coloured("red")
    else
    drawtext("Weak Low",(traildnx+n+20)/2,traildn-0.35*atr)coloured("blue")
    drawtext("Strong High",(trailupx+n+20)/2,trailup+0.35*atr)coloured("red")
    endif
    endif
    endif
    //--------------------------------------------------------------------------------//
    return
    Razz and KumoNoJuzza thanked this post
    #235922 quote
    KumoNoJuzza
    Participant
    New

    Hi guys and thanks for this interesting indicator.

    There is an error line 457 I cannot correct:

    drawrectangle($targetLeft[i],$targetBot[i],n+20,$targetTop[i])coloured(“yellow”,0)fillcolor(“yellow”,100)PRC_Smart Money Concepts(1)

    I assume PRC_Smart Money Concepts(1) is a missed copy/paste, right ?

    Oliveira thanked this post
    #235923 quote
    Iván González
    Moderator
    Master

    hi! yes, I don’t know why…
    sorry
    Attached you will find the itf file.

    defparam drawonlastbaronly=true
    //--------------------------------------------------------------------------------//
    //PRC_Smart Money Concepts
    //version = 1
    //29.07.2024
    //Iván González @ www.prorealcode.com
    //Sharing ProRealTime knowledge
    //--------------------------------------------------------------------------------//
    //-----Inputs---------------------------------------------------------------------//
    length=50
    n=barindex
    showswings=1
    showHLswings=1
    showinternals=1
    showibull=1//1=all 2=bos 3=CHoCH
    showibear=1//1=all 2=bos 3=CHoCH
    showStructure=1
    showbull=1//1=all 2=bos 3=CHoCH
    showbear=1//1=all 2=bos 3=CHoCH
    showOB=1
    showiOB=1
    showlastOB=5
    ifilterConfluence=0
    obFilter=1 //1=ATR 0=Cumulative mean Range
    //--------------------------------------------------------------------------------//
    //--------------------------------------------------------------------------------//
    atr=averagetruerange[200](close)
    cmeanrange=summation[max(1,n)](high-low)/n
    //--------------------------------------------------------------------------------//
    //-----Swings---------------------------------------------------------------------//
    //---Swing length
    os=0
    upper=highest[length](high)
    lower=lowest[length](low)
    
    if high[length]>upper then
    os=0
    elsif low[length]<lower then
    os=1
    else
    os=os[1]
    endif
    
    if os=0 and os[1]<>0 then
    mytop=high[length]
    else
    mytop=0
    endif
    
    if os=1 and os[1]<>1 then
    mybot=low[length]
    else
    mybot=0
    endif
    //---Swing 5
    os1=0
    upper1=highest[5](high)
    lower1=lowest[5](low)
    
    if high[5]>upper1 then
    os1=0
    elsif low[5]<lower1 then
    os1=1
    else
    os1=os1[1]
    endif
    
    if os1=0 and os1[1]<>0 then
    itop=high[5]
    else
    itop=0
    endif
    
    if os1=1 and os1[1]<>1 then
    ibot=low[5]
    else
    ibot=0
    endif
    //--------------------------------------------------------------------------------//
    //-----Pivot High-----------------------------------------------------------------//
    if mytop then
    topcross=1
    
    if showswings then
    if mytop>topy then
    $phy[z+1]=mytop
    $phx[z+1]=n-length
    $phtype[z+1]=1
    z=z+1
    else
    $phy[z+1]=mytop
    $phx[z+1]=n-length
    $phtype[z+1]=-1
    z=z+1
    endif
    endif
    
    topy=mytop
    topx=n-length
    
    trailup=mytop
    trailupx=n-length
    endif
    
    if itop then
    itopcross=1
    
    itopy=itop
    itopx=n-5
    endif
    
    //Trailing maximun
    trailup=max(high,trailup)
    if trailup=high then
    trailupx=n
    else
    trailupx=trailupx
    endif
    
    //--------------------------------------------------------------------------------//
    //-----Pivot Low------------------------------------------------------------------//
    if mybot then
    botcross=1
    
    if showswings then
    if mybot<boty then
    $ply[k+1]=mybot
    $plx[k+1]=n-length
    $pltype[k+1]=1
    k=k+1
    else
    $ply[k+1]=mybot
    $plx[k+1]=n-length
    $pltype[k+1]=-1
    k=k+1
    endif
    endif
    
    boty=mybot
    botx=n-length
    
    traildn=mybot
    traildnx=n-length
    endif
    
    if ibot then
    ibotcross=1
    
    iboty=ibot
    ibotx=n-5
    endif
    
    //Trailing maximun
    traildn=min(low,traildn)
    if traildn=low then
    traildnx=n
    else
    traildnx=traildnx
    endif
    //--------------------------------------------------------------------------------//
    //-----Pivot High BOS/CHoCH-------------------------------------------------------//
    bullConcordant=1
    if ifilterConfluence then
    bullConcordant=high-max(close,open)>min(close,open-low)
    endif
    //Detect internal bullish structure
    if close crosses over itopy and itopcross and topy<>itopy and bullConcordant then
    choch=undefined
    if itrend<0 then
    choch=1
    bullichochalert=1
    else
    bullibosalert=1
    endif
    if showinternals then
    if showibull=1 or (showibull=2 and not choch) or (showibull=3 and choch) then
    $itopx[m+1]=itopx
    $itopy[m+1]=itopy
    $ichoch[m+1]=choch
    $iright[m+1]=barindex
    m=m+1
    endif
    endif
    
    itopcross=0
    itrend=1
    
    //Internal order block
    if showiOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-itopx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    minim=min(low[i],minim)
    if minim=low[i] then
    maxim=high[i]
    idx=i
    else
    maxim=maxim
    idx=idx
    endif
    endif
    next
    
    $itargetTop[t+1]=maxim
    $itargetBot[t+1]=minim
    $itargetLeft[t+1]=barindex[idx]
    $itargetRight[t+1]=n
    $itargetType[t+1]=1
    t=t+1
    endif
    endif
    //Detect bullish Structure
    if close crosses over topy and topcross then
    choch=undefined
    if trend<0 then
    choch=1
    endif
    
    if showStructure then
    if showbull=1 or (showbull=2 and not choch) or (showbull=3 and choch) then
    $topx[g+1]=topx
    $topy[g+1]=topy
    $topchoch[g+1]=choch
    $right[g+1]=barindex
    g=g+1
    endif
    endif
    //order block
    if showOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-topx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    minim=min(low[i],minim)
    if minim=low[i] then
    maxim=high[i]
    idx=i
    else
    maxim=maxim
    idx=idx
    endif
    endif
    next
    
    $targetTop[r+1]=maxim
    $targetBot[r+1]=minim
    $targetLeft[r+1]=barindex[idx]
    $targetRight[r+1]=n
    $targetType[r+1]=1
    r=r+1
    endif
    
    topcross=0
    trend=1
    endif
    //--------------------------------------------------------------------------------//
    //-----Pivot Low BOS/CHoCH--------------------------------------------------------//
    bearConcordant=1
    if ifilterConfluence then
    bearConcordant=high-max(close,open)<min(close,open-low)
    endif
    //Detect internal bearish Structure
    if close crosses under iboty and ibotcross and boty<>iboty and bearConcordant then
    choch=0
    if itrend>0 then
    choch=1
    bearichochalert=1
    else
    bearichochalert=1
    endif
    if showinternals then
    if showibear=1 or (showibear=2 and not choch) or (showibear=3 and choch) then
    $ibotx[s+1]=ibotx
    $iboty[s+1]=iboty
    $ibotchoch[s+1]=choch
    $ibotright[s+1]=barindex
    s=s+1
    endif
    endif
    
    ibotcross=0
    itrend=-1
    
    //Internal order block
    if showiOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-ibotx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    maxim=max(high[i],maxim)
    if maxim=high[i] then
    minim=low[i]
    idx=i
    else
    minim=minim
    idx=idx
    endif
    endif
    next
    
    $itargetTop[t+1]=maxim
    $itargetBot[t+1]=minim
    $itargetLeft[t+1]=barindex[idx]
    $itargetRight[t+1]=n
    $itargetType[t+1]=-1
    t=t+1
    endif
    endif
    //Detect Bullish Strcuture
    if close crosses under boty and botcross then
    choch=undefined
    if trend>0 then
    choch=1
    bearchochalert=1
    else
    bearbosalert=1
    endif
    
    if showStructure then
    if showbear=1 or (showbear=2 and not choch) or (showbear=3 and choch) then
    $botx[w+1]=botx
    $boty[w+1]=boty
    $botchoch[w+1]=choch
    $botright[w+1]=barindex
    w=w+1
    endif
    endif
    //order block
    if showOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-botx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    maxim=max(high[i],maxim)
    if maxim=high[i] then
    minim=low[i]
    idx=i
    else
    minim=minim
    idx=idx
    endif
    endif
    next
    
    $targetTop[r+1]=maxim
    $targetBot[r+1]=minim
    $targetLeft[r+1]=barindex[idx]
    $targetRight[r+1]=n
    $targetType[r+1]=-1
    r=r+1
    endif
    
    botcross=0
    trend=-1
    endif
    //--------------------------------------------------------------------------------//
    //-----Order Blocks---------------------------------------------------------------//
    //--------------------------------------------------------------------------------//
    //Delete internal Order Blocks
    for j=t downto 0 do
    if close < $itargetBot[j] and $itargetType[j]=1 then
    $itargetTop[j]=0
    $itargetBot[j]=0
    $itargetLeft[j]=0
    $itargetRight[j]=0
    $itargetType[j]=undefined
    elsif close > $itargetTop[j] and $itargetType[j]=-1 then
    $itargetTop[j]=0
    $itargetBot[j]=0
    $itargetLeft[j]=0
    $itargetRight[j]=0
    $itargetType[j]=0
    endif
    next
    //Delete structural Order Blocks
    for j=r downto 0 do
    if close < $targetBot[j] and $targetType[j]=1 then
    $targetTop[j]=0
    $targetBot[j]=0
    $targetLeft[j]=0
    $targetRight[j]=0
    $targetType[j]=undefined
    elsif close > $targetTop[j] and $targetType[j]=-1 then
    $targetTop[j]=0
    $targetBot[j]=0
    $targetLeft[j]=0
    $targetRight[j]=0
    $targetType[j]=0
    endif
    next
    //Plot Order Blocks if not broken
    countiOB=0
    countOB=0
    if islastbarupdate then
    //---Internal Order Blocks
    for i=t downto 0 do
    if $itargetBot[i]=0 then
    countiOB=countiOB
    else
    countiOB=countiOB+1
    if countiOB = showlastOB then
    break
    else
    if close > $itargetTop[i] then
    drawrectangle($itargetLeft[i],$itargetBot[i],n+20,$itargetTop[i])coloured("green",0)fillcolor("green",50)
    elsif close <$itargetBot[i] then
    drawrectangle($itargetLeft[i],$itargetBot[i],n+20,$itargetTop[i])coloured("red",0)fillcolor("red",50)
    else
    drawrectangle($itargetLeft[i],$itargetBot[i],n+20,$itargetTop[i])coloured("yellow",0)fillcolor("yellow",50)
    endif
    endif
    endif
    next
    //---Structural Order Blocks
    for i=r downto 0 do
    if $targetBot[i]=0 then
    countOB=countOB
    else
    countOB=countOB+1
    if countOB = showlastOB then
    break
    else
    if close > $targetTop[i] then
    drawrectangle($targetLeft[i],$targetBot[i],n+20,$targetTop[i])coloured("green",0)fillcolor("green",100)
    elsif close <$targetBot[i] then
    drawrectangle($targetLeft[i],$targetBot[i],n+20,$targetTop[i])coloured("red",0)fillcolor("red",100)
    else
    drawrectangle($targetLeft[i],$targetBot[i],n+20,$targetTop[i])coloured("yellow",0)fillcolor("yellow",100)
    endif
    endif
    endif
    next
    //-----------------------------------------------------------------------------//
    //------Draw Pivot Points------------------------------------------------------//
    //-----------------------------------------------------------------------------//
    //---Pivot High
    for i=z downto 0 do
    if $phtype[i]=1 then
    drawtext("HH",$phx[i],$phy[i]+atr*0.5)coloured("red")
    else
    drawtext("LH",$phx[i],$phy[i]+atr*0.5)coloured("red")
    endif
    next
    //---Pivot Low
    for i=k downto 0 do
    if $pltype[i]=1 then
    drawtext("LL",$plx[i],$ply[i]-atr*0.5)coloured("green")
    else
    drawtext("HL",$plx[i],$ply[i]-atr*0.5)coloured("green")
    endif
    next
    //-----------------------------------------------------------------------------//
    //------Draw Internal Structure------------------------------------------------//
    //-----------------------------------------------------------------------------//
    for i=m downto 0 do
    drawsegment($itopx[i],$itopy[i],$iright[i],$itopy[i])style(dottedline)coloured("green")
    if $ichoch[i]=1 then
    drawtext("CHoCH",($itopx[i]+$iright[i])/2,$itopy[i]+0.25*atr)coloured("green")
    else
    drawtext("BOS",($itopx[i]+$iright[i])/2,$itopy[i]+0.25*atr)coloured("green")
    endif
    next
    //-----------------------------------------------------------------------------//
    for i=s downto 0 do
    drawsegment($ibotx[i],$iboty[i],$ibotright[i],$iboty[i])style(dottedline)coloured("red")
    if $ibotchoch[i]=1 then
    drawtext("CHoCH",($ibotx[i]+$ibotright[i])/2,$iboty[i]-0.25*atr)coloured("red")
    else
    drawtext("BOS",($ibotx[i]+$ibotright[i])/2,$iboty[i]-0.25*atr)coloured("red")
    endif
    next
    //-----------------------------------------------------------------------------//
    //------Draw Structure---------------------------------------------------------//
    //-----------------------------------------------------------------------------//
    for i=g downto 0 do
    drawsegment($topx[i],$topy[i],$right[i],$topy[i])style(line)coloured("green")
    if $topchoch[i]=1 then
    drawtext("CHoCH",($topx[i]+$right[i])/2,$topy[i]+0.25*atr)coloured("green")
    else
    drawtext("BOS",($topx[i]+$right[i])/2,$topy[i]+0.25*atr)coloured("green")
    endif
    next
    //-----------------------------------------------------------------------------//
    for i=w downto 0 do
    drawsegment($botx[i],$boty[i],$botright[i],$boty[i])style(line)coloured("red")
    if $botchoch[i]=1 then
    drawtext("CHoCH",($botx[i]+$botright[i])/2,$boty[i]+0.25*atr)coloured("red")
    else
    drawtext("BOS",($botx[i]+$botright[i])/2,$boty[i]+0.25*atr)coloured("red")
    endif
    next
    //-----------------------------------------------------------------------------//
    //-----Top and Bottom extension------------------------------------------------//
    //-----------------------------------------------------------------------------//
    if showhlswings then
    drawsegment(traildnx,traildn,n+20,traildn)coloured("blue")
    drawsegment(trailupx,trailup,n+20,trailup)coloured("red")
    if trend>0 then
    drawtext("Strong Low",(traildnx+n+20)/2,traildn-0.35*atr)coloured("blue")
    drawtext("Weak High",(trailupx+n+20)/2,trailup+0.35*atr)coloured("red")
    else
    drawtext("Weak Low",(traildnx+n+20)/2,traildn-0.35*atr)coloured("blue")
    drawtext("Strong High",(trailupx+n+20)/2,trailup+0.35*atr)coloured("red")
    endif
    endif
    endif
    //--------------------------------------------------------------------------------//
    return
    
    KumoNoJuzza thanked this post
    #235932 quote
    robert123
    Participant
    Master

    Hi Ivan,

    Thank you for this code.

    Is it possible to put the FVG’s in as well?

    Many thanks

    Robert

    Razz and KumoNoJuzza thanked this post
    #235951 quote
    KumoNoJuzza
    Participant
    New

    Beginner’s luck or not, I am on demo and the NQ hit the H4 liquidity zone computed by the indicator 375 points winning trade.

    #236048 quote
    Fr7
    Participant
    Master

    Hola Ivan,¿Puedes añadir flechas cuando se produzcan BOS y CHoCH fuertes, sólo los que tienen una línea sólida para mostrar rupturas de la estructura del mercado y reversiones de tendencia más grandes?Como muestro en la imagen.

    #236059 quote
    Iván González
    Moderator
    Master

    Ok.

    defparam drawonlastbaronly=true
    //--------------------------------------------------------------------------------//
    //PRC_Smart Money Concepts
    //version = 1
    //29.07.2024
    //Iván González @ www.prorealcode.com
    //Sharing ProRealTime knowledge
    //--------------------------------------------------------------------------------//
    //-----Inputs---------------------------------------------------------------------//
    length=50
    n=barindex
    showswings=1
    showHLswings=1
    showinternals=1
    showibull=1//1=all 2=bos 3=CHoCH
    showibear=1//1=all 2=bos 3=CHoCH
    showStructure=1
    showbull=1//1=all 2=bos 3=CHoCH
    showbear=1//1=all 2=bos 3=CHoCH
    showOB=1
    showiOB=1
    showlastOB=5
    ifilterConfluence=0
    obFilter=1 //1=ATR 0=Cumulative mean Range
    mult=2
    bblength=20
    //--------------------------------------------------------------------------------//
    //--------------------------------------------------------------------------------//
    atr=averagetruerange[200](close)
    cmeanrange=summation[max(1,n)](high-low)/n
    //--------------------------------------------------------------------------------//
    //-----Bollinger Bands Calculation------------------------------------------------//
    averageBB=average[bblength](close)
    dev=mult*std[bblength](close)
    upperBB=averageBB+dev
    lowerBB=averageBB-dev
    //--------------------------------------------------------------------------------//
    //-----Swings---------------------------------------------------------------------//
    //---Swing length
    os=0
    upper=highest[length](high)
    lower=lowest[length](low)
    
    if high[length]>upper then
    os=0
    elsif low[length]<lower then
    os=1
    else
    os=os[1]
    endif
    
    if os=0 and os[1]<>0 then
    mytop=high[length]
    else
    mytop=0
    endif
    
    if os=1 and os[1]<>1 then
    mybot=low[length]
    else
    mybot=0
    endif
    //---Swing 5
    os1=0
    upper1=highest[5](high)
    lower1=lowest[5](low)
    
    if high[5]>upper1 then
    os1=0
    elsif low[5]<lower1 then
    os1=1
    else
    os1=os1[1]
    endif
    
    if os1=0 and os1[1]<>0 then
    itop=high[5]
    else
    itop=0
    endif
    
    if os1=1 and os1[1]<>1 then
    ibot=low[5]
    else
    ibot=0
    endif
    //--------------------------------------------------------------------------------//
    //-----Pivot High-----------------------------------------------------------------//
    if mytop then
    topcross=1
    
    if showswings then
    if mytop>topy then
    $phy[z+1]=mytop
    $phx[z+1]=n-length
    $phtype[z+1]=1
    z=z+1
    else
    $phy[z+1]=mytop
    $phx[z+1]=n-length
    $phtype[z+1]=-1
    z=z+1
    endif
    endif
    
    topy=mytop
    topx=n-length
    
    trailup=mytop
    trailupx=n-length
    endif
    
    if itop then
    itopcross=1
    
    itopy=itop
    itopx=n-5
    endif
    
    //Trailing maximun
    trailup=max(high,trailup)
    if trailup=high then
    trailupx=n
    else
    trailupx=trailupx
    endif
    
    //--------------------------------------------------------------------------------//
    //-----Pivot Low------------------------------------------------------------------//
    if mybot then
    botcross=1
    
    if showswings then
    if mybot<boty then
    $ply[k+1]=mybot
    $plx[k+1]=n-length
    $pltype[k+1]=1
    k=k+1
    else
    $ply[k+1]=mybot
    $plx[k+1]=n-length
    $pltype[k+1]=-1
    k=k+1
    endif
    endif
    
    boty=mybot
    botx=n-length
    
    traildn=mybot
    traildnx=n-length
    endif
    
    if ibot then
    ibotcross=1
    
    iboty=ibot
    ibotx=n-5
    endif
    
    //Trailing maximun
    traildn=min(low,traildn)
    if traildn=low then
    traildnx=n
    else
    traildnx=traildnx
    endif
    //--------------------------------------------------------------------------------//
    //-----Pivot High BOS/CHoCH-------------------------------------------------------//
    bullConcordant=1
    if ifilterConfluence then
    bullConcordant=high-max(close,open)>min(close,open-low)
    endif
    //Detect internal bullish structure
    if close crosses over itopy and itopcross and topy<>itopy and bullConcordant then
    choch=undefined
    if itrend<0 then
    choch=1
    bullichochalert=1
    else
    bullibosalert=1
    endif
    if showinternals then
    if showibull=1 or (showibull=2 and not choch) or (showibull=3 and choch) then
    $itopx[m+1]=itopx
    $itopy[m+1]=itopy
    $ichoch[m+1]=choch
    $iright[m+1]=barindex
    m=m+1
    endif
    endif
    
    itopcross=0
    itrend=1
    
    //Internal order block
    if showiOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-itopx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    minim=min(low[i],minim)
    if minim=low[i] then
    maxim=high[i]
    idx=i
    else
    maxim=maxim
    idx=idx
    endif
    endif
    next
    
    $itargetTop[t+1]=maxim
    $itargetBot[t+1]=minim
    $itargetLeft[t+1]=barindex[idx]
    $itargetRight[t+1]=n
    $itargetType[t+1]=1
    t=t+1
    endif
    endif
    //Detect bullish Structure
    if close crosses over topy and topcross then
    choch=undefined
    if trend<0 then
    choch=1
    endif
    
    if showStructure then
    if showbull=1 or (showbull=2 and not choch) or (showbull=3 and choch) then
    $topx[g+1]=topx
    $topy[g+1]=topy
    $topchoch[g+1]=choch
    $right[g+1]=barindex
    g=g+1
    endif
    endif
    //order block
    if showOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-topx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    minim=min(low[i],minim)
    if minim=low[i] then
    maxim=high[i]
    idx=i
    else
    maxim=maxim
    idx=idx
    endif
    endif
    next
    
    $targetTop[r+1]=maxim
    $targetBot[r+1]=minim
    $targetLeft[r+1]=barindex[idx]
    $targetRight[r+1]=n
    $targetType[r+1]=1
    r=r+1
    endif
    
    topcross=0
    trend=1
    endif
    //--------------------------------------------------------------------------------//
    //-----Pivot Low BOS/CHoCH--------------------------------------------------------//
    bearConcordant=1
    if ifilterConfluence then
    bearConcordant=high-max(close,open)<min(close,open-low)
    endif
    //Detect internal bearish Structure
    if close crosses under iboty and ibotcross and boty<>iboty and bearConcordant then
    choch=0
    if itrend>0 then
    choch=1
    bearichochalert=1
    else
    bearichochalert=1
    endif
    if showinternals then
    if showibear=1 or (showibear=2 and not choch) or (showibear=3 and choch) then
    $ibotx[s+1]=ibotx
    $iboty[s+1]=iboty
    $ibotchoch[s+1]=choch
    $ibotright[s+1]=barindex
    s=s+1
    endif
    endif
    
    ibotcross=0
    itrend=-1
    
    //Internal order block
    if showiOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-ibotx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    maxim=max(high[i],maxim)
    if maxim=high[i] then
    minim=low[i]
    idx=i
    else
    minim=minim
    idx=idx
    endif
    endif
    next
    
    $itargetTop[t+1]=maxim
    $itargetBot[t+1]=minim
    $itargetLeft[t+1]=barindex[idx]
    $itargetRight[t+1]=n
    $itargetType[t+1]=-1
    t=t+1
    endif
    endif
    //Detect Bullish Strcuture
    if close crosses under boty and botcross then
    choch=undefined
    if trend>0 then
    choch=1
    bearchochalert=1
    else
    bearbosalert=1
    endif
    
    if showStructure then
    if showbear=1 or (showbear=2 and not choch) or (showbear=3 and choch) then
    $botx[w+1]=botx
    $boty[w+1]=boty
    $botchoch[w+1]=choch
    $botright[w+1]=barindex
    w=w+1
    endif
    endif
    //order block
    if showOB then
    minim=9999999999
    maxim=0
    idx=1
    if obFilter=1 then
    obthreshold=atr
    else
    obthreshold=cmeanRange
    endif
    
    for i=1 to (n-botx)-1 do
    if (high[i]-low[i])<obthreshold[i]*2 then
    maxim=max(high[i],maxim)
    if maxim=high[i] then
    minim=low[i]
    idx=i
    else
    minim=minim
    idx=idx
    endif
    endif
    next
    
    $targetTop[r+1]=maxim
    $targetBot[r+1]=minim
    $targetLeft[r+1]=barindex[idx]
    $targetRight[r+1]=n
    $targetType[r+1]=-1
    r=r+1
    endif
    
    botcross=0
    trend=-1
    endif
    //--------------------------------------------------------------------------------//
    //-----Order Blocks---------------------------------------------------------------//
    //--------------------------------------------------------------------------------//
    //Delete internal Order Blocks
    for j=t downto 0 do
    if close < $itargetBot[j] and $itargetType[j]=1 then
    $itargetTop[j]=0
    $itargetBot[j]=0
    $itargetLeft[j]=0
    $itargetRight[j]=0
    $itargetType[j]=undefined
    elsif close > $itargetTop[j] and $itargetType[j]=-1 then
    $itargetTop[j]=0
    $itargetBot[j]=0
    $itargetLeft[j]=0
    $itargetRight[j]=0
    $itargetType[j]=0
    endif
    next
    //Delete structural Order Blocks
    for j=r downto 0 do
    if close < $targetBot[j] and $targetType[j]=1 then
    $targetTop[j]=0
    $targetBot[j]=0
    $targetLeft[j]=0
    $targetRight[j]=0
    $targetType[j]=undefined
    elsif close > $targetTop[j] and $targetType[j]=-1 then
    $targetTop[j]=0
    $targetBot[j]=0
    $targetLeft[j]=0
    $targetRight[j]=0
    $targetType[j]=0
    endif
    next
    //Plot Order Blocks if not broken
    countiOB=0
    countOB=0
    if islastbarupdate then
    //---Internal Order Blocks
    for i=t downto 0 do
    if $itargetBot[i]=0 then
    countiOB=countiOB
    else
    countiOB=countiOB+1
    if countiOB = showlastOB then
    break
    else
    if close > $itargetTop[i] then
    drawrectangle($itargetLeft[i],$itargetBot[i],n+20,$itargetTop[i])coloured("green",0)fillcolor("green",50)
    elsif close <$itargetBot[i] then
    drawrectangle($itargetLeft[i],$itargetBot[i],n+20,$itargetTop[i])coloured("red",0)fillcolor("red",50)
    else
    drawrectangle($itargetLeft[i],$itargetBot[i],n+20,$itargetTop[i])coloured("yellow",0)fillcolor("yellow",50)
    endif
    endif
    endif
    next
    //---Structural Order Blocks
    for i=r downto 0 do
    if $targetBot[i]=0 then
    countOB=countOB
    else
    countOB=countOB+1
    if countOB = showlastOB then
    break
    else
    if close > $targetTop[i] then
    drawrectangle($targetLeft[i],$targetBot[i],n+20,$targetTop[i])coloured("green",0)fillcolor("green",100)
    elsif close <$targetBot[i] then
    drawrectangle($targetLeft[i],$targetBot[i],n+20,$targetTop[i])coloured("red",0)fillcolor("red",100)
    else
    drawrectangle($targetLeft[i],$targetBot[i],n+20,$targetTop[i])coloured("yellow",0)fillcolor("yellow",100)
    endif
    endif
    endif
    next
    //-----------------------------------------------------------------------------//
    //------Draw Pivot Points------------------------------------------------------//
    //-----------------------------------------------------------------------------//
    //---Pivot High
    for i=z downto 0 do
    if $phtype[i]=1 then
    drawtext("HH",$phx[i],$phy[i]+atr*0.5)coloured("red")
    else
    drawtext("LH",$phx[i],$phy[i]+atr*0.5)coloured("red")
    endif
    next
    //---Pivot Low
    for i=k downto 0 do
    if $pltype[i]=1 then
    drawtext("LL",$plx[i],$ply[i]-atr*0.5)coloured("green")
    else
    drawtext("HL",$plx[i],$ply[i]-atr*0.5)coloured("green")
    endif
    next
    //-----------------------------------------------------------------------------//
    //------Draw Internal Structure------------------------------------------------//
    //-----------------------------------------------------------------------------//
    for i=m downto 0 do
    drawsegment($itopx[i],$itopy[i],$iright[i],$itopy[i])style(dottedline)coloured("green")
    if $ichoch[i]=1 then
    drawtext("CHoCH",($itopx[i]+$iright[i])/2,$itopy[i]+0.25*atr)coloured("green")
    else
    drawtext("BOS",($itopx[i]+$iright[i])/2,$itopy[i]+0.25*atr)coloured("green")
    endif
    next
    //-----------------------------------------------------------------------------//
    for i=s downto 0 do
    drawsegment($ibotx[i],$iboty[i],$ibotright[i],$iboty[i])style(dottedline)coloured("red")
    if $ibotchoch[i]=1 then
    drawtext("CHoCH",($ibotx[i]+$ibotright[i])/2,$iboty[i]-0.25*atr)coloured("red")
    else
    drawtext("BOS",($ibotx[i]+$ibotright[i])/2,$iboty[i]-0.25*atr)coloured("red")
    endif
    next
    //-----------------------------------------------------------------------------//
    //------Draw Structure---------------------------------------------------------//
    //-----------------------------------------------------------------------------//
    for i=g downto 0 do
    drawsegment($topx[i],$topy[i],$right[i],$topy[i])style(line)coloured("green")
    drawarrowup($right[i],$topy[i]-0.5*atr)coloured("green")
    if $topchoch[i]=1 then
    drawtext("CHoCH",($topx[i]+$right[i])/2,$topy[i]+0.25*atr)coloured("green")
    else
    drawtext("BOS",($topx[i]+$right[i])/2,$topy[i]+0.25*atr)coloured("green")
    endif
    next
    //-----------------------------------------------------------------------------//
    for i=w downto 0 do
    drawsegment($botx[i],$boty[i],$botright[i],$boty[i])style(line)coloured("red")
    drawarrowdown($botright[i],$boty[i]+0.5*atr)coloured("red")
    if $botchoch[i]=1 then
    drawtext("CHoCH",($botx[i]+$botright[i])/2,$boty[i]+0.25*atr)coloured("red")
    else
    drawtext("BOS",($botx[i]+$botright[i])/2,$boty[i]+0.25*atr)coloured("red")
    endif
    next
    //-----------------------------------------------------------------------------//
    //-----Top and Bottom extension------------------------------------------------//
    //-----------------------------------------------------------------------------//
    if showhlswings then
    drawsegment(traildnx,traildn,n+20,traildn)coloured("blue")
    drawsegment(trailupx,trailup,n+20,trailup)coloured("red")
    if trend>0 then
    drawtext("Strong Low",(traildnx+n+20)/2,traildn-0.35*atr)coloured("blue")
    drawtext("Weak High",(trailupx+n+20)/2,trailup+0.35*atr)coloured("red")
    else
    drawtext("Weak Low",(traildnx+n+20)/2,traildn-0.35*atr)coloured("blue")
    drawtext("Strong High",(trailupx+n+20)/2,trailup+0.35*atr)coloured("red")
    endif
    endif
    endif
    //--------------------------------------------------------------------------------//
    return averageBB as "SMA" coloured(135,35,35), upperbb as "BB top"coloured("teal"),lowerbb as "BB bot"coloured("teal")
    
    GraHal, Fr7 and KumoNoJuzza thanked this post
    #236064 quote
    robert123
    Participant
    Master

    Thank you, Ivan- Are the FVGs possible to code into the indicator? as they are an integral part of it

    Robert

    KumoNoJuzza thanked this post
    #238917 quote
    Fr7
    Participant
    Master

    Iván, sería tremendo si me puedes sacar el Screener del indicador anterior cuando se producen las flechas hacia arriba o hacia abajo…..

    Para que me entiendas…… aunque ya sé que está mal escrito eh:

    //——Draw Structure———————————————————//
    //—————————————————————————–//
    for i=g downto 0 do
    drawsegment($topx[i],$topy[i],$right[i],$topy[i])style(line)coloured(“green”)
    drawarrowup($right[i],$topy[i]0.5*atr)coloured(“green”)
    if $topchoch[i]=1 then
    drawtext(“CHoCH”,($topx[i]+$right[i])/2,$topy[i]+0.25*atr)coloured(“green”)
    else
    drawtext(“BOS”,($topx[i]+$right[i])/2,$topy[i]+0.25*atr)coloured(“green”)
    endif
    next
    //—————————————————————————–//
    for i=w downto 0 do
    drawsegment($botx[i],$boty[i],$botright[i],$boty[i])style(line)coloured(“red”)
    drawarrowdown($botright[i],$boty[i]+0.5*atr)coloured(“red”)
    if $botchoch[i]=1 then
    drawtext(“CHoCH”,($botx[i]+$botright[i])/2,$boty[i]+0.25*atr)coloured(“red”)
    else
    drawtext(“BOS”,($botx[i]+$botright[i])/2,$boty[i]+0.25*atr)coloured(“red”)
    endif
    next

    C1=drawarrowup($right[i],$topy[i]0.5*atr)coloured(“green”)

    C2=drawarrowdown($botright[i],$boty[i]+0.5*atr)coloured(“red”)

    SCREENER[C1 OR C2 ]

Viewing 13 posts - 1 through 13 (of 13 total)
  • You must be logged in to reply to this topic.

Smart money concepts [LuxAlgo]


ProBuilder: Indicators & Custom Tools

New Reply
Author
author-avatar
vaddan @vaddan Participant
Summary

This topic contains 12 replies,
has 6 voices, and was last updated by Fr7
1 year, 3 months ago.

Topic Details
Forum: ProBuilder: Indicators & Custom Tools
Language: English
Started: 10/07/2023
Status: Active
Attachments: 4 files
Logo Logo
Loading...