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