SMC proScreener

Viewing 6 posts - 1 through 6 (of 6 total)
  • #244627

    Hola, me gustaría un ProScreener sobre el indicador SMC que hizo Iván hace unos meses, en concreto me gustaría que me pudiera avisar del valor que entrara en un bloque activo (cuando se pone de color amarillo) ya sea alcista o bajista, y que la vela que en cuestión indicara una posible reversión con un dogi o martillo alcista o bajista según la situación en ese momento, el código del indicador es el siguiente:

    defparam drawonlastbaronly=true
    //——————————————————————————–//
    //PRC_Smart Money Concepts
    //version = 1
    //29.07.2024
    //Iván González @ http://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(“blue”,0)fillcolor(“blue”,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(“blue”,0)fillcolor(“blue”,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(“black”)
    else
    drawtext(“LH”,$phx[i],$phy[i]+atr*0.5)coloured(“black”)
    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(“black”)
    else
    drawtext(“HL”,$plx[i],$ply[i]-atr*0.5)coloured(“black”)
    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(“black”)
    drawsegment(trailupx,trailup,n+20,trailup)coloured(“black”)
    if trend>0 then
    drawtext(“Strong Low”,(traildnx+n+20)/2,traildn-0.35*atr)coloured(“black”)
    drawtext(“Weak High”,(trailupx+n+20)/2,trailup+0.35*atr)coloured(“black”)
    else
    drawtext(“Weak Low”,(traildnx+n+20)/2,traildn-0.35*atr)coloured(“black”)
    drawtext(“Strong High”,(trailupx+n+20)/2,trailup+0.35*atr)coloured(“black”)
    endif
    endif
    endif
    //——————————————————————————–//
    return

    #244629

    Hola de nuevo, quería hacer un inciso en mi propuesta, con que el proScreener avisara cuando un bloque se pusiera de color amarillo (es decir que el precio entrara en dicho bloque ya sea alcista o bajista) me vendría bien, porque lo menos importante es como en ese momento se forme la vela, pues ya estaría alerta de la situación y vería como termina la vela en cuestión al final del día, gracias por la atención.

    #244646

    Buenas. Aquí tendrías un primer screener.

    2 users thanked author for this post.
    #244652

    Hola Iván, te agradezco tu esfuerzo por hacer el trabajo, pero cuando hago la búsqueda no me da el resultado previsto, me salen 11 valores de los cuáles solo 1 tiene la condición que pedí, que es que el precio se encuentre dentro de una zona de soporte o resistencia (color amarillo), no sé si hay algo que se pasó y no da el fruto previsto, saludos

    #244836

    Hola Iván, por problemas personales no he podido entrar en el foro hasta ahora, cuando escribí el post de más arriba no estaba con el tiempo real y puede que por ello me diera fallo. Hoy sí que estoy con tiempo real y me va mejor, me salen 4 acciones que cumplen con la condición de que el precio se encuentre en un bloque de color amarillo, no obstante echando un vistazo a los gráficos veo que hay otros 2 valores que se encuentran en un bloque amarillo y no me salen en el Proscreener, la razón no la sé, de todas maneras, gracias por todo.

    #244864

    Buenas. El problema también puede estar en el ATR.
    Los screeners tienen la limitación de 256 barras (versión completa) y 1024 barras (version premium). El problema es que para calcular un ATR de 200 periodos necesitas más barras todavía ya que el cáclulo del ATR llea implícito una media de Wilder que necesita 10 veces más velas de los periodos del ATR.
    Así que si el ATR o cualquier otro indicador necesita más velas para el cálculo, el screener no dará buenos resultados.

Viewing 6 posts - 1 through 6 (of 6 total)

Create your free account now and post your request to benefit from the help of the community
Register or Login