Order Block Strategy

Viewing 2 posts - 1 through 2 (of 2 total)
  • Author
    Posts
  • #253698 quote
    neddyboy
    Participant
    New

    Hi all,

    I’m really interested in price action/volume trading and am trying to create an automated strategy based on order blocks with the following indicator code:

    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
    //showStructure=1
    //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
    
    $itopx[m+1]=itopx
    $itopy[m+1]=itopy
    $ichoch[m+1]=choch
    $iright[m+1]=barindex
    m=m+1
    
    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
    
    $topx[g+1]=topx
    $topy[g+1]=topy
    $topchoch[g+1]=choch
    $right[g+1]=barindex
    g=g+1
    
    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
    
    $ibotx[s+1]=ibotx
    $iboty[s+1]=iboty
    $ibotchoch[s+1]=choch
    $ibotright[s+1]=barindex
    s=s+1
    
    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
    
    $botx[w+1]=botx
    $boty[w+1]=boty
    $botchoch[w+1]=choch
    $botright[w+1]=barindex
    w=w+1
    
    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
    

    Ideally, I’d like the system to buy on the next green heikin ashi candle after price enters a green order block. Stop loss would be set just below the green order block and Take profit would be 2:1 or the next red order block (whatever comes first). For selling the system would do the opposite.

    Is this possible to do with this code or could anybody help?

    Many thanks
    Jim

    #253758 quote
    Iván González
    Moderator
    Master

    Here's an example to get you started.

    //------------------------------------
    // Estrategia SMC (Internal CHoCH)
    //------------------------------------
    
    DEFPARAM CumulateOrders = False
    
    //----- Variables / Parámetros -----
    length = 50
    ifilterConfluence = 0 // 1 = Activar filtro de confluencia
    
    //----- Inicialización de variables de estado -----
    ONCE os = 0
    ONCE os1 = 0
    ONCE itrend = 0 // 1 = Alcista, -1 = Bajista
    ONCE topcross = 0
    ONCE botcross = 0
    ONCE itopcross = 0
    ONCE ibotcross = 0
    
    //----- Cálculo de Swings (Estructura Mayor) -----
    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
    
    //----- Cálculo de Swings (Estructura Interna - 5 periodos) -----
    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
    
    //----- Gestión de Pivotes (Memoria del precio) -----
    // Mayor
    IF mytop > 0 THEN
       topcross = 1
       topy = mytop
    ENDIF
    
    IF mybot > 0 THEN
       botcross = 1
       boty = mybot
    ENDIF
    
    // Interno
    IF itop > 0 THEN
       itopcross = 1
       itopy = itop
    ENDIF
    
    IF ibot > 0 THEN
       ibotcross = 1
       iboty = ibot
    ENDIF
    
    //----- LÓGICA DE ESTRATEGIA (Internal CHoCH) -----
    
    // 1. Detección de ruptura Alcista Interna
    bullConcordant = 1
    IF ifilterConfluence THEN
       bullConcordant = high - max(close, open) > min(close, open - low)
    ENDIF
    
    // Condición: Cierre cruza por encima del último techo interno
    IF close CROSSES OVER itopy AND itopcross AND topy <> itopy AND bullConcordant THEN
       
       // Si la tendencia interna venía bajista (< 0), esto es un CHoCH Alcista
       IF itrend < 0 THEN
          // ENTRADA LARGA
          BUY 1 CONTRACT AT MARKET
          SET STOP %LOSS 5
          SET TARGET %PROFIT 5
       ENDIF
       
       itopcross = 0
       itrend = 1
    ENDIF
    
    // 2. Detección de ruptura Bajista Interna
    bearConcordant = 1
    IF ifilterConfluence THEN
       bearConcordant = high - max(close, open) < min(close, open - low)
    ENDIF
    
    // Condición: Cierre cruza por debajo del último suelo interno
    IF close CROSSES UNDER iboty AND ibotcross AND boty <> iboty AND bearConcordant THEN
       
       // Si la tendencia interna venía alcista (> 0), esto es un CHoCH Bajista
       IF itrend > 0 THEN
          // ENTRADA CORTA
          SELLSHORT 1 CONTRACT AT MARKET
          SET STOP %LOSS 5
          SET TARGET %PROFIT 5
       ENDIF
       
       ibotcross = 0
       itrend = -1
    ENDIF
    
    neddyboy and robertogozzi thanked this post
Viewing 2 posts - 1 through 2 (of 2 total)
  • You must be logged in to reply to this topic.

Order Block Strategy


ProOrder: Automated Strategies & Backtesting

New Reply
Author
author-avatar
neddyboy @neddyboy Participant
Summary

This topic contains 1 reply,
has 2 voices, and was last updated by Iván González
2 months, 4 weeks ago.

Topic Details
Forum: ProOrder: Automated Strategies & Backtesting
Language: English
Started: 11/17/2025
Status: Active
Attachments: No files
Logo Logo
Loading...