Ecco qua. Nella sezione dei segnali ho inserito solo RSI e CCI, il resto lo lascio a te 🙂
// ------------------------------------
// PRT_SMC+DeltaZones+Indicators
// version = 0
// 19.11.2025
// Iván González @ www.prorealcode.com
// Sharing ProRealTime knowledge
// ------------------------------------
DEFPARAM DrawOnLastBarOnly = True
// ------------------------------------
// INPUTS (Configuración por defecto)
// ------------------------------------
StdDevLevel = 3.5 // Multiplicador para detectar presión fuerte (Delta)
StdDevLookback = 20 // Periodo de cálculo para la desviación del Delta
ShowDelta = 1 // 1 = Mostrar Cajas Delta, 0 = Ocultar
DeltaLookback = 250 //
RsiLength = 20 // Longitud del RSI
CciLength = 14 // Longitud del CCI
StochK = 14 // Periodo %K del Estocástico
StochD = 3 // Periodo %D (suavizado) del Estocástico
SwingLength = 5 // Velas a izq/der para confirmar Swing (SMC)
SignalLookback = 250 //
MaxOBs = 10 // Número máximo de Order Blocks a dibujar
// ------------------------------------
// CÁLCULO DE DELTA (Presión de Mechas)
// ------------------------------------
UpTop = High - Close
UpBot = Open - Low
DnTop = High - Open
DnBot = Close - Low
// Cálculo de Delta
IF Close > Open THEN
UpDelta = UpBot - UpTop
PosDelta = MAX(0, UpDelta)
NegDelta = 0
ELSE
DownDelta = DnTop - DnBot
NegDelta = MIN(0, -DownDelta) // Negativo para cálculo lógico
PosDelta = 0
ENDIF
// Desviación Estándar de los Deltas
WickDevUp = STD[StdDevLookback](PosDelta) * StdDevLevel
WickDevDn = STD[StdDevLookback](ABS(NegDelta)) * -StdDevLevel
// Identificar Outliers (Presión fuerte)
HuntingUp = PosDelta >= WickDevUp AND PosDelta > 0
HuntingDn = NegDelta <= WickDevDn AND NegDelta < 0
// Dibujado de Delta (Se redibuja en cada barra histórica visible)
IF ShowDelta and islastbarupdate THEN
// Iteramos hacia atrás para dibujar el histórico de Deltas relevante
FOR i = 0 TO DeltaLookback DO
idx = BarIndex - i
// Recuperamos valores históricos
HistHuntingUp = HuntingUp[i]
HistHuntingDn = HuntingDn[i]
IF HistHuntingUp THEN
// Caja Verde (Buy Pressure)
DRAWRECTANGLE(idx, MIN(Open[i], Close[i]), barindex, Low[i]) COLOURED(0, 255, 0, 50) BORDERCOLOR(0, 255, 0, 255)
DRAWTEXT("▲", idx, Low[i]) ANCHOR(TOP, INDEX, VALUE) COLOURED(0, 255, 0, 255)
ENDIF
IF HistHuntingDn THEN
// Caja Roja (Sell Pressure)
DRAWRECTANGLE(idx, High[i], barindex, MAX(Open[i], Close[i])) COLOURED(255, 0, 0, 50) BORDERCOLOR(255, 0, 0, 255)
DRAWTEXT("▼", idx, High[i]) ANCHOR(BOTTOM, INDEX, VALUE) COLOURED(255, 0, 0, 255)
ENDIF
NEXT
ENDIF
// ------------------------------------
// SEÑALES DE INDICADORES (RSI, CCI, ESTOCÁSTICO)
// ------------------------------------
MyRSI = RSI[RsiLength](Close)
MyCCI = CCI[CciLength](TypicalPrice)
MyStochK = Stochastic[StochK, 1](Close)
MyStochSlowK = Average[StochD](MyStochK)
// Niveles fijos
RsiOversold = 30
RsiOverbought = 70
CciOversold = -100
CciOverbought = 100
StochOversold = 20
StochOverbought = 80
// Condiciones de Cruce
RsiBuy = MyRSI CROSSES OVER RsiOversold
RsiSell = MyRSI CROSSES UNDER RsiOverbought
CciBuy = MyCCI CROSSES OVER CciOversold
CciSell = MyCCI CROSSES UNDER CciOverbought
StochBuy = MyStochSlowK CROSSES OVER StochOversold
StochSell = MyStochSlowK CROSSES UNDER StochOverbought
// Lógica combinada (RSI + CCI)
SignalBuy = RsiBuy AND CciBuy
SignalSell = RsiSell AND CciSell
if islastbarupdate then
// Dibujado de Señales (Histórico Reciente)
FOR i = 0 TO SignalLookback DO
idx = BarIndex - i
IF SignalBuy[i] THEN
DRAWTEXT("BUY", idx, Low[i] - AverageTrueRange[14][i]) COLOURED(0, 255, 0)
DRAWVLINE(idx) STYLE(DOTTEDLINE, 1) COLOURED(0, 255, 0, 100)
ENDIF
IF SignalSell[i] THEN
DRAWTEXT("SELL", idx, High[i] + AverageTrueRange[14][i]) COLOURED(255, 0, 0)
DRAWVLINE(idx) STYLE(DOTTEDLINE, 1) COLOURED(255, 0, 0, 100)
ENDIF
NEXT
endif
// ------------------------------------
// SMC (ORDER BLOCKS & BREAKERS)
// ------------------------------------
// Detección de Pivotes (Swing High / Swing Low)
IsSwingHigh = High[SwingLength] >= Highest[SwingLength*2+1](High)
IsSwingLow = Low[SwingLength] <= Lowest[SwingLength*2+1](Low)
// Lógica de Creación de OB
IF IsSwingLow THEN
FOR j = SwingLength TO SwingLength + 5 DO
IF Close[j] < Open[j] THEN
LastIdx = LastSet($obIndex) + 1
$obIndex[LastIdx] = BarIndex - j
$obTop[LastIdx] = High[j]
$obBot[LastIdx] = Low[j]
$obType[LastIdx] = 1 // Bullish
$obStatus[LastIdx] = 0 // Active
BREAK
ENDIF
NEXT
ENDIF
IF IsSwingHigh THEN
FOR j = SwingLength TO SwingLength + 5 DO
IF Close[j] > Open[j] THEN
LastIdx = LastSet($obIndex) + 1
$obIndex[LastIdx] = BarIndex - j
$obTop[LastIdx] = High[j]
$obBot[LastIdx] = Low[j]
$obType[LastIdx] = -1 // Bearish
$obStatus[LastIdx] = 0 // Active
BREAK
ENDIF
NEXT
ENDIF
// Lógica de Dibujado y Actualización de Estado (Breaker)
LastArrIdx = LastSet($obIndex)
StartIdx = MAX(1, LastArrIdx - MaxOBs)
if islastbarupdate then
FOR k = StartIdx TO LastArrIdx DO
ThisIndex = $obIndex[k]
ThisTop = $obTop[k]
ThisBot = $obBot[k]
ThisType = $obType[k]
ThisStatus = $obStatus[k]
IsBreaker = 0
IF ThisStatus <> 2 THEN
// Lógica Bullish OB
IF ThisType = 1 THEN
IF Close < ThisBot THEN
$obStatus[k] = 1
IsBreaker = 1
ENDIF
IF IsBreaker OR ThisStatus = 1 THEN
// Breaker Bajista (Rojo Oscuro)
DRAWRECTANGLE(ThisIndex, ThisTop, BarIndex + 5, ThisBot) COLOURED(139, 0, 0, 50) BORDERCOLOR(139, 0, 0, 255)
ELSE
// OB Alcista Activo (Azul Claro)
DRAWRECTANGLE(ThisIndex, ThisTop, BarIndex + 5, ThisBot) COLOURED(0, 255, 255, 50) BORDERCOLOR(0, 255, 255, 255)
ENDIF
// Lógica Bearish OB
ELSIF ThisType = -1 THEN
IF Close > ThisTop THEN
$obStatus[k] = 1
IsBreaker = 1
ENDIF
IF IsBreaker OR ThisStatus = 1 THEN
// Breaker Alcista (Azul Oscuro)
DRAWRECTANGLE(ThisIndex, ThisTop, BarIndex + 5, ThisBot) COLOURED(0, 0, 139, 50) BORDERCOLOR(0, 0, 139, 255)
ELSE
// OB Bajista Activo (Rojo)
DRAWRECTANGLE(ThisIndex, ThisTop, BarIndex + 5, ThisBot) COLOURED(255, 0, 0, 50) BORDERCOLOR(255, 0, 0, 255)
ENDIF
ENDIF
ENDIF
NEXT
endif
// ------------------------------------
RETURN