ProRealCode - Trading & Coding with ProRealTime™
Hola, tengo dos screeners combinados ambos dobles, se podrían agrupar para no tener que estar ejecutando uno y luego el otro y así tenerlos en uno solo:
Este es uno:
// Screener combinado: zonas de alerta
// Dispara cuando Supply-Demand-CVD-Flow o Wick Pressure Zones
// forman una zona nueva en el momento actual
// === 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 = 1
endif
if isSupply then
sType = -1
endif
if newLower then
sType = 2
endif
if newUpper then
sType = -2
endif
SCREENER[zoneFormed] (sType as "Zone Type")
Y el otro:
//———————————————————-//
//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
signal = 1
ELSIF Box = 2 THEN
signal = 2
ELSIF waveFound = 1 AND ewWdir = 1 THEN
signal = 3
ELSIF waveFound = 1 AND ewWdir = -1 THEN
signal = 4
ELSE
signal = 0
ENDIF
SCREENER[signal > 0](signal AS"1=DBot 2=DTop 3=EWBull 4=EWBear")
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")
Screener combinado Supply-Demand y Wick Pressure en PRT
This topic contains 2 replies,
has 2 voices, and was last updated by
robertogozzi
5 days, 15 hours ago.
| Forum: | ProScreener: Buscadores de Mercado y Rastreo |
| Language: | Spanish |
| Started: | 04/10/2026 |
| Status: | Active |
| Attachments: | 1 files |
The information collected on this form is stored in a computer file by ProRealCode to create and access your ProRealCode profile. This data is kept in a secure database for the duration of the member's membership. They will be kept as long as you use our services and will be automatically deleted after 3 years of inactivity. Your personal data is used to create your private profile on ProRealCode. This data is maintained by SAS ProRealCode, 407 rue Freycinet, 59151 Arleux, France. If you subscribe to our newsletters, your email address is provided to our service provider "MailChimp" located in the United States, with whom we have signed a confidentiality agreement. This company is also compliant with the EU/Swiss Privacy Shield, and the GDPR. For any request for correction or deletion concerning your data, you can directly contact the ProRealCode team by email at privacy@prorealcode.com If you would like to lodge a complaint regarding the use of your personal data, you can contact your data protection supervisory authority.