Traduction Breaker Block de LuxAlgo

Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • #242615 quote
    Alai-nAlai-n
    Participant
    Veteran

    Bonjour, dans la continuation du développement du concept ICT-SMC. Ce serait vraiment bien de traduire ce code et de le rajouter à la bibliothèque!

    Bonne journée

    // This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC Dy-NC-SA 4.0) https://creativecommons.org/licenses/Dy-nc-sa/4.0/
    // © LuxAlgo
    
    //@version=5
    indicator("Breaker Blocks with Signals [LuxAlgo]", max_lines_count=500, max_boxes_count=500, max_labels_count=500, max_bars_back=3000, overlay=true)
    //------------------------------------------------------------------------------
    //Settings
    //-----------------------------------------------------------------------------{
    shZZ                  = false 
    len                   = input.int   (    5     , title='      Length'              , inline='MS' , group='Market Structure' 
                          ,                                         minval=1, maxval=10                                                                      )
    //Breaker block
    breakerCandleOnlyBody = input.bool  (  false   , title='Use only candle body'                    , group='Breaker Block'                                 )
    breakerCandle_2Last   = input.bool  (  false   , title='Use 2 candles instead of 1'              , group='Breaker Block', tooltip='In the same direction')
    tillFirstBreak        = input.bool  (  true   , title='Stop at first break of center line'      , group='Breaker Block'                                 )
    
    //PD array
    onlyWhenInPDarray     = input.bool  (  false   , title='Only when E is in Premium/Discount Array', group='PD array'                                      )
    showPDarray           = input.bool  (  false   , title='show Premium/Discount Zone'              , group='PD array'                                      )
    showBreaks            = input.bool  (  false   , title='Highlight Swing Breaks'                  , group='PD array'                                      )
    showSPD               = input.bool  (  true    , title='Show Swings/PD Arrays'                   , group='PD array'                                      )
    PDtxtCss              = input.color (  color.silver, 'Text Color'      , group='PD array'                                      )
    PDSCss                = input.color (  color.silver, 'Swing Line Color', group='PD array'                                      )
    
    //Take profit
    iTP                   = input.bool  (  false   , title='Enable TP'                 , inline='RR' , group='TP'                                            )
    tpCss                 = input.color ( #2157f3, title=''                  , inline='RR', group='TP'                                            )
    R1a                   = input.float (    1     , title='R:R 1', minval= 1, maxval=1, inline='RR1', group='TP'                                            )
    R2a                   = input.float (    2     , title= ':'   , minval=.2, step= .1, inline='RR1', group='TP'                                            )
    R1b                   = input.float (    1     , title='R:R 2', minval= 1, maxval=1, inline='RR2', group='TP'                                            )
    R2b                   = input.float (    3     , title= ':'   , minval=.2, step= .1, inline='RR2', group='TP'                                            )
    R1c                   = input.float (    1     , title='R:R 3', minval= 1, maxval=1, inline='RR3', group='TP'                                            )
    R2c                   = input.float (    4     , title= ':'   , minval=.2, step= .1, inline='RR3', group='TP'                                            )
     
    //Colors
    cBBplusA              = input.color (color.rgb(12, 181, 26, 93)
                                                   , title='      '                    , inline='bl' , group='Colours    +BB                   Last Swings'  )
    cBBplusB              = input.color (color.rgb(12, 181, 26, 85)
                                                   , title=''                          , inline='bl' , group='Colours    +BB                   Last Swings'  )
    cSwingBl              = input.color (color.rgb(255, 82, 82, 85)
                                                   , title='        '                  , inline='bl' , group='Colours    +BB                   Last Swings'  )
    cBB_minA              = input.color (color.rgb(255, 17, 0, 95)
                                                   , title='      '                    , inline='br' , group='Colours    -BB                   Last Swings'  )
    cBB_minB              = input.color (color.rgb(255, 17, 0, 85)
                                                   , title=''                          , inline='br' , group='Colours    -BB                   Last Swings'  )
    cSwingBr              = input.color (color.rgb(0, 137, 123, 85)
                                                   , title='        '                  , inline='br' , group='Colours    -BB                   Last Swings'  )
    
    _arrowup = '▲'
    _arrowdn = '▼'
    _c = '●'
    _x = '❌'
    
    //-----------------------------------------------------------------------------}
    //General Calculations
    //-----------------------------------------------------------------------------{
    per        = last_bar_index - bar_index <= 2000 
    mx         = math.max(close , open     )
    mn         = math.min(close , open )
    atr        = ta.atr  (10    )
    n          = bar_index
    hi         = high  
    lo         = low   
    mCxSize    = 50
    
    //-----------------------------------------------------------------------------}
    //User Defined Types
    //-----------------------------------------------------------------------------{
    type ZZ 
        int   [] d
        int   [] x 
        float [] y 
        line  [] l
        bool  [] b
    
    type mss 
        int     dir
        line [] l_mssBl
        line [] l_mssBr
        line [] l_bosBl
        line [] l_bosBr
        label[] lbMssBl
        label[] lbMssBr
        label[] lbBosBl
        label[] lbBosBr
    
    type block
        int   dir
        bool  Broken
        bool  Mitigated
        box   BB_boxA
        box   BB_boxB
        line  BB_line
        box   FVG_box
        line  line_1
        line  line_2
        bool  Broken_1
        bool  Broken_2
        box   PDa_boxA
        box   PDa_boxB
        box   PDa_box1
        line  PDaLine1
        label PDaLab_1
        box   PDa_box2
        line  PDaLine2    
        label PDaLab_2
        bool  PDbroken1
        bool  PDbroken2
        line  TP1_line
        line  TP2_line
        line  TP3_line
        bool  TP1_hit
        bool  TP2_hit
        bool  TP3_hit
        bool  scalp
        label HL
        label[] aLabels
    
    //-----------------------------------------------------------------------------}
    //Variables
    //-----------------------------------------------------------------------------{
    BBplus = 0, signUP = 1, cnclUP = 2, LL1break = 3, LL2break = 4, SW1breakUP = 5
     ,      SW2breakUP = 6,  tpUP1 = 7,    tpUP2 = 8,    tpUP3 = 9,   BB_endBl =10
    BB_min =11, signDN =12, cnclDN =13, HH1break =14, HH2break =15, SW1breakDN =16
     ,      SW2breakDN =17,  tpDN1 =18,    tpDN2 =19,    tpDN3 =20,   BB_endBr =21
    
    signals = 
     array.from(
       false // BBplus
     , false // signUP
     , false // cnclUP
     , false // LL1break
     , false // LL2break
     , false // SW1breakUP
     , false // SW2breakUP
     , false // tpUP1
     , false // tpUP2
     , false // tpUP3
     , false // BB_endBl
     , false // BB_min
     , false // signDN
     , false // cnclDN
     , false // HH1break
     , false // HH2break
     , false // SW1breakDN
     , false // SW2breakDN
     , false // tpDN1
     , false // tpDN2
     , false // tpDN3
     , false // BB_endBr
     )
    
    var block   [] aBlockBl   = array.new<   block  >(          )
    var block   [] aBlockBr   = array.new<   block  >(          )
    
    var  ZZ         aZZ       = 
     ZZ.new(
     array.new < int    >(mCxSize,  0), 
     array.new < int    >(mCxSize,  0), 
     array.new < float  >(mCxSize, na),
     array.new < line   >(mCxSize, na),
     array.new < bool   >(mCxSize, na))
    
    var mss MSS = mss.new(
     0
     , array.new < line  >()
     , array.new < line  >() 
     , array.new < line  >()
     , array.new < line  >()
     , array.new < label >() 
     , array.new < label >()
     , array.new < label >()
     , array.new < label >()
     )
    
    var block BB = block.new(
       BB_boxA   = box.new  (na, na, na, na, border_color=color(na))
     , BB_boxB   = box.new  (na, na, na, na, border_color=color(na)
      , text_size=size.small
      , text_halign=text.align_right
      , text_font_family=font.family_monospace
      )
     , BB_line   = line.new (na, na, na, na
      , style=line.style_dashed
      , color=color.silver
      )
     , PDa_box1  = box.new  (na, na, na, na, border_color=color(na))
     , PDaLine1  = line.new (na, na, na, na, color=PDSCss)
     , PDaLab_1  = label.new(na, na, color=color(na))
     , PDa_box2  = box.new  (na, na, na, na, border_color=color(na))
     , PDaLine2  = line.new (na, na, na, na, color=PDSCss)
     , PDaLab_2  = label.new(na, na, color=color(na))
     , line_1    = line.new (na, na, na, na, color=PDSCss)
     , line_2    = line.new (na, na, na, na, color=PDSCss)
     , TP1_line  = line.new (na, na, na, na, color=tpCss)
     , TP2_line  = line.new (na, na, na, na, color=tpCss)
     , TP3_line  = line.new (na, na, na, na, color=tpCss)
     , HL        = label.new(na, na, color=color(na)
      , textcolor=PDtxtCss
      , yloc=yloc.price
      )
     , aLabels   = array.new<label>(1, label(na))
     )
    
    //-----------------------------------------------------------------------------}
    //Functions/methods
    //-----------------------------------------------------------------------------{
    method in_out(ZZ aZZ, int d, int x1, float y1, int x2, float y2, color col, bool b) =>
        aZZ.d.unshift(d), aZZ.x.unshift(x2), aZZ.y.unshift(y2), aZZ.b.unshift(b), aZZ.d.pop(), aZZ.x.pop(), aZZ.y.pop(), aZZ.b.pop()
        if shZZ
            aZZ.l.unshift(line.new(x1, y1, x2, y2, color= col)), aZZ.l.pop().delete()
    
    method io_box(box[] aB, box b) => aB.unshift(b), aB.pop().delete()
    
    method setLine(line ln, int x1, float y1, int x2, float y2) => ln.set_xy1(x1, y1), ln.set_xy2(x2, y2)
    
    method notransp(color css) => color.rgb(color.r(css), color.g(css), color.b(css))
    
    createLab(string s, float y, color c, string t, string sz = size.small) =>      
        label.new(n
         , y
         , style=s == 'c' ? label.style_label_center    
          : s == 'u' ? label.style_label_up 
          : label.style_label_down
         , textcolor=c
         , color=color(na)    
         , size=sz
         , text=t
         )
    
    draw(left, col) =>
        
        max_bars_back(time, 1000)
        var int dir= na, var int x1= na, var float y1= na, var int x2= na, var float y2= na
        
        sz       = aZZ.d.size( )
        x2      := bar_index -1
        ph       = ta.pivothigh(hi, left, 1)
        pl       = ta.pivotlow (lo, left, 1)
        if ph   
            dir := aZZ.d.get (0) 
            x1  := aZZ.x.get (0) 
            y1  := aZZ.y.get (0) 
            y2  :=      nz(hi[1])
            
            if dir <  1  // if previous point was a pl, add, and change direction ( 1)
                aZZ.in_out( 1, x1, y1, x2, y2, col, true)
            else
                if dir ==  1 and ph > y1 
                    aZZ.x.set(0, x2), aZZ.y.set(0, y2)   
                    if shZZ
                        aZZ.l.get(0).set_xy2(x2, y2)        
    
        if pl
            dir := aZZ.d.get (0) 
            x1  := aZZ.x.get (0) 
            y1  := aZZ.y.get (0) 
            y2  :=      nz(lo[1])
            
            if dir > -1  // if previous point was a ph, add, and change direction (-1)
                aZZ.in_out(-1, x1, y1, x2, y2, col, true)
            else
                if dir == -1 and pl < y1 
                    aZZ.x.set(0, x2), aZZ.y.set(0, y2)       
                    if shZZ
                        aZZ.l.get(0).set_xy2(x2, y2)   
        
        iH = aZZ.d.get(2) ==  1 ? 2 : 1
        iL = aZZ.d.get(2) == -1 ? 2 : 1
        
        switch
            // MSS Bullish
            close > aZZ.y.get(iH) and aZZ.d.get(iH) ==  1 and MSS.dir <  1 and per =>
                
                Ex   = aZZ.x.get(iH -1), Ey = aZZ.y.get(iH -1) 
                Dx   = aZZ.x.get(iH   ), Dy = aZZ.y.get(iH   ), DyMx = mx[n - Dx]
                Cx   = aZZ.x.get(iH +1), Cy = aZZ.y.get(iH +1) 
                Bx   = aZZ.x.get(iH +2), By = aZZ.y.get(iH +2), ByMx = mx[n - Bx] 
                Ax   = aZZ.x.get(iH +3), Ay = aZZ.y.get(iH +3), AyMn = mn[n - Ax]
                _y   = math.max(ByMx, DyMx)
                mid  = AyMn + ((_y - AyMn) / 2) // 50% fib A- min(B, D)
                isOK = onlyWhenInPDarray ? Ay < Cy and Ay < Ey and Ey < mid : true
                
                float green1prT = na
                float green1prB = na
                float    avg    = na
    
                if Ey < Cy and Cx != Dx and isOK 
                    // latest HH to 1 HH further -> search first green bar
                    for i = n - Dx to n - Cx
                        if close[i] > open[i]
                            // reset previous swing box's
                            BB.PDa_box1.set_lefttop(na, na), BB.PDaLine1.set_xy1(na, na), BB.PDaLab_1.set_xy(na, na)
                            BB.PDa_box2.set_lefttop(na, na), BB.PDaLine2.set_xy1(na, na), BB.PDaLab_2.set_xy(na, na)
                            
                            green1idx   = n - i
                            green1prT  := breakerCandleOnlyBody ? mx[i] : high[i]
                            green1prB  := breakerCandleOnlyBody ? mn[i] : low [i]
                            if breakerCandle_2Last 
                                if close[i +1] > open[i +1]
                                    green2prT  = breakerCandleOnlyBody ? mx[i +1] : high[i +1]
                                    green2prB  = breakerCandleOnlyBody ? mn[i +1] : low [i +1]
                                    if green2prT > green1prT or green2prB < green1prB
                                        green1idx -= 1
                                    green1prT := math.max(green1prT, green2prT)
                                    green1prB := math.min(green1prB, green2prB)
                            
                            // Breaker Block + 
                            avg := math.avg(green1prB, green1prT)
                            while BB.aLabels.size() > 0
                                BB.aLabels.pop().delete()
                            BB.PDa_boxA.delete(), BB.PDa_boxB.delete(), BB.dir :=  1
                            BB.BB_boxA.set_left   (green1idx)
                            BB.BB_boxA.set_top    (green1prT)
                            BB.BB_boxA.set_right  (    n    )
                            BB.BB_boxA.set_bottom (green1prB)
                            BB.BB_boxA.set_bgcolor(cBBplusA )
    
                            BB.BB_boxB.set_left   (    n    )
                            BB.BB_boxB.set_top    (green1prT)
                            BB.BB_boxB.set_right  (    n + 8)
                            BB.BB_boxB.set_bottom (green1prB)
                            BB.BB_boxB.set_bgcolor(cBBplusB )
                            BB.BB_boxB.set_text('+BB')
                            BB.BB_boxB.set_text_color(cBBplusB.notransp())
                            BB.BB_boxB.set_text_valign(text.align_bottom)
                           
                            BB.BB_line.set_xy1(n, avg), BB.BB_line.set_xy2(n , avg)
    
                            if showSPD
                                BB.line_1.set_xy1(Cx, Cy), BB.line_1.set_xy2(n , Cy), BB.Broken_1 := false
                                BB.line_2.set_xy1(Ex, Ey), BB.line_2.set_xy2(n , Ey), BB.Broken_2 := false
                                BB.HL.set_xy(Ex, Ey), BB.HL.set_style(label.style_label_up), BB.HL.set_text('LL')
                            
                            BB.TP1_hit    := false     
                            BB.TP2_hit    := false                              
                            BB.TP3_hit    := false  
                            BB.Broken     := false
                            BB.Mitigated  := false
                            BB.scalp      := false
                            BB.PDbroken1  := false
                            BB.PDbroken2  := false
    
                            if onlyWhenInPDarray and showPDarray
                                BB.PDa_boxA := box.new(Ax, mid, Ex +1, AyMn, bgcolor=color.rgb(132, 248, 171, 90), border_color=color(na)
                                 , text = 'Discount PD Array', text_size = size.small, text_color = color.rgb(132, 248, 171, 25)
                                 , text_halign = text.align_right, text_valign = text.align_center, text_font_family = font.family_monospace) // , text_wrap= text.wrap_auto
                                BB.PDa_boxB := box.new(Ax,  _y, Ex +1,  mid, bgcolor=color.rgb(248, 153, 132, 90), border_color=color(na))
                            
                            // Previous swings
                            cnt = 0, hh1 = high
                            for c = 0 to sz -2
                                getX = aZZ.x.get(c)
                                getY = aZZ.y.get(c)
                                if getY > hh1 and aZZ.d.get(c) ==  1 and showSPD
                                    getY2 = (high[n - getX] - mn[n - getX]) / 4
                                    switch cnt
                                        0 =>
                                            BB.PDa_box1.set_lefttop    (getX,        getY )
                                            BB.PDaLine1.set_xy1        (getX,        getY )
                                            BB.PDa_box1.set_rightbottom(n   , getY - getY2)
                                            BB.PDaLine1.set_xy2        (n   , getY        )
                                            BB.PDa_box1.set_bgcolor    (       cSwingBl   )
                                            BB.PDaLab_1.set_xy         (       getX, getY )
                                            BB.PDaLab_1.set_size       (       size.small )
                                            BB.PDaLab_1.set_textcolor  (    PDtxtCss )
                                            BB.PDaLab_1.set_text       ('Premium PD Array')
                                            BB.PDaLab_1.set_style(label.style_label_lower_left)
                                            cnt := 1                                        
                                            hh1 := getY
                                        1 =>
                                            if getY - getY2 > hh1
                                                BB.PDa_box2.set_lefttop    (getX,        getY )
                                                BB.PDaLine2.set_xy1        (getX,        getY )
                                                BB.PDa_box2.set_rightbottom(n   , getY - getY2)
                                                BB.PDaLine2.set_xy2        (n   , getY        )
                                                BB.PDa_box2.set_bgcolor    (       cSwingBl   )
                                                BB.PDaLab_2.set_xy         (       getX, getY )
                                                BB.PDaLab_2.set_size       (       size.small )
                                                BB.PDaLab_2.set_textcolor  (    PDtxtCss )
                                                BB.PDaLab_2.set_text       ('Premium PD Array')
                                                BB.PDaLab_2.set_style(label.style_label_lower_left)                                    
                                                cnt := 2
                                if cnt == 2
                                    break                         
    
                            I  = green1prT - green1prB
                            E1 = green1prT + (I * R2a / R1a)
                            E2 = green1prT + (I * R2b / R1b)
                            E3 = green1prT + (I * R2c / R1c)
    
                            if iTP
                                if not BB.TP1_hit
                                    BB.TP1_line.set_xy1(n, E1)  
                                    BB.TP1_line.set_xy2(n + 20, E1)  
                                if not BB.TP2_hit
                                    BB.TP2_line.set_xy1(n, E2)  
                                    BB.TP2_line.set_xy2(n + 20, E2) 
                                if not BB.TP3_hit
                                    BB.TP3_line.set_xy1(n, E3)  
                                    BB.TP3_line.set_xy2(n + 20, E3) 
    
                            signals.set(BBplus, true)                        
                            alert('+BB', alert.freq_once_per_bar_close)
                            BB.aLabels.unshift(createLab('u', low, cBBplusB.notransp(), _arrowup, size.large))
    
                            break
    
                MSS.dir :=  1
                
            // MSS Bearish
            close < aZZ.y.get(iL) and aZZ.d.get(iL) == -1 and MSS.dir > -1 and per =>
                Ex   = aZZ.x.get(iL -1), Ey = aZZ.y.get(iL -1) 
                Dx   = aZZ.x.get(iL   ), Dy = aZZ.y.get(iL   ), DyMn = mn[n - Dx]
                Cx   = aZZ.x.get(iL +1), Cy = aZZ.y.get(iL +1) 
                Bx   = aZZ.x.get(iL +2), By = aZZ.y.get(iL +2), ByMn = mn[n - Bx] 
                Ax   = aZZ.x.get(iL +3), Ay = aZZ.y.get(iL +3), AyMx = mx[n - Ax]
                _y   = math.min(ByMn, DyMn)
                //_x   = _y == ByMn ? Bx : Dx
                mid  = AyMx - ((AyMx - _y) / 2) // 50% fib A- min(B, D)
                isOK = onlyWhenInPDarray ? Ay > Cy and Ay > Ey and Ey > mid : true
                //
                float red_1_prT = na
                float red_1_prB = na
                float    avg    = na
                if Ey > Cy and Cx != Dx and isOK 
                    // latest LL to LL further -> search first red bar
                    for i = n - Dx to n - Cx
                        if close[i] < open[i]
                            // reset previous swing box's
                            BB.PDa_box1.set_lefttop(na, na), BB.PDaLine1.set_xy1(na, na), BB.PDaLab_1.set_xy(na, na)
                            BB.PDa_box2.set_lefttop(na, na), BB.PDaLine2.set_xy1(na, na), BB.PDaLab_2.set_xy(na, na)
    
                            red_1_idx  = n - i
                            red_1_prT  := breakerCandleOnlyBody ? mx[i] : high[i]
                            red_1_prB  := breakerCandleOnlyBody ? mn[i] : low [i]
                            if breakerCandle_2Last 
                                if close[i +1] < open[i +1]
                                    red_2_prT  = breakerCandleOnlyBody ? mx[i +1] : high[i +1]
                                    red_2_prB  = breakerCandleOnlyBody ? mn[i +1] : low [i +1]
                                    if red_2_prT > red_1_prT or red_2_prB < red_1_prB
                                        red_1_idx -= 1
                                    red_1_prT := math.max(red_1_prT, red_2_prT)
                                    red_1_prB := math.min(red_1_prB, red_2_prB)
                            
                            // Breaker Block -
                            avg := math.avg(red_1_prB, red_1_prT)
                            while BB.aLabels.size() > 0
                                BB.aLabels.pop().delete()
                            BB.PDa_boxA.delete(), BB.PDa_boxB.delete(), BB.dir := -1
                            BB.BB_boxA.set_left   (red_1_idx)
                            BB.BB_boxA.set_top    (red_1_prT)
                            BB.BB_boxA.set_right  (    n    )
                            BB.BB_boxA.set_bottom (red_1_prB)
                            BB.BB_boxA.set_bgcolor(cBB_minA )
    
                            BB.BB_boxB.set_left   (n)
                            BB.BB_boxB.set_top    (red_1_prT)
                            BB.BB_boxB.set_right  (    n + 8)
                            BB.BB_boxB.set_bottom (red_1_prB)
                            BB.BB_boxB.set_bgcolor(cBB_minB )
                            BB.BB_boxB.set_text('-BB')
                            BB.BB_boxB.set_text_color(cBB_minB.notransp())
                            BB.BB_boxB.set_text_valign(text.align_top)
    
                            BB.BB_line.set_xy1(n, avg), BB.BB_line.set_xy2(n , avg)
    
                            if showSPD
                                BB.line_1.set_xy1(Cx, Cy), BB.line_1.set_xy2(n , Cy), BB.Broken_1 := false
                                BB.line_2.set_xy1(Ex, Ey), BB.line_2.set_xy2(n , Ey), BB.Broken_2 := false
                                BB.HL.set_xy(Ex, Ey), BB.HL.set_style(label.style_label_down), BB.HL.set_text('HH'), BB.HL.set_textcolor(PDtxtCss)
    
                            BB.TP1_hit    := false     
                            BB.TP2_hit    := false                              
                            BB.TP3_hit    := false    
                            BB.Broken     := false
                            BB.Mitigated  := false   
                            BB.scalp      := false
                            BB.PDbroken1  := false
                            BB.PDbroken2  := false
    
                            if onlyWhenInPDarray and showPDarray
                                BB.PDa_boxA := box.new(Ax, AyMx, Ex +1, mid, bgcolor=color.rgb(248, 153, 132, 90), border_color=color(na)
                                 , text = 'Premium PD Array', text_size = size.small, text_color = color.rgb(248, 153, 132, 25)
                                 , text_halign = text.align_right, text_valign = text.align_center, text_font_family = font.family_monospace) // , text_wrap= text.wrap_auto
                                BB.PDa_boxB := box.new(Ax, mid , Ex +1,  _y, bgcolor=color.rgb(132, 248, 171, 90), border_color=color(na))
    
                            // Previous swings
                            cnt = 0, ll1 = low
                            for c = 0 to sz -2
                                getX = aZZ.x.get(c)
                                getY = aZZ.y.get(c)
                                if getY < ll1 and aZZ.d.get(c) == -1 and showSPD
                                    getY2 = (mx[n - getX] - low[n - getX]) / 4
                                    switch cnt 
                                        0 =>
                                            BB.PDa_box1.set_lefttop    (getX, getY + getY2)
                                            BB.PDaLine1.set_xy1        (getX,        getY )
                                            BB.PDa_box1.set_rightbottom(       n   , getY )
                                            BB.PDaLine1.set_xy2        (       n   , getY )
                                            BB.PDa_box1.set_bgcolor    (       cSwingBr   )
                                            BB.PDaLab_1.set_xy         (       getX, getY )
                                            BB.PDaLab_1.set_size       (       size.small )
                                            BB.PDaLab_1.set_textcolor  (    PDtxtCss )
                                            BB.PDaLab_1.set_text      ('Discount PD Array')
                                            BB.PDaLab_1.set_style(label.style_label_upper_left)
    
                                            cnt := 1
                                            ll1 := getY
                                        1 => 
                                            if getY + getY2 < ll1
                                                BB.PDa_box2.set_lefttop    (getX, getY + getY2)
                                                BB.PDaLine2.set_xy1        (getX,        getY )
                                                BB.PDa_box2.set_rightbottom(       n   , getY )
                                                BB.PDaLine2.set_xy2        (       n   , getY )
                                                BB.PDa_box2.set_bgcolor    (       cSwingBr   )
                                                BB.PDaLab_2.set_xy         (       getX, getY )
                                                BB.PDaLab_2.set_size       (       size.small )
                                                BB.PDaLab_2.set_textcolor  (    PDtxtCss )
                                                BB.PDaLab_2.set_text      ('Discount PD Array')
                                                BB.PDaLab_2.set_style(label.style_label_upper_left)                                       
                                                cnt := 2
                                if cnt == 2
                                    break  
    
                            I  = red_1_prT - red_1_prB
                            E1 = red_1_prB - (I * R2a / R1a)
                            E2 = red_1_prB - (I * R2b / R1b)
                            E3 = red_1_prB - (I * R2c / R1c)
    
                            if iTP
                                if not BB.TP1_hit
                                    BB.TP1_line.set_xy1(n, E1)  
                                    BB.TP1_line.set_xy2(n + 20, E1)  
                                if not BB.TP2_hit
                                    BB.TP2_line.set_xy1(n, E2)  
                                    BB.TP2_line.set_xy2(n + 20, E2) 
                                if not BB.TP3_hit
                                    BB.TP3_line.set_xy1(n, E3)  
                                    BB.TP3_line.set_xy2(n + 20, E3) 
    
                            signals.set(BB_min, true)                        
                            alert('-BB', alert.freq_once_per_bar_close)
                            BB.aLabels.unshift(createLab('d', high, cBB_minB.notransp(), _arrowdn, size.large))
                            
                            break       
                    
                MSS.dir := -1 
    
    //-----------------------------------------------------------------------------}
    //Calculations
    //-----------------------------------------------------------------------------{
    draw(len, tpCss)  
    
    
    lft = BB.BB_boxB.get_left  ()
    top = BB.BB_boxB.get_top   ()
    btm = BB.BB_boxB.get_bottom() 
    avg = BB.BB_line.get_y2    ()
    l_1 = BB.line_1.get_y2     ()
    l_2 = BB.line_2.get_y2     ()
    TP1 = BB.TP1_line.get_y2   ()
    TP2 = BB.TP2_line.get_y2   ()
    TP3 = BB.TP3_line.get_y2   ()
    
    switch BB.dir
        1  => 
            if not BB.Mitigated
                if close < btm
                    BB.Mitigated := true 
                    signals.set(BB_endBl, true)     
                    alert('+BB Mitigated', alert.freq_once_per_bar_close)
    
                    BB.aLabels.unshift(createLab('u', low, color.yellow, _c))
                    
                    BB.BB_boxB.set_right(n)
                    BB.BB_line.set_x2   (n)
                else
                    BB.BB_boxB.set_right(n + 8)
                    BB.BB_line.set_x2   (n + 8)
                    
                BB.TP1_line.set_x2   (n)
                BB.TP2_line.set_x2   (n)
                BB.TP3_line.set_x2   (n)
    
                if n > BB.BB_boxB.get_left()
                    if not BB.Broken
                        if BB.scalp
                            if not BB.TP1_hit and open < TP1 and high > TP1
                                BB.TP1_hit := true
                                signals.set(tpUP1, true)     
                                alert('TP UP 1', alert.freq_once_per_bar)
                                BB.aLabels.unshift(createLab('c', TP1, #ff00dd, _c))
                            if not BB.TP2_hit and open < TP2 and high > TP2
                                BB.TP2_hit := true                                 
                                signals.set(tpUP2, true)     
                                alert('TP UP 2', alert.freq_once_per_bar)
                                BB.aLabels.unshift(createLab('c', TP2, #ff00dd, _c))
                            if not BB.TP3_hit and open < TP3 and high > TP3
                                BB.TP3_hit := true                        
                                signals.set(tpUP3, true)     
                                alert('TP UP 3', alert.freq_once_per_bar)
                                BB.aLabels.unshift(createLab('c', TP3, #ff00dd, _c))
                        switch
                            open > avg and open < top and close > top => 
                                BB.TP1_hit := false
                                BB.TP2_hit := false
                                BB.TP3_hit := false
                                BB.scalp   := true
                                signals.set(signUP, true)                        
                                alert('signal UP', alert.freq_once_per_bar_close)
                                BB.aLabels.unshift(createLab('u', low, color.lime, _arrowup, size.normal))
                            close < avg and close > btm => 
                                BB.Broken := true
                                BB.scalp  := false
                                signals.set(cnclUP, true)                        
                                alert('cancel UP', alert.freq_once_per_bar_close)
                                BB.aLabels.unshift(createLab('u', low, color.orange, _x))
                    else
                        // reset
                        if not tillFirstBreak and close > top 
                            BB.Broken := false  
                            BB.scalp := true 
                            signals.set(BBplus, true)                        
                            alert('+BB (R)', alert.freq_once_per_bar_close)
                            BB.aLabels.unshift(createLab('u', low, color.blue, 'R', size.normal)) 
    
            if not BB.Broken_1
                BB.line_1.set_x2(n)
                if close < l_1
                    BB.Broken_1 := true
                    signals.set(LL1break, true)                        
                    alert('LL 1 break', alert.freq_once_per_bar_close)
                    if showBreaks
                        BB.aLabels.unshift(createLab('c', low, #c00000, _c))
            if not BB.Broken_2 
                BB.line_2.set_x2(n)
                if close < l_2
                    BB.Broken_2 := true                     
                    signals.set(LL2break, true)                        
                    alert('LL 2 break', alert.freq_once_per_bar_close)
                    if showBreaks
                        BB.aLabels.unshift(createLab('c', low, #c00000, _c))
    
            if not BB.PDbroken1
                BB.PDa_box1.set_right(n)            
                BB.PDaLine1.set_x2   (n)
                if close > BB.PDa_box1.get_top() and n > BB.PDa_box1.get_left()
                    BB.PDbroken1 := true             
                    signals.set(SW1breakUP, true)                       
                    alert('Swing UP 1 break', alert.freq_once_per_bar_close)
                    if showBreaks
                        BB.aLabels.unshift(createLab('c', high, #c00000, _c))
            if not BB.PDbroken2
                BB.PDa_box2.set_right(n)            
                BB.PDaLine2.set_x2   (n)
                if close > BB.PDa_box2.get_top() and n > BB.PDa_box2.get_left()
                    BB.PDbroken2 := true                 
                    signals.set(SW2breakUP, true)                        
                    alert('Swing UP 2 break', alert.freq_once_per_bar_close)
                    if showBreaks
                        BB.aLabels.unshift(createLab('c', high, #c00000, _c))
    
        -1 =>
            if not BB.Mitigated
                if close > top
                    BB.Mitigated := true 
                    signals.set(BB_endBr, true)     
                    alert('-BB Mitigated', alert.freq_once_per_bar_close)
                    if showBreaks
                        BB.aLabels.unshift(createLab('d', high, cBB_minB.notransp(), _c))
                    BB.BB_boxB.set_right(n)
                    BB.BB_line.set_x2   (n)
                else
                    BB.BB_boxB.set_right(n + 8)
                    BB.BB_line.set_x2   (n + 8)
    
                BB.TP1_line.set_x2   (n)
                BB.TP2_line.set_x2   (n)
                BB.TP3_line.set_x2   (n)
    
                if n > BB.BB_boxB.get_left()
                    if not BB.Broken
                        if BB.scalp
                            if not BB.TP1_hit and open > TP1 and low < TP1
                                BB.TP1_hit := true                       
                                signals.set(tpDN1, true)                             
                                alert('TP DN 1', alert.freq_once_per_bar)
                                BB.aLabels.unshift(createLab('c', TP1, #ff00dd, _c))
                            if not BB.TP2_hit and open > TP2 and low < TP2
                                BB.TP2_hit := true                                 
                                signals.set(tpDN2, true)                             
                                alert('TP DN 2', alert.freq_once_per_bar)               
                                BB.aLabels.unshift(createLab('c', TP2, #ff00dd, _c))
                            if not BB.TP3_hit and open > TP3 and low < TP3
                                BB.TP3_hit := true                                    
                                signals.set(tpDN3, true)                             
                                alert('TP DN 3', alert.freq_once_per_bar)       
                                BB.aLabels.unshift(createLab('c', TP3, #ff00dd, _c))
                        switch
                            open < avg and open > btm and close < btm => 
                                BB.TP1_hit := false
                                BB.TP2_hit := false
                                BB.TP3_hit := false
                                BB.scalp   := true
                                signals.set(signDN, true)
                                alert('signal DN', alert.freq_once_per_bar_close)
                                BB.aLabels.unshift(createLab('d', high, color.orange, _arrowdn, size.normal))
                            close > avg and close < top => 
                                BB.Broken := true
                                BB.scalp  := false
                                signals.set(cnclDN, true)
                                alert('cancel DN', alert.freq_once_per_bar_close)
                                BB.aLabels.unshift(createLab('d', high, color.red   , _x))
                    else
                        // reset
                        if not tillFirstBreak and close < btm 
                            BB.Broken := false 
                            BB.scalp  := true 
                            signals.set(BB_min, true)                        
                            alert('-BB (R)', alert.freq_once_per_bar_close)                        
                            BB.aLabels.unshift(createLab('d', high, color.blue, 'R', size.normal))
    
            if not BB.Broken_1             
                BB.line_1.set_x2(n)
                if close > l_1                 
                    BB.Broken_1 := true
                    signals.set(HH1break, true)                        
                    alert('HH 1 break', alert.freq_once_per_bar_close)
                    if showBreaks
                        BB.aLabels.unshift(createLab('c', high, #c00000, _c))
            if not BB.Broken_2             
                BB.line_2.set_x2(n)
                if close > l_2
                    BB.Broken_2 := true
                    signals.set(HH2break, true)                        
                    alert('HH 2 break', alert.freq_once_per_bar_close)
                    if showBreaks
                        BB.aLabels.unshift(createLab('c', high, #c00000, _c))
    
            if not BB.PDbroken1
                BB.PDa_box1.set_right(n)
                BB.PDaLine1.set_x2   (n)
                if close < BB.PDa_box1.get_bottom() and n > BB.PDa_box1.get_left()
                    BB.PDbroken1 := true
                    signals.set(SW1breakDN, true)                        
                    alert('Swing DN 1 break', alert.freq_once_per_bar_close)
                    if showBreaks
                        BB.aLabels.unshift(createLab('c', low, #c00000, _c))
            if not BB.PDbroken2
                BB.PDa_box2.set_right(n)            
                BB.PDaLine2.set_x2   (n)
                if close < BB.PDa_box2.get_bottom() and n > BB.PDa_box2.get_left()
                    BB.PDbroken2 := true
                    signals.set(SW2breakDN, true)                        
                    alert('Swing DN 2 break', alert.freq_once_per_bar_close)
                    if showBreaks
                        BB.aLabels.unshift(createLab('c', low, #c00000, _c))
      
    //-----------------------------------------------------------------------------}
    //Alerts
    //-----------------------------------------------------------------------------{
    alertcondition(signals.get(BBplus    ), ' 1. +BB'             , '1. +BB'             )
    alertcondition(signals.get(signUP    ), ' 2. signal UP'       , '2. signal UP'       )
    alertcondition(signals.get(tpUP1     ), ' 3. TP UP 1'         , '3. TP UP 1'         )
    alertcondition(signals.get(tpUP2     ), ' 3. TP UP 2'         , '3. TP UP 2'         )
    alertcondition(signals.get(tpUP3     ), ' 3. TP UP 3'         , '3. TP UP 3'         )
    alertcondition(signals.get(cnclUP    ), ' 4. cancel UP'       , '4. cancel UP'       )
    alertcondition(signals.get(BB_endBl  ), ' 5. +BB Mitigated'   , '5. +BB Mitigated'   )
    alertcondition(signals.get(LL1break  ), ' 6. LL 1 Break'      , '6. LL 1 Break'      )
    alertcondition(signals.get(LL2break  ), ' 6. LL 2 Break'      , '6. LL 2 Break'      )
    alertcondition(signals.get(SW1breakUP), ' 7. Swing UP 1 Break', '7. Swing UP 1 Break')
    alertcondition(signals.get(SW2breakUP), ' 7. Swing UP 2 Break', '7. Swing UP 2 Break')
    
    alertcondition(signals.get(BB_min    ),  '1. -BB'             , '1. -BB'             )
    alertcondition(signals.get(signDN    ),  '2. signal DN'       , '2. signal DN'       )
    alertcondition(signals.get(tpDN1     ),  '3. TP DN 1'         , '3. TP DN 1'         )
    alertcondition(signals.get(tpDN2     ),  '3. TP DN 2'         , '3. TP DN 2'         )
    alertcondition(signals.get(tpDN3     ),  '3. TP DN 3'         , '3. TP DN 3'         )
    alertcondition(signals.get(cnclDN    ),  '4. cancel DN'       , '4. cancel DN'       )
    alertcondition(signals.get(BB_endBr  ),  '5. -BB Mitigated'   , '5. -BB Mitigated'   )
    alertcondition(signals.get(HH1break  ),  '6. HH 1 Break'      , '6. HH 1 Break'      )
    alertcondition(signals.get(HH2break  ),  '6. HH 2 Break'      , '6. HH 2 Break'      )
    alertcondition(signals.get(SW1breakDN),  '7. Swing DN 1 Break', '7. Swing DN 1 Break')
    alertcondition(signals.get(SW2breakDN),  '7. Swing DN 2 Break', '7. Swing DN 2 Break')
    
    //-----------------------------------------------------------------------------}
    #243788 quote
    Alai-nAlai-n
    Participant
    Veteran

    UP

    #254816 quote
    Iván GonzálezIván González
    Moderator
    Legend

    Esto es lo mejor que he podido lograr

    C’est le mieux que j’ai pu faire.

    //----------------------------------------
    //PRC_Breaker Blocks with Signals [LuxAlgo]
    //version = 0
    //29.12.2025
    //Iván González @ www.prorealcode.com
    //Sharing ProRealTime knowledge
    //----------------------------------------
    // --- CONFIGURACIÓN DE USUARIO ---
    //----------------------------------------
    // Market Structure
    len = 5 // Longitud para detección de pivotes (1-10)
    // Breaker Block
    breakerCandleOnlyBody = 0 // 0 = Usar mechas, 1 = Usar solo cuerpo de la vela
    breakerCandle2Last = 0 // 0 = Usar 1 vela, 1 = Usar 2 velas
    tillFirstBreak = 1 // 1 = Detener en la primera ruptura de la línea central
    //----------------------------------------
    // --- INICIALIZACIÓN DE VARIABLES Y ARRAYS ---
    //----------------------------------------
    ONCE mCxSize = 50 // Máximo número de pivotes a recordar
    
    // Arrays para el ZigZag (Pivotes)
    ONCE $zzDir[mCxSize] = 0
    ONCE $zzX[mCxSize] = 0
    ONCE $zzY[mCxSize] = 0
    
    ONCE blockBlCount = 0
    ONCE blockBrCount = 0
    ONCE mssDir = 0
    signalValue = 0
    //----------------------------------------
    // --- LÓGICA PRINCIPAL ---
    //----------------------------------------
    // --- Detección de Pivotes (ZigZag) ---
    isPivotHigh = (high[1] = highest[len*2+1](high[1]))
    isPivotLow = (low[1] = lowest[len*2+1](low[1]))
    // Si se detecta un nuevo pivote, se actualiza el array de pivotes
    IF isPivotHigh THEN
       // Si el pivote anterior era un mínimo, añadimos un nuevo máximo
       IF $zzDir[0] < 1 THEN
          FOR i = mCxSize-1 DOWNTO 1 DO
             $zzDir[i] = $zzDir[i-1]
             $zzX[i] = $zzX[i-1]
             $zzY[i] = $zzY[i-1]
          NEXT
          $zzDir[0] = 1
          $zzX[0] = barindex - 1
          $zzY[0] = high[1]
          // Si el pivote anterior también era un máximo, actualizamos si el nuevo es más alto
       ELSIF isPivotHigh AND $zzY[0] < high[1] THEN
          $zzX[0] = barindex - 1
          $zzY[0] = high[1]
       ENDIF
    ENDIF
    
    IF isPivotLow THEN
       // Si el pivote anterior era un máximo, añadimos un nuevo mínimo
       IF $zzDir[0] > -1 THEN
          FOR i = mCxSize-1 DOWNTO 1 DO
             $zzDir[i] = $zzDir[i-1]
             $zzX[i] = $zzX[i-1]
             $zzY[i] = $zzY[i-1]
          NEXT
          $zzDir[0] = -1
          $zzX[0] = barindex - 1
          $zzY[0] = low[1]
          // Si el pivote anterior también era un mínimo, actualizamos si el nuevo es más bajo
       ELSIF isPivotLow AND $zzY[0] > low[1] THEN
          $zzX[0] = barindex - 1
          $zzY[0] = low[1]
       ENDIF
    ENDIF
    
    //----------------------------------------
    // --- Detección de Ruptura de Estructura y Creación de Breaker Blocks ---
    //----------------------------------------
    // Buscamos el índice del último HL y el último LL
    iH = 0
    iL = 0
    IF $zzDir[2] = 1 THEN
       iH = 2
    ELSE
       iH = 1
    ENDIF
    IF $zzDir[2] = -1 THEN
       iL = 2
    ELSE
       iL = 1
    ENDIF
    //----------------------------------------
    // --- Lógica para Breaker Block Alcista (+BB) ---
    //----------------------------------------
    // Condición: Ruptura de un máximo (MSS alcista)
    IF close > $zzY[iH] AND $zzDir[iH] = 1 AND mssDir < 1 THEN
       // Pivotes relevantes para el patrón
       Ex = $zzX[iH-1]
       Ey = $zzY[iH-1]
       Dx = $zzX[iH]
       Cx = $zzX[iH+1]
       Cy = $zzY[iH+1]
       
       // Comprobamos que la estructura sea válida (E < C)
       IF Ey < Cy AND Cx <> Dx THEN
          // Buscamos la última vela alcista (roja) antes de la ruptura
          breakerFound = 0
          FOR i = (barindex - Dx) TO (barindex - Cx) DO
             IF close[i] > open[i] AND breakerFound = 0 THEN
                breakerFound = 1
                
                // Definimos el Breaker Block
                blockBlCount = blockBlCount + 1
                idx = blockBlCount
                
                $blockBlDir[idx] = 1
                $blockBlStartIndex[idx] = barindex - i
                
                IF breakerCandleOnlyBody = 1 THEN
                   $blockBlTop[idx] = max(open[i], close[i])
                   $blockBlBottom[idx] = min(open[i], close[i])
                ELSE
                   $blockBlTop[idx] = high[i]
                   $blockBlBottom[idx] = low[i]
                ENDIF
                
                // Si se usan 2 velas
                IF breakerCandle2Last = 1 AND close[i+1] > open[i+1] THEN
                   $blockBlStartIndex[idx] = barindex - (i+1)
                   IF breakerCandleOnlyBody = 1 THEN
                      $blockBlTop[idx] = max($blockBlTop[idx], max(open[i+1], close[i+1]))
                      $blockBlBottom[idx] = min($blockBlBottom[idx], min(open[i+1], close[i+1]))
                   ELSE
                      $blockBlTop[idx] = max($blockBlTop[idx], high[i+1])
                      $blockBlBottom[idx] = min($blockBlBottom[idx], low[i+1])
                   ENDIF
                ENDIF
                
                $blockBlAvg[idx] = ($blockBlTop[idx] + $blockBlBottom[idx]) / 2
                
                // Calcular niveles de Take Profit (R:R 1:2, 1:3, 1:4)
                blockHeight = $blockBlTop[idx] - $blockBlBottom[idx]
                $blockBlTP1[idx] = $blockBlTop[idx] + blockHeight * 2
                $blockBlTP2[idx] = $blockBlTop[idx] + blockHeight * 3
                $blockBlTP3[idx] = $blockBlTop[idx] + blockHeight * 4
                
                // Reset de estados
                $blockBlIsBroken[idx] = 0
                $blockBlIsMitigated[idx] = 0
                $blockBlSignalFired[idx] = 0
                $blockBlTP1Hit[idx] = 0
                $blockBlTP2Hit[idx] = 0
                $blockBlTP3Hit[idx] = 0
             ENDIF
          NEXT
       ENDIF
       mssDir = 1 // Marcar que la estructura es alcista
    ENDIF
    
    //----------------------------------------
    // --- Lógica para Breaker Block Bajista (-BB) ---
    //----------------------------------------
    // Condición: Ruptura de un mínimo (MSS bajista)
    IF close < $zzY[iL] AND $zzDir[iL] = -1 AND mssDir > -1 THEN
       Ex = $zzX[iL-1]
       Ey = $zzY[iL-1]
       Dx = $zzX[iL]
       Cx = $zzX[iL+1]
       Cy = $zzY[iL+1]
       
       IF Ey > Cy AND Cx <> Dx THEN
          breakerFound = 0
          FOR i = (barindex - Dx) TO (barindex - Cx) DO
             IF close[i] < open[i] AND breakerFound = 0 THEN
                breakerFound = 1
                
                blockBrCount = blockBrCount + 1
                idx = blockBrCount
                
                $blockBrDir[idx] = -1
                $blockBrStartIndex[idx] = barindex - i
                
                IF breakerCandleOnlyBody = 1 THEN
                   $blockBrTop[idx] = max(open[i], close[i])
                   $blockBrBottom[idx] = min(open[i], close[i])
                ELSE
                   $blockBrTop[idx] = high[i]
                   $blockBrBottom[idx] = low[i]
                ENDIF
                
                IF breakerCandle2Last = 1 AND close[i+1] < open[i+1] THEN
                   $blockBrStartIndex[idx] = barindex - (i+1)
                   IF breakerCandleOnlyBody = 1 THEN
                      $blockBrTop[idx] = max($blockBrTop[idx], max(open[i+1], close[i+1]))
                      $blockBrBottom[idx] = min($blockBrBottom[idx], min(open[i+1], close[i+1]))
                   ELSE
                      $blockBrTop[idx] = max($blockBrTop[idx], high[i+1])
                      $blockBrBottom[idx] = min($blockBrBottom[idx], low[i+1])
                   ENDIF
                ENDIF
                
                $blockBrAvg[idx] = ($blockBrTop[idx] + $blockBrBottom[idx]) / 2
                
                blockHeight = $blockBrTop[idx] - $blockBrBottom[idx]
                $blockBrTP1[idx] = $blockBrBottom[idx] - blockHeight * 2
                $blockBrTP2[idx] = $blockBrBottom[idx] - blockHeight * 3
                $blockBrTP3[idx] = $blockBrBottom[idx] - blockHeight * 4
                
                $blockBrIsBroken[idx] = 0
                $blockBrIsMitigated[idx] = 0
                $blockBrSignalFired[idx] = 0
                $blockBrTP1Hit[idx] = 0
                $blockBrTP2Hit[idx] = 0
                $blockBrTP3Hit[idx] = 0
             ENDIF
          NEXT
       ENDIF
       mssDir = -1 // Marcar que la estructura es bajista
    ENDIF
    
    //----------------------------------------
    // --- GESTIÓN Y DIBUJO DE BLOQUES ACTIVOS ---
    //----------------------------------------
    // Recorremos todos los bloques alcistas para dibujarlos y gestionar su estado
    IF blockBlCount > 0 THEN
       FOR i = 1 TO blockBlCount DO
          // Solo procesamos bloques que no han sido rotos
          IF $blockBlIsBroken[i] = 0 THEN
             // Dibujar el rectángulo del Breaker Block
             DRAWRECTANGLE($blockBlStartIndex[i], $blockBlTop[i], barindex, $blockBlBottom[i]) coloured("green",0)fillcolor("green",10)
             
             // Comprobar mitigación
             IF low < $blockBlTop[i] AND $blockBlIsMitigated[i] = 0 THEN
                $blockBlIsMitigated[i] = 1
                DRAWTEXT("M", barindex, $blockBlBottom[i] - ticksize*10) coloured("fuchsia")
             ENDIF
             
             // Comprobar señal de entrada
             IF $blockBlIsMitigated[i] = 1 AND $blockBlSignalFired[i] = 0 AND close crosses over $blockBlTop[i] THEN
                $blockBlSignalFired[i] = 1
                signalValue = 1 // Señal alcista
                DRAWARROWUP(barindex, low - averagetruerange[20]) coloured("lime")
             ENDIF
             
             // Comprobar si el bloque se rompe
             IF close < $blockBlBottom[i] THEN
                $blockBlIsBroken[i] = 1
                signalValue = 10 // Señal de cancelación alcista
                DRAWTEXT("X", $blockBlStartIndex[i], $blockBlAvg[i]) coloured("red")
             ENDIF
             
             // Comprobar Take Profits si la señal se ha activado
             IF $blockBlSignalFired[i] = 1 THEN
                DRAWSEGMENT(barindex, $blockBlTP1[i], barindex+5, $blockBlTP1[i]) coloured("blue")
                DRAWSEGMENT(barindex, $blockBlTP2[i], barindex+5, $blockBlTP2[i]) coloured("blue")
                DRAWSEGMENT(barindex, $blockBlTP3[i], barindex+5, $blockBlTP3[i]) coloured("blue")
                
                IF high crosses over $blockBlTP1[i] AND $blockBlTP1Hit[i] = 0 THEN
                   $blockBlTP1Hit[i] = 1
                   DRAWTEXT("TP1", barindex, $blockBlTP1[i]) coloured("blue")
                ENDIF
                IF high crosses over $blockBlTP2[i] AND $blockBlTP2Hit[i] = 0 THEN
                   $blockBlTP2Hit[i] = 1
                   DRAWTEXT("TP2", barindex, $blockBlTP2[i]) coloured("blue")
                ENDIF
                IF high crosses over $blockBlTP3[i] AND $blockBlTP3Hit[i] = 0 THEN
                   $blockBlTP3Hit[i] = 1
                   DRAWTEXT("TP3", barindex, $blockBlTP3[i]) coloured("blue")
                ENDIF
             ENDIF
          ENDIF
       NEXT
    ENDIF
    
    // Recorremos todos los bloques bajistas para dibujarlos y gestionar su estado
    IF blockBrCount > 0 THEN
       FOR i = 1 TO blockBrCount DO
          IF $blockBrIsBroken[i] = 0 THEN
             DRAWRECTANGLE($blockBrStartIndex[i], $blockBrTop[i], barindex, $blockBrBottom[i]) coloured("red",0)fillcolor("red",10)
             
             IF high > $blockBrBottom[i] AND $blockBrIsMitigated[i] = 0 THEN
                $blockBrIsMitigated[i] = 1
                DRAWTEXT("M", barindex, $blockBrTop[i] + ticksize*10) coloured("fuchsia")
             ENDIF
             
             IF $blockBrIsMitigated[i] = 1 AND $blockBrSignalFired[i] = 0 AND close crosses under $blockBrBottom[i] THEN
                $blockBrSignalFired[i] = 1
                signalValue = -1 // Señal bajista
                DRAWARROWDOWN(barindex, high + averagetruerange[20]) coloured("darkRed")
             ENDIF
             
             IF close > $blockBrTop[i] THEN
                $blockBrIsBroken[i] = 1
                signalValue = -10 // Señal de cancelación bajista
                DRAWTEXT("X", $blockBrStartIndex[i], $blockBrAvg[i]) coloured("red")
             ENDIF
             
             IF $blockBrSignalFired[i] = 1 THEN
                DRAWSEGMENT(barindex, $blockBrTP1[i], barindex+5, $blockBrTP1[i]) coloured("blue")
                DRAWSEGMENT(barindex, $blockBrTP2[i], barindex+5, $blockBrTP2[i]) coloured("blue")
                DRAWSEGMENT(barindex, $blockBrTP3[i], barindex+5, $blockBrTP3[i]) coloured("blue")
                
                IF low crosses under $blockBrTP1[i] AND $blockBrTP1Hit[i] = 0 THEN
                   $blockBrTP1Hit[i] = 1
                   DRAWTEXT("TP1", barindex, $blockBrTP1[i]) coloured("blue")
                ENDIF
                IF low crosses under $blockBrTP2[i] AND $blockBrTP2Hit[i] = 0 THEN
                   $blockBrTP2Hit[i] = 1
                   DRAWTEXT("TP2", barindex, $blockBrTP2[i]) coloured("blue")
                ENDIF
                IF low crosses under $blockBrTP3[i] AND $blockBrTP3Hit[i] = 0 THEN
                   $blockBrTP3Hit[i] = 1
                   DRAWTEXT("TP3", barindex, $blockBrTP3[i]) coloured("blue")
                ENDIF
             ENDIF
          ENDIF
       NEXT
    ENDIF
    //----------------------------------------
    RETURN
    
    robertogozzi and Alai-n thanked this post
Viewing 3 posts - 1 through 3 (of 3 total)
  • You must be logged in to reply to this topic.
ProRealAI ProRealAI New

Stuck on this ProBuilder code?

Describe what this topic is trying to build, in plain English, and ProRealAI writes the ProRealTime™ indicator, screener or system for you.

Available in 7 languages
Try ProRealAI

Traduction Breaker Block de LuxAlgo


ProBuilder : Indicateurs & Outils Personnalisés

New Reply
Author
author-avatar
Alai-n @alai-n Participant
Summary

This topic contains 2 replies,
has 2 voices, and was last updated by Iván GonzálezIván González
8 months, 3 weeks ago.

Topic Details
Forum: ProBuilder : Indicateurs & Outils Personnalisés
Language: French
Started: 01/15/2025
Status: Active
Attachments: No files
ProRealCode ProRealCode
Loading...