Buenos días, me gustaría obtener el screener conjunto de estos dos indicadores en gráficos de 1 hora, lo que quiero es que me avise cuando cualquiera de los dos indicadores formen en ese momento la zona de alerta y NO cuando el precio vuelva a tocar la zona:
//--------------------------------------------
// PRC_Supply-Demand-CVD-Flow (by ChartPrime)
// version = 0
// 07.04.2026
// Ivan Gonzalez @ www.prorealcode.com
// Sharing ProRealTime knowledge
//--------------------------------------------
defparam drawonlastbaronly = true
//--------------------------------------------
// === PARAMETERS ===
atrLen = 14 // ATR length
momMult = 1.0 // Breakout body >= ATR * mult
maxZones = 10 // Max active zones per type
showSignals = 1 // Signal triangles (1=yes, 0=no)
//--------------------------------------------
// === ATR ===
myATR = averagetruerange[atrLen](close)
//--------------------------------------------
// === ZONE DETECTION ===
// Base candle = bar[2], breakout candle = bar[1]
IF barindex > 2 THEN
brkBody = abs(close[1] - open[1])
isDemand = (close[2] < open[2]) AND (close[1] > open[1]) AND brkBody >= momMult * myATR[1]
isSupply = (close[2] > open[2]) AND (close[1] < open[1]) AND brkBody >= momMult * myATR[1]
ELSE
isDemand = 0
isSupply = 0
ENDIF
//--------------------------------------------
// === COUNTERS ===
once dCount = 0
once sCount = 0
once sigCount = 0
//--------------------------------------------
// === CREATE DEMAND ZONE ===
IF isDemand THEN
zTop = high[2]
zBot = low[2]
zLeft = barindex - 2
overlap = 0
FOR i = 0 TO dCount - 1 DO
IF $dValid[i] = 1 THEN
IF zBot <= $dTop[i] AND zTop >= $dBot[i] THEN
overlap = 1
BREAK
ENDIF
ENDIF
NEXT
IF overlap = 0 THEN
$dTop[dCount] = zTop
$dBot[dCount] = zBot
$dLeft[dCount] = zLeft
$dValid[dCount] = 1
dCount = dCount + 1
// Trim oldest if exceeds max
activeD = 0
FOR i = 0 TO dCount - 1 DO
IF $dValid[i] = 1 THEN
activeD = activeD + 1
ENDIF
NEXT
IF activeD > maxZones THEN
FOR i = 0 TO dCount - 1 DO
IF $dValid[i] = 1 THEN
$dValid[i] = 0
BREAK
ENDIF
NEXT
ENDIF
// Store signal
IF showSignals = 1 THEN
$sigBar[sigCount] = barindex
$sigPrice[sigCount] = low - myATR * 0.3
$sigType[sigCount] = 1
sigCount = sigCount + 1
ENDIF
ENDIF
ENDIF
//--------------------------------------------
// === CREATE SUPPLY ZONE ===
IF isSupply THEN
zTop = high[2]
zBot = low[2]
zLeft = barindex - 2
overlap = 0
FOR i = 0 TO sCount - 1 DO
IF $sValid[i] = 1 THEN
IF zBot <= $sTop[i] AND zTop >= $sBot[i] THEN
overlap = 1
BREAK
ENDIF
ENDIF
NEXT
IF overlap = 0 THEN
$sTop[sCount] = zTop
$sBot[sCount] = zBot
$sLeft[sCount] = zLeft
$sValid[sCount] = 1
sCount = sCount + 1
activeS = 0
FOR i = 0 TO sCount - 1 DO
IF $sValid[i] = 1 THEN
activeS = activeS + 1
ENDIF
NEXT
IF activeS > maxZones THEN
FOR i = 0 TO sCount - 1 DO
IF $sValid[i] = 1 THEN
$sValid[i] = 0
BREAK
ENDIF
NEXT
ENDIF
IF showSignals = 1 THEN
$sigBar[sigCount] = barindex
$sigPrice[sigCount] = high + myATR * 0.3
$sigType[sigCount] = -1
sigCount = sigCount + 1
ENDIF
ENDIF
ENDIF
//--------------------------------------------
// === MITIGATION ===
FOR i = 0 TO dCount - 1 DO
IF $dValid[i] = 1 AND close <= $dBot[i] THEN
$dValid[i] = 0
ENDIF
NEXT
FOR i = 0 TO sCount - 1 DO
IF $sValid[i] = 1 AND close >= $sTop[i] THEN
$sValid[i] = 0
ENDIF
NEXT
//--------------------------------------------
// === DRAWING ===
IF islastbarupdate THEN
// Demand zones + CVD
FOR i = 0 TO dCount - 1 DO
IF $dValid[i] = 1 THEN
zLen = barindex - $dLeft[i]
cumDelta = 0
FOR k = zLen DOWNTO 0 DO
IF close[k] > open[k] THEN
cumDelta = cumDelta + volume[k]
ELSIF close[k] < open[k] THEN
cumDelta = cumDelta - volume[k]
ENDIF
NEXT
drawrectangle($dLeft[i], $dBot[i], barindex, $dTop[i]) coloured(34,197,94) fillcolor(34,197,143,38)
drawtext("Demand | CVD: #cumDelta#", $dLeft[i]+2, $dBot[i]) coloured(34,197,94)
ENDIF
NEXT
// Supply zones + CVD
FOR i = 0 TO sCount - 1 DO
IF $sValid[i] = 1 THEN
zLen = barindex - $sLeft[i]
cumDelta = 0
FOR k = zLen DOWNTO 0 DO
IF close[k] > open[k] THEN
cumDelta = cumDelta + volume[k]
ELSIF close[k] < open[k] THEN
cumDelta = cumDelta - volume[k]
ENDIF
NEXT
drawrectangle($sLeft[i], $sBot[i], barindex, $sTop[i]) coloured(239,68,68) fillcolor(239,68,68,38)
drawtext("Supply | CVD: #cumDelta#", $sLeft[i]+2, $sTop[i]) coloured(239,68,68)
ENDIF
NEXT
// Signal triangles
IF showSignals = 1 THEN
FOR i = 0 TO sigCount - 1 DO
IF $sigType[i] = 1 THEN
drawtext("△", $sigBar[i], $sigPrice[i]) coloured(34,197,94)
ELSIF $sigType[i] = -1 THEN
drawtext("▽", $sigBar[i], $sigPrice[i]) coloured(239,68,68)
ENDIF
NEXT
ENDIF
ENDIF
RETURN
y el Wick pressure zones:
//---------------------------------------------------
//PRC_Wick Pressure Zones by BigBeluga
//version = 0
//09.09.2025
//Iván González @ www.prorealcode.com
//Sharing ProRealTime knowledge
//---------------------------------------------------
DEFPARAM DrawOnLastBarOnly = true
//---------------------------------------------------
// inputs
//---------------------------------------------------
lookback = 200
threshold = 80
extendBars = 20
maxLevels = 10
rsiLen = 14
upR = 255
upG = 0
upB = 0
dnR = 0
dnG = 255
dnB = 0
//---------------------------------------------------
// Variables auxiliares
//---------------------------------------------------
bodyTop = MAX(open, close)
bodyBot = MIN(open, close)
// Mechas relativas (evitar división por 0)
denUp = MAX(bodyTop, 0.0000001)
denLo = MAX(low, 0.0000001)
upperWick = (high - bodyTop) / denUp
lowerWick = (bodyBot - low) / denLo
maxUpper = HIGHEST[lookback](upperWick)
maxLower = HIGHEST[lookback](lowerWick)
sizeUpWick = 0
sizeLoWick = 0
IF maxUpper > 0 THEN
sizeUpWick = FLOOR( (upperWick / maxUpper) * 100 )
ENDIF
IF maxLower > 0 THEN
sizeLoWick = FLOOR( (lowerWick / maxLower) * 100 )
ENDIF
//---------------------------------------------------
myrsi = RSI[rsiLen](close)
vol = volume
//---------------------------------------------------
// Separación mínima entre zonas
ONCE startidx = -100000
//---------------------------------------------------
// Boxes
//---------------------------------------------------
ONCE n = 0
newUpper = sizeUpWick >= threshold AND NOT (sizeLoWick >= threshold) AND myrsi > 50 AND (BarIndex - startidx > extendBars)
newLower = sizeLoWick >= threshold AND NOT (sizeUpWick >= threshold) AND myrsi < 50 AND (BarIndex - startidx > extendBars)
// Crear zona superior
IF newUpper THEN
startidx = BarIndex
n = n + 1
$side[n] = 1
$left[n] = BarIndex - 1
$top[n] = high
$bot[n] = bodyTop
$right[n] = barindex + 1
$broken[n] = 0
$volume[n] = volume
// Límite de zonas: mantener sólo las más recientes
IF n > maxLevels THEN
// Shift a la izquierda
FOR k = 1 TO n - 1 DO
$side[k] = $side[k+1]
$left[k] = $left[k+1]
$top[k] = $top[k+1]
$bot[k] = $bot[k+1]
$right[k] = $right[k+1]
$broken[k] = $broken[k+1]
$volume[k] = $volume[k+1]
NEXT
n = maxLevels
ENDIF
ENDIF
// Crear zona inferior
IF newLower THEN
startidx = BarIndex
n = n + 1
$side[n] = -1
$left[n] = BarIndex - 1
$top[n] = bodyBot
$bot[n] = low
$right[n] = barindex + 1
$broken[n] = 0
$volume[n] = volume
IF n > maxLevels THEN
FOR k = 1 TO n - 1 DO
$side[k] = $side[k+1]
$left[k] = $left[k+1]
$top[k] = $top[k+1]
$bot[k] = $bot[k+1]
$right[k] = $right[k+1]
$broken[k] = $broken[k+1]
$volume[k] = $volume[k+1]
NEXT
n = maxLevels
ENDIF
ENDIF
//---------------------------------------------------
// DIBUJO y GESTIÓN
//---------------------------------------------------
IF islastbarupdate THEN
FOR i = 1 TO n DO
for j=barindex-$right[i] downto 0 do
IF $side[i] = 1 AND low[j] > $top[i] THEN
$broken[i] = 1
$right[i] = barindex[j]
break
ELSIF $side[i] = -1 AND high[j] < $bot[i] THEN
$broken[i] = 1
$right[i] = barindex[j]
break
ENDIF
next
vol=$volume[i]
if $broken[i]=1 and $side[i]=1 then
drawrectangle($left[i],$bot[i],$left[i]+2,$top[i])coloured("red")
drawsegment($left[i],$top[i],$right[i],$top[i])coloured("grey",125)style(line,3)
ELSIF $broken[i]=0 AND $side[i]=1 THEN
leftX = $left[i]
rightX = barindex
topY = $top[i]
botY = $bot[i]
height = ABS(topY - botY)
IF height > 0 THEN
steps = 10
stepH = height / steps
DRAWRECTANGLE(leftX, topY, leftX + 2, botY) COLOURED(upR,upG,upB)
FOR s = 0 TO steps - 1 DO
segBot = botY + stepH * s
segTop = segBot + stepH
alphaVal = 30 + s * 12
IF s = steps - 1 THEN
alphaVal = 160
ENDIF
DRAWRECTANGLE(leftX, segTop, rightX, segBot) COLOURED(upR,upG,upB, 0)fillcolor(upR,upG,upB, alphaVal)
NEXT
midY = botY + height * 0.5
DRAWTEXT("#vol#", rightX, midY)
ENDIF
elsif $broken[i]=1 and $side[i]=-1 then
drawrectangle($left[i],$bot[i],$left[i]+2,$top[i])coloured("green")
drawsegment($left[i],$bot[i],$right[i],$bot[i])coloured("grey",125)style(line,3)
ELSIF $broken[i]=0 AND $side[i]=-1 THEN
leftX = $left[i]
rightX = barindex
topY = $top[i]
botY = $bot[i]
height = ABS(topY - botY)
IF height > 0 THEN
steps = 10
stepH = height / steps
DRAWRECTANGLE(leftX, topY, leftX + 2, botY) COLOURED(dnR,dnG,dnB)
FOR s = 0 TO steps - 1 DO
segBot = botY + stepH * s
segTop = segBot + stepH
alphaVal = 160 - s * 12
IF s = 0 THEN
alphaVal = 160
ENDIF
DRAWRECTANGLE(leftX, segTop, rightX, segBot) COLOURED(dnR,dnG,dnB, 0)fillcolor(dnR,dnG,dnB, alphaVal)
NEXT
midY = botY + height * 0.5
DRAWTEXT("#vol#", rightX, midY)
ENDIF
endif
NEXT
ENDIF
RETURN