Este es el screener donde se fusionaron los dos screener separados.
No comprobé si los nombres de las variables eran idénticos en ambos screener ; de ser así, se asumirá el del segundo screener tro, ya que lo añadí al final del primero. Si hay nombres idénticos, cámbielos, aunque solo sea añadiendo una X al principio o al final.
Este screener devuelve los siguientes valores:
10 = anteriormente 1 (screener 1)
20 = anteriormente 2 (screener 1)
91 = anteriormente -1 (screener 1)
92 = anteriormente -2 (screener 1)
30 = anteriormente 1 (segundo screener )
40 = anteriormente 2 (segundo screener )
50 = anteriormente 3 (segundo screener )
60 = anteriormente 4 (segundo screener )
Añadí la condición:
AND (close > 500)
a la última línea para evitar que encuentre demasiados datos. Puedes eliminar o modificar 500 como quieras:
// Screener combinado: zonas de alerta
// Dispara cuando Supply-Demand-CVD-Flow o Wick Pressure Zones
// forman una zona nueva en el momento actual
//
// returns:
//
// 10 = formerly 1 (screener 1)
// 20 = formerly 2 (screener 1)
// 91 = formerly -1 (screener 1)
// 92 = formerly -2 (screener 1)
//
// 30 = formerly 1 (2nd screener)
// 40 = formerly 2 (2nd screener)
// 50 = formerly 3 (2nd screener)
// 60 = formerly 4 (2nd screener)
//
//---------------------------------------------------------
// screener 1
//
//---------------------------------------------------------
// === 1. Supply-Demand-CVD-Flow (ChartPrime) ===
atrLen = 14
momMult = 1.0
myATR = averagetruerange[atrLen](close)
brkBody = abs(close[1] - open[1])
isDemand = 0
isSupply = 0
if barindex > 2 then
if (close[2] < open[2]) and (close[1] > open[1]) and brkBody >= momMult * myATR[1] then
isDemand = 1
endif
if (close[2] > open[2]) and (close[1] < open[1]) and brkBody >= momMult * myATR[1] then
isSupply = 1
endif
endif
// === 2. Wick Pressure Zones (BigBeluga) ===
lookback = 200
threshold = 80
extendBars = 20
rsiLen = 14
bodyTop = max(open, close)
bodyBot = min(open, close)
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)
once startidx = -100000
newUpper = 0
newLower = 0
if sizeUpWick >= threshold and sizeLoWick < threshold and myrsi > 50 and (barindex - startidx > extendBars) then
newUpper = 1
startidx = barindex
endif
if sizeLoWick >= threshold and sizeUpWick < threshold and myrsi < 50 and (barindex - startidx > extendBars) then
newLower = 1
startidx = barindex
endif
// === 3. Condicion combinada ===
zoneFormed = isDemand or isSupply or newUpper or newLower
// === 4. Tipo de zona detectada ===
sType = 0
if isDemand then
sType = 10
endif
if isSupply then
sType = 91
endif
if newLower then
sType = 20
endif
if newUpper then
sType = 92
endif
//---------------------------------------------------------
// screener 2
//
//———————————————————-//
//PRC_Combined Screener: Double Top/Bottom + Elliott Wave Impulse
//version = 0
//25.03.2026
//Iván González @ http://www.prorealcode.com
//Sharing ProRealTime knowledge
//———————————————————-//
// ============================================
// PART 1: DOUBLE TOP / DOUBLE BOTTOM
// ============================================
dtPrd = 5
dtTol = 15
ph = high = highest[dtPrd](high)
pl = low = lowest[dtPrd](low)
IF ph AND pl = 0 THEN
zzDir = 1
ELSIF pl AND ph = 0 THEN
zzDir = -1
ELSE
zzDir = zzDir
ENDIF
zzDirChanged = zzDir <> zzDir[1]
Box = 0
IF ph OR pl THEN
IF zzDirChanged THEN
IF zzDir = 1 THEN
$zigzag[zzT+1] = highest[dtPrd](high)
zzT = zzT + 1
ELSIF zzDir = -1 THEN
$zigzag[zzT+1] = lowest[dtPrd](low)
zzT = zzT + 1
ENDIF
ELSE
IF zzDir = 1 AND highest[dtPrd](high) > $zigzag[zzT] THEN
$zigzag[zzT] = highest[dtPrd](high)
ELSIF zzDir = -1 AND lowest[dtPrd](low) < $zigzag[zzT] THEN
$zigzag[zzT] = lowest[dtPrd](low)
ENDIF
ENDIF
ENDIF
IF zzT > 4 THEN
//—-Double Top pattern—-//
htop = ($zigzag[zzT-3] + $zigzag[zzT-1]) / 2 - $zigzag[zzT-2]
TopHigh = $zigzag[zzT-3] + htop * dtTol / 100
BotHigh = $zigzag[zzT-3] - htop * dtTol / 100
DoubleTop = ($zigzag[zzT-1] >= BotHigh AND $zigzag[zzT-1] <= TopHigh) AND ($zigzag[zzT-3] > dtY1 AND $zigzag[zzT-3] > $zigzag[zzT-2] AND $zigzag[zzT-1] > $zigzag[zzT-2])
IF DoubleTop AND NOT DoubleTop[1] THEN
dtY1 = $zigzag[zzT-4]
Box = 2
ENDIF
//—-Double Bottom pattern—-//
hbot = $zigzag[zzT-2] - ($zigzag[zzT-3] + $zigzag[zzT-1]) / 2
topLow = $zigzag[zzT-3] + hbot * dtTol / 100
botLow = $zigzag[zzT-3] - hbot * dtTol / 100
DoubleBot = ($zigzag[zzT-1] >= botLow AND $zigzag[zzT-1] <= topLow) AND ($zigzag[zzT-3] < $zigzag[zzT-4] AND $zigzag[zzT-3] < $zigzag[zzT-2] AND $zigzag[zzT-1] < $zigzag[zzT-2])
IF DoubleBot AND NOT DoubleBot[1] THEN
Box = 1
ENDIF
ENDIF
// ============================================
// PART 2: ELLIOTT WAVE IMPULSE
// ============================================
ewLength = 15
ewError = 5
ewErrMin = (100 - ewError) / 100
ewErrMax = (100 + ewError) / 100
waveFound = 0
ewWdir = 0
IF barindex >= ewLength THEN
hb = highestbars[ewLength](high)
lb = lowestbars[ewLength](low)
IF hb = 0 AND lb <> 0 THEN
ewPHigh = high
ewPLow = undefined
ewDir = 1
ELSIF lb = 0 AND hb <> 0 THEN
ewPHigh = undefined
ewPLow = low
ewDir = -1
ELSIF hb = 0 AND lb = 0 THEN
ewPHigh = high
ewPLow = low
ewDir = ewPrevDir
ELSE
ewPHigh = undefined
ewPLow = undefined
ewDir = ewPrevDir
ENDIF
ewHasPivot = 0
IF ewPHigh <> undefined OR ewPLow <> undefined THEN
ewHasPivot = 1
ENDIF
IF ewHasPivot THEN
IF ewDir = 1 THEN
ewNewVal = high
ELSE
ewNewVal = low
ENDIF
ewNewPDir = ewDir
ewDirChanged = 0
IF ewDir <> ewPrevDir AND ewPrevDir <> 0 THEN
ewDirChanged = 1
ENDIF
// Same direction: replace pvt0 if more extreme
IF ewDirChanged = 0 AND ewPCount >= 1 THEN
IF ewDir = 1 THEN
IF ewNewVal < ewPvt0 THEN
ewNewVal = ewPvt0
ENDIF
ELSE
IF ewNewVal > ewPvt0 THEN
ewNewVal = ewPvt0
ENDIF
ENDIF
IF ewPCount >= 3 THEN
IF ewDir = 1 AND ewNewVal > ewPvt2 THEN
ewNewPDir = 2
ELSIF ewDir = -1 AND ewNewVal < ewPvt2 THEN
ewNewPDir = -2
ENDIF
ENDIF
ewPvt0 = ewNewVal
ewPd0 = ewNewPDir
ELSE
// Direction change: FIFO shift + insert
IF ewPCount >= 2 THEN
IF ewDir = 1 AND ewNewVal > ewPvt1 THEN
ewNewPDir = 2
ELSIF ewDir = -1 AND ewNewVal < ewPvt1 THEN
ewNewPDir = -2
ENDIF
ENDIF
ewPvt3 = ewPvt2
ewPvt2 = ewPvt1
ewPd2 = ewPd1
ewPvt1 = ewPvt0
ewPd1 = ewPd0
ewPvt0 = ewNewVal
ewPd0 = ewNewPDir
IF ewPCount < 6 THEN
ewPCount = ewPCount + 1
ENDIF
ENDIF
ewPrevDir = ewDir
ENDIF
// Wave detection
IF ewPCount >= 4 THEN
ewP2 = ewPvt1
ewP2dir = ewPd1
ewP1 = ewPvt2
ewP1dir = ewPd2
ewP0 = ewPvt3
ewW1Len = abs(ewP1 - ewP0)
ewW2Len = abs(ewP2 - ewP1)
IF ewW1Len > 0 THEN
ewIR2 = ewW2Len / ewW1Len
ELSE
ewIR2 = 0
ENDIF
ewIgnore = 0
IF ewOldP0 = ewP0 AND ewOldP1 = ewP1 AND ewOldP2 = ewP2 THEN
ewIgnore = 1
ENDIF
ewPatternOK = 0
IF ewIR2 > 0.50 * ewErrMin AND ewIR2 < 0.50 * ewErrMax THEN
ewPatternOK = 1
ENDIF
IF ewIR2 > 0.618 * ewErrMin AND ewIR2 < 0.618 * ewErrMax THEN
ewPatternOK = 1
ENDIF
IF ewIR2 > 0.764 * ewErrMin AND ewIR2 < 0.764 * ewErrMax THEN
ewPatternOK = 1
ENDIF
IF ewIR2 > 0.854 * ewErrMin AND ewIR2 < 0.854 * ewErrMax THEN
ewPatternOK = 1
ENDIF
ewDirOK = 0
IF (ewP1dir = 2 AND ewP2dir = -1) OR (ewP1dir = -2 AND ewP2dir = 1) THEN
ewDirOK = 1
ENDIF
IF ewIgnore = 0 AND ewPatternOK = 1 AND ewDirOK = 1 THEN
IF ewP0 > ewP1 THEN
ewWdir = -1
ELSE
ewWdir = 1
ENDIF
waveFound = 1
ewOldP0 = ewP0
ewOldP1 = ewP1
ewOldP2 = ewP2
ENDIF
ENDIF
ENDIF
// ============================================
// COMBINED OUTPUT
// ============================================
// Signal: 1=Double Bottom, 2=Double Top, 3=Elliott Bull, 4=Elliott Bear
IF Box = 1 THEN
sType = 30
ELSIF Box = 2 THEN
sType = 40
ELSIF waveFound = 1 AND ewWdir = 1 THEN
sType = 50
ELSIF waveFound = 1 AND ewWdir = -1 THEN
sType = 60
ENDIF
//---------------------------------------------------------
CombinedSignal = zoneFormed OR Box OR waveFound OR ewWdir
SCREENER[CombinedSignal AND (close > 500)] (sType as "10/20/91/92=Zone Type,30=DBot,40=DTop,50=EWBull,60=EWBear")