Buenos días, me gustaría tener un screener del indicador que subió ayer Iván “Kit de herramientas de acción de precios”; cuando describiendo el indicador en la parte de “aplicaciones prácticas” en el punto 4 dice:
4.Verificación de coherencia de múltiples módulos. Ejecute los cuatro módulos simultáneamente y busque coincidencias . Si el precio rompe una línea bajista CHoCH, arrastra liquidez alcista por debajo, se sitúa por debajo de una línea de tendencia bajista y genera un bloque de órdenes bajista, todo a la vez, la lectura estructural es unánime. Si solo se activa un módulo, considérelo como evidencia débil.
Me gustaría que me avisara cuando se produce un CHoCH (alcista o bajista), y a la vez se da un múltiple módulo, y que se den como mínimo dos, indicando el screener cuales de ellos se ha producido; entiendo que si se produce un CHoCH lo más lógico es que en esa vela no tiene porque darse otro de los requisitos pedidos, por lo que el screener (pienso yo) cuando debería avisar es cuando por ejemplo, se rompe una línea de tendencia y mirando unas velas atrás sí se dió un CHoCH, gracias por todo.
En el indicador original, los OB se crean en la misma vela que el CHoCH/BoS (la lógica es “cuando rompe estructura, busca la vela extrema del tramo y márcala como OB”). Por eso no se puede usar el OB como confirmador temporalmente independiente del CHoCH, son el mismo evento. Sí tiene sentido como módulo “el precio está reaccionando dentro de una zona OB”, pero eso convierte el screener en otra cosa. Lo dejo fuera para no añadir ruido y trabajo solo con los tres módulos que sí son señales separables en el tiempo: CHoCH base + sweep de liquidez + ruptura de trendline.
El screener funciona así:
- Registra el último CHoCH (alcista o bajista) y mantiene su dirección.
- Registra el último sweep de liquidez con su dirección (sweep de liquidez arriba = bajista; sweep de liquidez abajo = alcista).
- Registra la última ruptura de trendline con su dirección (close cruza TL bajista por arriba = alcista; cruza TL alcista por abajo = bajista).
- Dispara cuando hay un confirmador (sweep o ruptura de TL) dentro de las 2 últimas velas Y existe un CHoCH previo en las 10 velas anteriores que apunta en la misma dirección.
El screener avisa en la vela del segundo módulo, no antes. Si las 3 señales coinciden (CHoCH + sweep + TL break, todas coherentes) verás Hits = 2. Puedes subir minHits a 2 si solo te interesan los casos con triple confluencia.
*Aviso para usuarios de Complete (no Premium): con solo 255 barras el screener puede no tener histórico suficiente para que los pivotes centrados (2·liqLen+1 = 61 y 2·tlSens+1 = 41 velas) converjan bien.
//--------------------------------------------
// PRC_Price-Action-Toolkit Screener
// Confluencia: CHoCH reciente + sweep / ruptura TL en la misma direccion
// Iván González @ www.prorealcode.com
//--------------------------------------------
// PARAMETROS
zzLen = 9
liqLen = 30
tlSens = 20
lookback = 10
signalFreshness = 2
minHits = 1
// ESTADO - zigzag y CHoCH
once trendDir = 1
once drewUp = 0
once drewDown = 0
once stateDir = 0
once lastSHPrice = -1
once lastSLPrice = -1
once lastChochBar = -1
once lastChochDir = 0
// ESTADO - sweep y TL break
once lastSweepBar = -1
once lastSweepDir = 0
once lastTLBreakBar = -1
once lastTLBreakDir = 0
once activeBLVal = 0
once activeULVal = 0
once tlBearEnd = -1
once tlBearEndVal = 0
once tlBearStart = -1
once tlBearStartVal = 0
once tlBullEnd = -1
once tlBullEndVal = 0
once tlBullStart = -1
once tlBullStartVal = 0
// ZIGZAG (deteccion unilateral, igual que el indicador)
toUp = 0
toDown = 0
if barindex >= 2 * zzLen then
if high[zzLen] >= highest[zzLen](high) then
toUp = 1
endif
if low[zzLen] <= lowest[zzLen](low) then
toDown = 1
endif
endif
if trendDir = 1 and toDown = 1 then
trendDir = -1
elsif trendDir = -1 and toUp = 1 then
trendDir = 1
endif
if barindex > zzLen then
trendChanged = (trendDir <> trendDir[1])
else
trendChanged = 0
endif
if trendChanged and trendDir = 1 then
lastSHPrice = high[zzLen]
drewUp = 0
endif
if trendChanged and trendDir = -1 then
lastSLPrice = low[zzLen]
drewDown = 0
endif
// CHoCH bajista
if lastSLPrice > 0 and drewDown = 0 then
if close < lastSLPrice then
if stateDir = 0 or stateDir = 1 then
lastChochBar = barindex
lastChochDir = -1
endif
stateDir = -1
drewDown = 1
endif
endif
// CHoCH alcista
if lastSHPrice > 0 and drewUp = 0 then
if close > lastSHPrice then
if stateDir = 0 or stateDir = -1 then
lastChochBar = barindex
lastChochDir = 1
endif
stateDir = 1
drewUp = 1
endif
endif
// PIVOTES DE LIQUIDEZ (centrados)
if barindex >= 2 * liqLen then
if high[liqLen] = highest[2 * liqLen + 1](high) then
activeBLVal = high[liqLen]
endif
if low[liqLen] = lowest[2 * liqLen + 1](low) then
activeULVal = low[liqLen]
endif
endif
// SWEEP: high barre pero close vuelve dentro
if activeBLVal > 0 then
if high > activeBLVal then
if close < activeBLVal then
lastSweepBar = barindex
lastSweepDir = -1
endif
activeBLVal = 0
endif
endif
if activeULVal > 0 then
if low < activeULVal then
if close > activeULVal then
lastSweepBar = barindex
lastSweepDir = 1
endif
activeULVal = 0
endif
endif
// TRENDLINES (valuewhen pattern, igual que el indicador)
if barindex >= 2 * tlSens then
if high[tlSens] = highest[2 * tlSens + 1](high) then
tlBearStart = tlBearEnd
tlBearStartVal = tlBearEndVal
tlBearEnd = barindex - tlSens
tlBearEndVal = high[tlSens]
endif
if low[tlSens] = lowest[2 * tlSens + 1](low) then
tlBullStart = tlBullEnd
tlBullStartVal = tlBullEndVal
tlBullEnd = barindex - tlSens
tlBullEndVal = low[tlSens]
endif
endif
// RUPTURA TL bajista por arriba (alcista)
if tlBearStart > 0 and tlBearEnd > tlBearStart then
tlBearSlope = (tlBearEndVal - tlBearStartVal) / (tlBearEnd - tlBearStart)
if tlBearSlope < 0 then
tlBearExtVal = tlBearEndVal + tlBearSlope * (barindex - tlBearEnd)
tlBearExtPrev = tlBearEndVal + tlBearSlope * (barindex - 1 - tlBearEnd)
if close > tlBearExtVal and close[1] <= tlBearExtPrev then
lastTLBreakBar = barindex
lastTLBreakDir = 1
endif
endif
endif
// RUPTURA TL alcista por abajo (bajista)
if tlBullStart > 0 and tlBullEnd > tlBullStart then
tlBullSlope = (tlBullEndVal - tlBullStartVal) / (tlBullEnd - tlBullStart)
if tlBullSlope > 0 then
tlBullExtVal = tlBullEndVal + tlBullSlope * (barindex - tlBullEnd)
tlBullExtPrev = tlBullEndVal + tlBullSlope * (barindex - 1 - tlBullEnd)
if close < tlBullExtVal and close[1] >= tlBullExtPrev then
lastTLBreakBar = barindex
lastTLBreakDir = -1
endif
endif
endif
// EVALUACION FINAL
chochEnLookback = 0
if lastChochBar >= 0 then
if (barindex - lastChochBar) <= lookback then
chochEnLookback = 1
endif
endif
sweepFresco = 0
if lastSweepBar >= 0 then
if (barindex - lastSweepBar) <= signalFreshness then
sweepFresco = 1
endif
endif
tlBreakFresco = 0
if lastTLBreakBar >= 0 then
if (barindex - lastTLBreakBar) <= signalFreshness then
tlBreakFresco = 1
endif
endif
sweepConfirma = 0
if chochEnLookback = 1 and sweepFresco = 1 then
if lastSweepDir = lastChochDir then
if lastChochBar <= lastSweepBar then
sweepConfirma = 1
endif
endif
endif
tlConfirma = 0
if chochEnLookback = 1 and tlBreakFresco = 1 then
if lastTLBreakDir = lastChochDir then
if lastChochBar <= lastTLBreakBar then
tlConfirma = 1
endif
endif
endif
hits = sweepConfirma + tlConfirma
chochAge = barindex - lastChochBar
disparo = hits >= minHits
SCREENER[disparo](lastChochDir AS "CHoCH", chochAge AS "Bars", sweepConfirma AS "Sweep", tlConfirma AS "TL", hits AS "Hits")