Indicatore Smart money concept breakout channels

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

    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álezIván González
    Moderator
    Legend

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

    Msport71 thanked this post
    #258650 quote
    Msport71Msport71
    Participant
    Senior

    Gentilissimo Grazie!

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

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 Msport71Msport71
6 months, 2 weeks ago.

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