ProRealCode - Trading & Coding with ProRealTime™
Hola, me gustaría un screener del indicador Detención de eventos Wyckoff, que Iván subió esta semana, en concreto me gustaría que me alertase cuando aparece la etiqueta “SPRING” o “UT-D”, gracias.
Este es el indicador donde agregué las dos señales que deseas (puedes verlas colocando el indicador en un nuevo panel DEBAJO del gráfico de precios):
//----------------------------------------------
//PRC_Wyckoff Event Detection
//version = 0
//08.06.26
//Iván González @ www.prorealcode.com
//Autor original: AlphaExtract
//Sharing ProRealTime knowledge
//----------------------------------------------
// === Parametros ===
//----------------------------------------------
//volLen = 20 // periodo media de volumen
//priceLookback = 20 // ventana de maximos/minimos y ATR
//volThreshMult = 2.0 // multiplicador de volumen (mayor = menos eventos)
//priceThreshMult = 0.3 // umbral de movimiento de precio
//trendStrength = 3 // barras de racha para confirmar tendencia
//minBars = 5 // separacion minima (barras) por tipo de evento
//volumeFilter = 1.5 // filtro de volumen para eventos secundarios
//phaseMult = 2.0 // veces que un bando supera al otro para fijar fase
//phaseWindow = 20 // ventana de reseteo de contadores de fase
//showRange = 1 // 1 = dibuja rango de trading
//rangeStyle = 2 // 0 = dinamico, 1 = fijo, 2 = por pivotes
//showMarks = 1 // 1 = dibuja punto + linea hacia atras en cada evento
//lineLength = 15 // longitud (barras) de la linea hacia atras de la muesca
//fixedRangeBars = 50 // lookback del rango fijo
//pivotStrength = 3 // barras a cada lado para validar pivote
//pivotLookback = 100 // barras a escanear buscando pivotes
//rangeExtend = 50 // barras de extension del rango hacia la derecha
//----------------------------------------------
// === Indicadores base ===
//----------------------------------------------
volMA = average[volLen](volume)
hh = highest[priceLookback](high)
ll = lowest[priceLookback](low)
avgTR = averagetruerange[priceLookback]
rng = high - low
labelOffset = avgTR * 0.5
//----------------------------------------------
// === Rachas direccionales ===
//----------------------------------------------
fallN = 1
for k = 1 to trendStrength do
if close[k-1] >= close[k] then
fallN = 0
endif
next
riseN = 1
for k = 1 to trendStrength do
if close[k-1] <= close[k] then
riseN = 0
endif
next
riseN1 = 1
for k = 1 to trendStrength + 1 do
if close[k-1] <= close[k] then
riseN1 = 0
endif
next
riseN2 = 1
for k = 1 to trendStrength + 2 do
if close[k-1] <= close[k] then
riseN2 = 0
endif
next
//----------------------------------------------
// === Contadores de fase ===
//----------------------------------------------
once bearishCount = 0
once bullishCount = 0
if bearishCount > bullishCount * phaseMult then
currentPhase = 1 // DISTRIBUCION
elsif bullishCount > bearishCount * phaseMult then
currentPhase = 2 // ACUMULACION
else
currentPhase = 0 // NEUTRAL
endif
//----------------------------------------------
// === Condiciones de DISTRIBUCION (bajistas) ===
//----------------------------------------------
psyCond = 0
if high > hh[1] and volume > volMA * volThreshMult and close < high - rng * priceThreshMult and fallN = 1 then
psyCond = 1
endif
utdCond = 0
if currentPhase = 1 and high > hh[1] and close < open and volume > volMA * volumeFilter and high - close > avgTR * priceThreshMult then
utdCond = 1
endif
lpsyCond = 0
if high > high[1] and close < open and volume < volMA * volumeFilter and fallN = 1 then
lpsyCond = 1
endif
sowCond = 0
if close < open and low < ll[1] and volume > volMA * volThreshMult and fallN = 1 then
sowCond = 1
endif
bcCond = 0
if rng > 0 then
if high > hh[2] and volume > volMA * (volThreshMult * 1.5) and close > open and (close - open) / rng > 0.6 then
bcCond = 1
endif
endif
stdCond = 0
if currentPhase = 1 and high > high[1] and high >= hh[5] * 0.98 and high <= hh[5] * 1.02 and volume < volMA and volume < volume[1] * 0.8 then
stdCond = 1
endif
// BUEC: primer Upthrust en las ultimas 5 barras seguido de rally debil
buecCond = 0
for i = 1 to 5 do
if utdCond[i] = 1 then
if close < open and high < high[i] and close > low + rng * 0.3 and volume < volume[i] then
buecCond = 1
endif
break
endif
next
//----------------------------------------------
// === Condiciones de ACUMULACION (alcistas) ===
//----------------------------------------------
psCond = 0
if low < ll[1] and volume > volMA * volThreshMult and close > low + rng * priceThreshMult and fallN = 1 then
psCond = 1
endif
scCond = 0
if low < ll[1] and volume > volMA * (volThreshMult * 1.2) and close > low + rng * (priceThreshMult * 1.5) then
scCond = 1
endif
araCond = 0
if currentPhase = 2 and close > open and high > hh[trendStrength] and volume < volMA * volumeFilter and riseN = 1 then
araCond = 1
endif
sosCond = 0
if close > open and high > hh[1] and volume > volMA * volThreshMult and riseN = 1 then
sosCond = 1
endif
lpsCond = 0
if low > low[1] and close > open and volume < volMA * volumeFilter and riseN = 1 then
lpsCond = 1
endif
springCond = 0
if low < ll[3] and close > open and close > low + rng * 0.6 and volume > volMA * volumeFilter then
springCond = 1
endif
staCond = 0
if currentPhase = 2 and low < low[1] and low >= ll[5] * 0.98 and low <= ll[5] * 1.02 and volume < volMA and volume < volume[1] * 0.8 then
staCond = 1
endif
jacCond = 0
if close > open and close > hh[3] and volume > volMA * volThreshMult and riseN1 = 1 then
jacCond = 1
endif
tsoCond = 0
if low < ll[2] and close > open and close > low + rng * 0.7 and volume > volMA * (volThreshMult * 1.2) and riseN2 = 1 then
tsoCond = 1
endif
//----------------------------------------------
// === Actualizacion de contadores + reseteo periodico ===
//----------------------------------------------
if psyCond = 1 or utdCond = 1 or lpsyCond = 1 or sowCond = 1 or bcCond = 1 or stdCond = 1 or buecCond = 1 then
bearishCount = bearishCount + 1
endif
if psCond = 1 or scCond = 1 or araCond = 1 or sosCond = 1 or lpsCond = 1 or springCond = 1 or staCond = 1 or jacCond = 1 or tsoCond = 1 then
bullishCount = bullishCount + 1
endif
if barindex mod phaseWindow = 0 then
bearishCount = 0
bullishCount = 0
endif
//----------------------------------------------
// === Dibujo de etiquetas ===
//----------------------------------------------
priceRangeFilter = 0.5
once lastLabelBar = 0 - 1000
once lastLabelPrice = 0
once lastR = 0
once lastG = 0
once lastB = 0
// Distribucion (etiqueta arriba salvo SOW)
if psyCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("PSY", barindex, high + labelOffset) coloured(255, 107, 107)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 255
lastG = 107
lastB = 107
endif
UTDsignal = 0
if utdCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("UT-D", barindex, high + labelOffset) coloured(255, 165, 0)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 255
lastG = 165
lastB = 0
UTDsignal = -1
endif
if lpsyCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("LPSY", barindex, high + labelOffset) coloured(255, 65, 65)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 255
lastG = 65
lastB = 65
endif
if sowCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
drawtext("SOW", barindex, low - labelOffset) coloured(255, 0, 0)
lastLabelBar = barindex
lastLabelPrice = low
lastR = 255
lastG = 0
lastB = 0
endif
if bcCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("BC", barindex, high + labelOffset) coloured(255, 127, 0)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 255
lastG = 127
lastB = 0
endif
if stdCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("ST-D", barindex, high + labelOffset) coloured(255, 160, 122)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 255
lastG = 160
lastB = 122
endif
if buecCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("BUEC", barindex, high + labelOffset) coloured(255, 99, 71)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 255
lastG = 99
lastB = 71
endif
// Acumulacion (etiqueta abajo salvo AR-A / SOS / JAC)
if psCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
drawtext("PS", barindex, low - labelOffset) coloured(76, 175, 80)
lastLabelBar = barindex
lastLabelPrice = low
lastR = 76
lastG = 175
lastB = 80
endif
if scCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
drawtext("SC", barindex, low - labelOffset) coloured(69, 179, 157)
lastLabelBar = barindex
lastLabelPrice = low
lastR = 69
lastG = 179
lastB = 157
endif
if araCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("AR-A", barindex, high + labelOffset) coloured(46, 204, 113)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 46
lastG = 204
lastB = 113
endif
if sosCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("[SOS]", barindex, high + labelOffset) coloured(39, 174, 96)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 39
lastG = 174
lastB = 96
endif
if lpsCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
drawtext("LPS", barindex, low - labelOffset) coloured(34, 153, 84)
lastLabelBar = barindex
lastLabelPrice = low
lastR = 34
lastG = 153
lastB = 84
endif
SpringSignal = 0
if springCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
drawtext("SPRING", barindex, low - labelOffset) coloured(0, 250, 154)
lastLabelBar = barindex
lastLabelPrice = low
lastR = 0
lastG = 250
lastB = 154
SpringSignal = 1
endif
if staCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
drawtext("ST-A", barindex, low - labelOffset) coloured(102, 205, 170)
lastLabelBar = barindex
lastLabelPrice = low
lastR = 102
lastG = 205
lastB = 170
endif
if jacCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("JAC", barindex, high + labelOffset) coloured(50, 205, 50)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 50
lastG = 205
lastB = 50
endif
if tsoCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
drawtext("TSO", barindex, low - labelOffset) coloured(0, 128, 0)
lastLabelBar = barindex
lastLabelPrice = low
lastR = 0
lastG = 128
lastB = 0
endif
// Muesca opcional
if showMarks = 1 and lastLabelBar = barindex then
drawpoint(barindex, lastLabelPrice, 2) coloured(lastR, lastG, lastB)
drawsegment(barindex - lineLength, lastLabelPrice, barindex, lastLabelPrice) coloured(lastR, lastG, lastB)
endif
//----------------------------------------------
// === Rango de trading + base del % del panel (solo ultima barra) ===
//----------------------------------------------
if islastbarupdate then
if rangeStyle = 0 then
topR = hh
botR = ll
x1 = barindex - priceLookback
elsif rangeStyle = 1 then
topR = highest[fixedRangeBars](high)
botR = lowest[fixedRangeBars](low)
x1 = barindex - fixedRangeBars
else
topR = hh
botR = ll
x1 = barindex - priceLookback
foundH = 0
foundL = 0
maxLB = min(pivotLookback, barindex - pivotStrength - 1)
if maxLB > 5 then
for i = 5 to maxLB do
if foundH = 0 then
ph = 1
for j = 1 to pivotStrength do
if high[i] <= high[i+j] or high[i] <= high[i-j] then
ph = 0
endif
next
if ph = 1 then
topR = high[i]
foundH = 1
endif
endif
next
for i = 5 to maxLB do
if foundL = 0 then
pl = 1
for j = 1 to pivotStrength do
if low[i] >= low[i+j] or low[i] >= low[i-j] then
pl = 0
endif
next
if pl = 1 then
botR = low[i]
foundL = 1
endif
endif
next
endif
endif
if showRange = 1 then
drawrectangle(x1, topR, barindex + rangeExtend, botR) coloured(123, 104, 238)
endif
endif
//----------------------------------------------
// === Panel de estado ===
//----------------------------------------------
if islastbarupdate then
panelX = -200 // px a la izquierda del borde derecho
topY = -20 // px hacia abajo del borde superior
if currentPhase = 2 then
drawtext("FASE: ACUMULACION", panelX, topY, SansSerif, bold, 11) coloured(76, 175, 80) anchor(topright, xshift, yshift)
elsif currentPhase = 1 then
drawtext("FASE: DISTRIBUCION", panelX, topY, SansSerif, bold, 11) coloured(255, 107, 107) anchor(topright, xshift, yshift)
else
drawtext("FASE: NEUTRAL", panelX, topY, SansSerif, bold, 11) coloured(150, 150, 150) anchor(topright, xshift, yshift)
endif
denom = bullishCount + bearishCount
if denom < 1 then
denom = 1
endif
sRatio = abs(bullishCount - bearishCount) / denom
if sRatio > 0.7 then
drawtext("FUERZA: FUERTE", panelX, topY - 22, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
elsif sRatio > 0.3 then
drawtext("FUERZA: MODERADA", panelX, topY - 22, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
else
drawtext("FUERZA: DEBIL", panelX, topY - 22, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
endif
if high >= hh[3] and close < open then
drawtext("POS: ZONA UPTHRUST", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
elsif low <= ll[3] and close > open then
drawtext("POS: ZONA SPRING", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
elsif high >= hh[5] then
drawtext("POS: EN RESISTENCIA", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
elsif low <= ll[5] then
drawtext("POS: EN SOPORTE", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
else
drawtext("POS: RANGO", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
endif
if volume > volMA * 1.5 and close > open then
drawtext("S/D: DEMANDA", panelX, topY - 66, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
elsif volume > volMA * 1.5 and close < open then
drawtext("S/D: OFERTA", panelX, topY - 66, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
else
drawtext("S/D: EQUILIBRIO", panelX, topY - 66, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
endif
rangePct = round((topR - botR) / botR * 1000) / 10
drawtext("RANGO: #rangePct#%", panelX, topY - 88, SansSerif, bold, 11) coloured(123, 104, 238) anchor(topright, xshift, yshift)
endif
return SpringSignal AS "Spring",UTDsignal AS "UT-D"
Este es el Screener, que devuelve 1 cuando detecta la señal SPRING y 10 cuando detecta UT-D:
mySpring, myUTD = CALL "PRC_Wyckoff Event Detection"[20, 20, 2, 0.3, 3, 5, 1.5, 2, 20, 1, 2, 1, 15, 50, 3, 100, 50](close)
Cond = 0
IF mySpring THEN
Cond = Cond + 1
ELSIF myUTD THEN
Cond = Cond + 10
ENDIF
SCREENER [Cond](Cond AS "1=SPRING,10=UT-D")
Hola, me da error, tanto en el indicador como el screener
¿Puedes publicar una foto del error o escribir el texto?
Hola, me sale un cuadro de error indicando “define la siguiente variable: fixedRangedBars, lineLength, minBars, phaseMult, phaseWindow, pivotLookback, pivotStrengh, priceLooback, priceThereshMult, rangeExtend, rangeStyle, showMa, showRange, trendStrengh, volLen, volThreshMult, volumeFilter
Puedes eliminar los comentarios resaltados en el cuadro de la foto adjunta eliminando las barras dobles iniciales, o puedes importar el archivo ITF que adjunto.
Hola, ahora el error me lo da en el screener: La función “PRC_Wyckoff llamada desde “Mis Screener (1) devuelve 0 valores pero su código necesita 2
Olvidé que tenía que cambiar el indicador.
Adjunto el archivo actualizado.
¡Disculpen el descuido!
Hola, ahora me sale un mensaje en el Screener que dice “error interno de servidor”
Publicaré tanto el indicador como el screener.
Este es el indicador, que debes llamar PRC_Wyckoff Event Detection:
//----------------------------------------------
//PRC_Wyckoff Event Detection
//version = 0
//08.06.26
//Iván González @ www.prorealcode.com
//Autor original: AlphaExtract
//Sharing ProRealTime knowledge
//----------------------------------------------
// === Parametros ===
//----------------------------------------------
volLen = 20 // periodo media de volumen
priceLookback = 20 // ventana de maximos/minimos y ATR
volThreshMult = 2.0 // multiplicador de volumen (mayor = menos eventos)
priceThreshMult = 0.3 // umbral de movimiento de precio
trendStrength = 3 // barras de racha para confirmar tendencia
minBars = 5 // separacion minima (barras) por tipo de evento
volumeFilter = 1.5 // filtro de volumen para eventos secundarios
phaseMult = 2.0 // veces que un bando supera al otro para fijar fase
phaseWindow = 20 // ventana de reseteo de contadores de fase
showRange = 1 // 1 = dibuja rango de trading
rangeStyle = 2 // 0 = dinamico, 1 = fijo, 2 = por pivotes
showMarks = 1 // 1 = dibuja punto + linea hacia atras en cada evento
lineLength = 15 // longitud (barras) de la linea hacia atras de la muesca
fixedRangeBars = 50 // lookback del rango fijo
pivotStrength = 3 // barras a cada lado para validar pivote
pivotLookback = 100 // barras a escanear buscando pivotes
rangeExtend = 50 // barras de extension del rango hacia la derecha
//----------------------------------------------
// === Indicadores base ===
//----------------------------------------------
volMA = average[volLen](volume)
hh = highest[priceLookback](high)
ll = lowest[priceLookback](low)
avgTR = averagetruerange[priceLookback]
rng = high - low
labelOffset = avgTR * 0.5
//----------------------------------------------
// === Rachas direccionales ===
//----------------------------------------------
fallN = 1
for k = 1 to trendStrength do
if close[k-1] >= close[k] then
fallN = 0
endif
next
riseN = 1
for k = 1 to trendStrength do
if close[k-1] <= close[k] then
riseN = 0
endif
next
riseN1 = 1
for k = 1 to trendStrength + 1 do
if close[k-1] <= close[k] then
riseN1 = 0
endif
next
riseN2 = 1
for k = 1 to trendStrength + 2 do
if close[k-1] <= close[k] then
riseN2 = 0
endif
next
//----------------------------------------------
// === Contadores de fase ===
//----------------------------------------------
once bearishCount = 0
once bullishCount = 0
if bearishCount > bullishCount * phaseMult then
currentPhase = 1 // DISTRIBUCION
elsif bullishCount > bearishCount * phaseMult then
currentPhase = 2 // ACUMULACION
else
currentPhase = 0 // NEUTRAL
endif
//----------------------------------------------
// === Condiciones de DISTRIBUCION (bajistas) ===
//----------------------------------------------
psyCond = 0
if high > hh[1] and volume > volMA * volThreshMult and close < high - rng * priceThreshMult and fallN = 1 then
psyCond = 1
endif
utdCond = 0
if currentPhase = 1 and high > hh[1] and close < open and volume > volMA * volumeFilter and high - close > avgTR * priceThreshMult then
utdCond = 1
endif
lpsyCond = 0
if high > high[1] and close < open and volume < volMA * volumeFilter and fallN = 1 then
lpsyCond = 1
endif
sowCond = 0
if close < open and low < ll[1] and volume > volMA * volThreshMult and fallN = 1 then
sowCond = 1
endif
bcCond = 0
if rng > 0 then
if high > hh[2] and volume > volMA * (volThreshMult * 1.5) and close > open and (close - open) / rng > 0.6 then
bcCond = 1
endif
endif
stdCond = 0
if currentPhase = 1 and high > high[1] and high >= hh[5] * 0.98 and high <= hh[5] * 1.02 and volume < volMA and volume < volume[1] * 0.8 then
stdCond = 1
endif
// BUEC: primer Upthrust en las ultimas 5 barras seguido de rally debil
buecCond = 0
for i = 1 to 5 do
if utdCond[i] = 1 then
if close < open and high < high[i] and close > low + rng * 0.3 and volume < volume[i] then
buecCond = 1
endif
break
endif
next
//----------------------------------------------
// === Condiciones de ACUMULACION (alcistas) ===
//----------------------------------------------
psCond = 0
if low < ll[1] and volume > volMA * volThreshMult and close > low + rng * priceThreshMult and fallN = 1 then
psCond = 1
endif
scCond = 0
if low < ll[1] and volume > volMA * (volThreshMult * 1.2) and close > low + rng * (priceThreshMult * 1.5) then
scCond = 1
endif
araCond = 0
if currentPhase = 2 and close > open and high > hh[trendStrength] and volume < volMA * volumeFilter and riseN = 1 then
araCond = 1
endif
sosCond = 0
if close > open and high > hh[1] and volume > volMA * volThreshMult and riseN = 1 then
sosCond = 1
endif
lpsCond = 0
if low > low[1] and close > open and volume < volMA * volumeFilter and riseN = 1 then
lpsCond = 1
endif
springCond = 0
if low < ll[3] and close > open and close > low + rng * 0.6 and volume > volMA * volumeFilter then
springCond = 1
endif
staCond = 0
if currentPhase = 2 and low < low[1] and low >= ll[5] * 0.98 and low <= ll[5] * 1.02 and volume < volMA and volume < volume[1] * 0.8 then
staCond = 1
endif
jacCond = 0
if close > open and close > hh[3] and volume > volMA * volThreshMult and riseN1 = 1 then
jacCond = 1
endif
tsoCond = 0
if low < ll[2] and close > open and close > low + rng * 0.7 and volume > volMA * (volThreshMult * 1.2) and riseN2 = 1 then
tsoCond = 1
endif
//----------------------------------------------
// === Actualizacion de contadores + reseteo periodico ===
//----------------------------------------------
if psyCond = 1 or utdCond = 1 or lpsyCond = 1 or sowCond = 1 or bcCond = 1 or stdCond = 1 or buecCond = 1 then
bearishCount = bearishCount + 1
endif
if psCond = 1 or scCond = 1 or araCond = 1 or sosCond = 1 or lpsCond = 1 or springCond = 1 or staCond = 1 or jacCond = 1 or tsoCond = 1 then
bullishCount = bullishCount + 1
endif
if barindex mod phaseWindow = 0 then
bearishCount = 0
bullishCount = 0
endif
//----------------------------------------------
// === Dibujo de etiquetas ===
//----------------------------------------------
priceRangeFilter = 0.5
once lastLabelBar = 0 - 1000
once lastLabelPrice = 0
once lastR = 0
once lastG = 0
once lastB = 0
// Distribucion (etiqueta arriba salvo SOW)
if psyCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("PSY", barindex, high + labelOffset) coloured(255, 107, 107)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 255
lastG = 107
lastB = 107
endif
UTDsignal = 0
if utdCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("UT-D", barindex, high + labelOffset) coloured(255, 165, 0)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 255
lastG = 165
lastB = 0
UTDsignal = -1
endif
if lpsyCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("LPSY", barindex, high + labelOffset) coloured(255, 65, 65)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 255
lastG = 65
lastB = 65
endif
if sowCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
drawtext("SOW", barindex, low - labelOffset) coloured(255, 0, 0)
lastLabelBar = barindex
lastLabelPrice = low
lastR = 255
lastG = 0
lastB = 0
endif
if bcCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("BC", barindex, high + labelOffset) coloured(255, 127, 0)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 255
lastG = 127
lastB = 0
endif
if stdCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("ST-D", barindex, high + labelOffset) coloured(255, 160, 122)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 255
lastG = 160
lastB = 122
endif
if buecCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("BUEC", barindex, high + labelOffset) coloured(255, 99, 71)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 255
lastG = 99
lastB = 71
endif
// Acumulacion (etiqueta abajo salvo AR-A / SOS / JAC)
if psCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
drawtext("PS", barindex, low - labelOffset) coloured(76, 175, 80)
lastLabelBar = barindex
lastLabelPrice = low
lastR = 76
lastG = 175
lastB = 80
endif
if scCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
drawtext("SC", barindex, low - labelOffset) coloured(69, 179, 157)
lastLabelBar = barindex
lastLabelPrice = low
lastR = 69
lastG = 179
lastB = 157
endif
if araCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("AR-A", barindex, high + labelOffset) coloured(46, 204, 113)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 46
lastG = 204
lastB = 113
endif
if sosCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("[SOS]", barindex, high + labelOffset) coloured(39, 174, 96)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 39
lastG = 174
lastB = 96
endif
if lpsCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
drawtext("LPS", barindex, low - labelOffset) coloured(34, 153, 84)
lastLabelBar = barindex
lastLabelPrice = low
lastR = 34
lastG = 153
lastB = 84
endif
SpringSignal = 0
if springCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
drawtext("SPRING", barindex, low - labelOffset) coloured(0, 250, 154)
lastLabelBar = barindex
lastLabelPrice = low
lastR = 0
lastG = 250
lastB = 154
SpringSignal = 1
endif
if staCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
drawtext("ST-A", barindex, low - labelOffset) coloured(102, 205, 170)
lastLabelBar = barindex
lastLabelPrice = low
lastR = 102
lastG = 205
lastB = 170
endif
if jacCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
drawtext("JAC", barindex, high + labelOffset) coloured(50, 205, 50)
lastLabelBar = barindex
lastLabelPrice = high
lastR = 50
lastG = 205
lastB = 50
endif
if tsoCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
drawtext("TSO", barindex, low - labelOffset) coloured(0, 128, 0)
lastLabelBar = barindex
lastLabelPrice = low
lastR = 0
lastG = 128
lastB = 0
endif
// Muesca opcional
if showMarks = 1 and lastLabelBar = barindex then
drawpoint(barindex, lastLabelPrice, 2) coloured(lastR, lastG, lastB)
drawsegment(barindex - lineLength, lastLabelPrice, barindex, lastLabelPrice) coloured(lastR, lastG, lastB)
endif
//----------------------------------------------
// === Rango de trading + base del % del panel (solo ultima barra) ===
//----------------------------------------------
if islastbarupdate then
if rangeStyle = 0 then
topR = hh
botR = ll
x1 = barindex - priceLookback
elsif rangeStyle = 1 then
topR = highest[fixedRangeBars](high)
botR = lowest[fixedRangeBars](low)
x1 = barindex - fixedRangeBars
else
topR = hh
botR = ll
x1 = barindex - priceLookback
foundH = 0
foundL = 0
maxLB = min(pivotLookback, barindex - pivotStrength - 1)
if maxLB > 5 then
for i = 5 to maxLB do
if foundH = 0 then
ph = 1
for j = 1 to pivotStrength do
if high[i] <= high[i+j] or high[i] <= high[i-j] then
ph = 0
endif
next
if ph = 1 then
topR = high[i]
foundH = 1
endif
endif
next
for i = 5 to maxLB do
if foundL = 0 then
pl = 1
for j = 1 to pivotStrength do
if low[i] >= low[i+j] or low[i] >= low[i-j] then
pl = 0
endif
next
if pl = 1 then
botR = low[i]
foundL = 1
endif
endif
next
endif
endif
if showRange = 1 then
drawrectangle(x1, topR, barindex + rangeExtend, botR) coloured(123, 104, 238)
endif
endif
//----------------------------------------------
// === Panel de estado ===
//----------------------------------------------
if islastbarupdate then
panelX = -200 // px a la izquierda del borde derecho
topY = -20 // px hacia abajo del borde superior
if currentPhase = 2 then
drawtext("FASE: ACUMULACION", panelX, topY, SansSerif, bold, 11) coloured(76, 175, 80) anchor(topright, xshift, yshift)
elsif currentPhase = 1 then
drawtext("FASE: DISTRIBUCION", panelX, topY, SansSerif, bold, 11) coloured(255, 107, 107) anchor(topright, xshift, yshift)
else
drawtext("FASE: NEUTRAL", panelX, topY, SansSerif, bold, 11) coloured(150, 150, 150) anchor(topright, xshift, yshift)
endif
denom = bullishCount + bearishCount
if denom < 1 then
denom = 1
endif
sRatio = abs(bullishCount - bearishCount) / denom
if sRatio > 0.7 then
drawtext("FUERZA: FUERTE", panelX, topY - 22, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
elsif sRatio > 0.3 then
drawtext("FUERZA: MODERADA", panelX, topY - 22, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
else
drawtext("FUERZA: DEBIL", panelX, topY - 22, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
endif
if high >= hh[3] and close < open then
drawtext("POS: ZONA UPTHRUST", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
elsif low <= ll[3] and close > open then
drawtext("POS: ZONA SPRING", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
elsif high >= hh[5] then
drawtext("POS: EN RESISTENCIA", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
elsif low <= ll[5] then
drawtext("POS: EN SOPORTE", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
else
drawtext("POS: RANGO", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
endif
if volume > volMA * 1.5 and close > open then
drawtext("S/D: DEMANDA", panelX, topY - 66, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
elsif volume > volMA * 1.5 and close < open then
drawtext("S/D: OFERTA", panelX, topY - 66, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
else
drawtext("S/D: EQUILIBRIO", panelX, topY - 66, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
endif
rangePct = round((topR - botR) / botR * 1000) / 10
drawtext("RANGO: #rangePct#%", panelX, topY - 88, SansSerif, bold, 11) coloured(123, 104, 238) anchor(topright, xshift, yshift)
endif
return SpringSignal AS "Spring",UTDsignal AS "UT-D"
Este es el filtro, al que puedes llamar como quieras:
mySpring, myUTD = CALL "PRC_Wyckoff Event Detection"[20, 20, 2, 0.3, 3, 5, 1.5, 2, 20, 1, 2, 1, 15, 50, 3, 100, 50](close)
Cond = 0
IF mySpring THEN
Cond = Cond + 1
ELSIF myUTD THEN
Cond = Cond + 10
ENDIF
SCREENER [Cond](Cond AS "1=SPRING,10=UT-D")
Fai il copia e incolla del codice e funzionerà certamente.
Hola, algo diferente a otros screener que he tenido pero lo importante que funciona, gracias.
Screener del indicador Detención de eventos Wyckoff
This topic contains 10 replies,
has 2 voices, and was last updated by NicoGB67
3 days, 14 hours ago.
| Forum: | ProScreener: Buscadores de Mercado y Rastreo |
| Language: | Spanish |
| Started: | 06/11/2026 |
| Status: | Active |
| Attachments: | 4 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.