Indicatore Smart money concept breakout channels

Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • #258631 quote
    Msport71
    Participant
    Average

    Buongiorno,

    volevo sapere in quale parte del codice fosse possibile variare il numero di candele ( in aumento, per poter vedere un maggior periodo storico di giorni) rispetto a quello impostato di default.


    Grazie per l’aiuto


    //—————————————————

    // PRC_Smart Money Breakout Channels (by AlgoAlpha)

    // version = 0

    // 26.02.2026

    // Iván González @ http://www.prorealcode.com

    // Sharing ProRealTime knowledge

    //—————————————————

    defparam drawonlastbaronly = true

    //—————————————————

    // ===== PARÁMETROS =====

    //—————————————————

    overlapMode = 0  // 0=un canal a la vez, 1=canales anidados

    strongClose = 1  // 1=cierres fuertes (>50% cuerpo fuera), 0=cualquier cierre

    normLength = 100  // Longitud normalización precio

    boxLength = 14   // Longitud detección canal

    minDuration = 10  // Duración mínima consolidación

    showGauge = 1   // 1=mostrar gauge, 0=ocultar

    maxCh = 30     // Máximo canales almacenados (FIFO: siempre los recientes)

    //—————————————————

    // ===== NORMALIZACIÓN Y VOLATILIDAD =====

    //—————————————————

    lowestL = lowest[normLength](low)

    highestH = highest[normLength](high)

    IF highestH – lowestL <> 0 THEN

    normPrice = (close – lowestL) / (highestH – lowestL)

    ELSE

    normPrice = 0.5

    ENDIF



    volat = std[14](normPrice)

    //—————————————————

    // Detección máximo/mínimo volatilidad

    //—————————————————

    hbVol = HighestBars[boxLength + 1](volat)

    lbVol = LowestBars[boxLength + 1](volat)

    upperDet = (boxLength – hbVol) / boxLength

    lowerDet = (boxLength – lbVol) / boxLength

    //—————————————————

    // ===== DURACIÓN CONSOLIDACIÓN =====

    //—————————————————

    ONCE sinceLCross = 999

    IF lowerDet crosses over upperDet THEN

    sinceLCross = 0

    ELSE

    sinceLCross = sinceLCross + 1

    ENDIF

    dur = max(sinceLCross, 1)



    // Rango del periodo de consolidación

    chanH = highest[dur](high)

    chanL = lowest[dur](low)

    //—————————————————

    // ===== ESTIMACIÓN VOLUME DELTA =====

    //—————————————————

    IF high – low <> 0 THEN

    upVol = volume * (close – low) / (high – low)

    downVol = volume * (high – close) / (high – low)

    ELSE

    upVol = volume / 2

    downVol = volume / 2

    ENDIF

    volDelta = upVol – downVol



    ONCE hvold = 0

    ONCE lvold = 0



    IF lowerDet crosses over upperDet THEN

    hvold = volDelta

    lvold = volDelta

    ENDIF

    IF volDelta > hvold THEN

    hvold = volDelta

    ENDIF

    IF volDelta < lvold THEN

    lvold = volDelta

    ENDIF

    //—————————————————

    // ===== ALMACENAMIENTO CANALES =====

    //—————————————————

    ONCE numCh = 0

    // $chTop[i], $chBot[i] = techo/suelo canal

    // $chLeft[i], $chRight[i] = barindex inicio/fin

    // $chActive[i] = 1 activo, 0 roto

    // $chDir[i] = 0 activo, 1 bull break, -1 bear break

    // $chBrkBar[i] = barindex de ruptura

    // $chBrkPrc[i] = precio señal ruptura

    //—————————————————

    // ===== DETECCIÓN NUEVO CANAL =====

    //—————————————————

    IF upperDet crosses over lowerDet AND dur > minDuration THEN

    canCreate = 1



    IF overlapMode = 0 AND numCh > 0 THEN

    checkDone = 0

    FOR ic = 0 TO numCh – 1 DO

    IF checkDone = 0 AND $chActive[ic] = 1 THEN

    IF chanH > $chBot[ic] AND chanL < $chTop[ic] THEN

    canCreate = 0

    checkDone = 1

    ENDIF

    ENDIF

    NEXT

    ENDIF



    IF canCreate = 1 THEN

    // FIFO: si lleno, eliminar el más antiguo y desplazar todo

    IF numCh >= maxCh THEN

    FOR sh = 0 TO maxCh – 2 DO

    $chTop[sh] = $chTop[sh + 1]

    $chBot[sh] = $chBot[sh + 1]

    $chLeft[sh] = $chLeft[sh + 1]

    $chRight[sh] = $chRight[sh + 1]

    $chActive[sh] = $chActive[sh + 1]

    $chDir[sh] = $chDir[sh + 1]

    $chBrkBar[sh] = $chBrkBar[sh + 1]

    $chBrkPrc[sh] = $chBrkPrc[sh + 1]

    NEXT

    numCh = maxCh – 1

    ENDIF



    $chTop[numCh] = chanH

    $chBot[numCh] = chanL

    $chLeft[numCh] = barindex – dur

    $chRight[numCh] = barindex

    $chActive[numCh] = 1

    $chDir[numCh] = 0

    $chBrkBar[numCh] = 0

    $chBrkPrc[numCh] = 0

    numCh = numCh + 1

    ENDIF

    ENDIF

    //—————————————————

    // ===== DETECCIÓN BREAKOUT =====

    //—————————————————

    IF strongClose = 1 THEN

    testPrc = (close + open) / 2

    ELSE

    testPrc = close

    ENDIF



    IF numCh > 0 THEN

    FOR ib = 0 TO numCh – 1 DO

    IF $chActive[ib] = 1 THEN

    IF testPrc > $chTop[ib] THEN

    $chActive[ib] = 0

    $chDir[ib] = 1

    $chRight[ib] = barindex

    $chBrkBar[ib] = barindex

    $chBrkPrc[ib] = $chBot[ib]

    ELSIF testPrc < $chBot[ib] THEN

    $chActive[ib] = 0

    $chDir[ib] = -1

    $chRight[ib] = barindex

    $chBrkBar[ib] = barindex

    $chBrkPrc[ib] = $chTop[ib]

    ELSE

    $chRight[ib] = barindex

    ENDIF

    ENDIF

    NEXT

    ENDIF



    // ATR para zonas internas

    halfATR = averagetruerange[boxLength] / 2



    //—————————————————

    // ==== DIBUJO ===

    //—————————————————

    IF islastbarupdate AND numCh > 0 THEN



    FOR id = 0 TO numCh – 1 DO



    // Canal principal (gris)

    DRAWRECTANGLE($chLeft[id], $chTop[id], $chRight[id], $chBot[id]) coloured(128, 128, 128, 255) fillcolor(128, 128, 128, 120)



    // Zona superior roja

    topZBot = $chTop[id] – halfATR

    IF topZBot < $chBot[id] THEN

    topZBot = ($chTop[id] + $chBot[id]) / 2

    ENDIF

    DRAWRECTANGLE($chLeft[id], $chTop[id], $chRight[id], topZBot) coloured(255, 50, 0, 255) fillcolor(255, 50, 0, 180)



    // Zona inferior verde

    botZTop = $chBot[id] + halfATR

    IF botZTop > $chTop[id] THEN

    botZTop = ($chTop[id] + $chBot[id]) / 2

    ENDIF

    DRAWRECTANGLE($chLeft[id], botZTop, $chRight[id], $chBot[id]) coloured(0, 200, 100, 255) fillcolor(0, 200, 100, 180)



    // Línea central

    midY = ($chTop[id] + $chBot[id]) / 2

    DRAWSEGMENT($chLeft[id], midY, $chRight[id], midY) coloured(180, 180, 180) style(dottedline, 1)



    // Señales de breakout

    IF $chDir[id] = 1 AND $chBrkBar[id] > 0 THEN

    DRAWARROWUP($chBrkBar[id], $chBrkPrc[id]) coloured(0, 255, 187)

    ELSIF $chDir[id] = -1 AND $chBrkBar[id] > 0 THEN

    DRAWARROWDOWN($chBrkBar[id], $chBrkPrc[id]) coloured(255, 17, 0)

    ENDIF



    NEXT



    // — GAUGE —

    IF showGauge = 1 THEN

    // Buscar canal activo más reciente

    activeIdx = -2

    FOR ig = 0 TO numCh – 1 DO

    jg = numCh – 1 – ig

    IF activeIdx = -2 AND $chActive[jg] = 1 THEN

    activeIdx = jg

    ENDIF

    NEXT



    IF activeIdx >= 0 THEN

    gTop = $chTop[activeIdx]

    gBot = $chBot[activeIdx]

    gRange = gTop – gBot



    IF gRange > 0 THEN

    nSeg = 7

    segH = gRange / nSeg

    gX1 = barindex + 2

    gX2 = barindex + 4



    FOR gs = 0 TO nSeg – 1 DO

    segTop = gTop – gs * segH

    segBot = gTop – (gs + 1) * segH



    IF gs = 0 THEN

    cr = 0

    cg = 220

    cb = 120

    ELSIF gs = 1 THEN

    cr = 50

    cg = 200

    cb = 80

    ELSIF gs = 2 THEN

    cr = 120

    cg = 180

    cb = 40

    ELSIF gs = 3 THEN

    cr = 200

    cg = 200

    cb = 0

    ELSIF gs = 4 THEN

    cr = 220

    cg = 140

    cb = 0

    ELSIF gs = 5 THEN

    cr = 240

    cg = 80

    cb = 0

    ELSE

    cr = 255

    cg = 30

    cb = 0

    ENDIF



    DRAWRECTANGLE(gX1, segTop, gX2, segBot) coloured(cr, cg, cb) fillcolor(cr, cg, cb)

    NEXT



    // Puntero gauge

    IF hvold – lvold <> 0 THEN

    normDlt = (volDelta – lvold) / (hvold – lvold)

    ELSE

    normDlt = 0.5

    ENDIF

    delvol = -200 * normDlt + 100

    IF delvol > 100 THEN

    delvol = 100

    ENDIF

    IF delvol < -100 THEN

    delvol = -100

    ENDIF

    ptrPos = gTop – ((delvol + 100) / 200) * gRange



    DRAWTEXT(“◀”, gX2 + 1, ptrPos) coloured(0, 0, 0)

    ENDIF

    ENDIF

    ENDIF



    ENDIF



    RETURN


    #258644 quote
    Iván González
    Moderator
    Master

    Ciao. Devi modificare la variabile maxCh a 30. Aumentando il valore si otterrà di più.

    Msport71 thanked this post
    #258650 quote
    Msport71
    Participant
    Average

    Gentilissimo Grazie!

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

Indicatore Smart money concept breakout channels


ProBuilder: Indicatori & Strumenti Personalizzati

New Reply
Author
author-avatar
Msport71 @carlo-pasca Participant
Summary

This topic contains 2 replies,
has 2 voices, and was last updated by Msport71
2 weeks, 4 days ago.

Topic Details
Forum: ProBuilder: Indicatori & Strumenti Personalizzati
Language: Italian
Started: 03/03/2026
Status: Active
Attachments: No files
Logo Logo
Loading...