ecco
//---------------------------------------------------
//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
alpha=30
//---------------------------------------------------
// 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