Buenas tardes, me gustaría tener el screener del indicador Harmonic Pattern Detector que ayer subió Iván, lógicamente me gustaría que me diera la señal cuando se detecte cualquiera de los patrones, gracias.
aqui tienes
// === FXC Harmonic Pattern — Screener ===
// Detecta el ultimo patron armonico XABCD confirmado en las ultimas maxBarsAge
// barras (filtro por tipo de patron + direccion)
// --- Inputs ---
depth = 12 // ZigZag: ventana simetrica del pivot
deviation = 5 // ZigZag: % minimo de retracement entre pivots
backstep = 3 // ZigZag: barras minimas entre pivots
correction = 25 // Tolerancia (%) sobre ratios Fibonacci
showBat = 1
showGartley = 1
showCrab = 1
showButterfly = 1
showABCD = 1
showThreeDrives = 1
dirFilter = 0 // 0=ambos, 1=solo Bull, -1=solo Bear
maxBarsAge = 5 // patron confirmado hace como mucho N barras
// --- Init ---
ONCE n = 0 // contador de pivots
ONCE lastPid = 0 // ultimo patron detectado: 1=Bat,2=Gartley,3=Crab,4=Butterfly,5=ABCD,6=ThreeDrives
ONCE lastBull = 0 // 1=Bull, 0=Bear
ONCE lastConfBar = 0 // barindex de confirmacion del ultimo patron
prd = depth
corrFrac = correction / 100
// ============================================================
// === 1. DETECCION DE PIVOTS (ZigZag MT-style) ===
// ============================================================
IF barindex >= 2*prd+1 THEN
pivBar = barindex - prd
isPivH = high[prd] >= highest[2*prd+1](high)
isPivL = low[prd] <= lowest[2*prd+1](low)
// --- HIGH candidate ---
IF isPivH THEN
candPrc = high[prd]
lastIdxH = 0
lastPrcH = 0
lastTypH = 0
IF n > 0 THEN
lastIdxH = $pivIdx[n-1]
lastPrcH = $pivPrc[n-1]
lastTypH = $pivTyp[n-1]
ENDIF
okH = 1
IF n > 0 THEN
IF (pivBar - lastIdxH) < backstep THEN
okH = 0
ENDIF
ENDIF
IF okH = 1 THEN
IF n > 0 THEN
IF lastTypH = -1 THEN
devPctH = abs(candPrc - lastPrcH) / lastPrcH * 100
IF devPctH < deviation THEN
okH = 0
ENDIF
ENDIF
ENDIF
ENDIF
IF okH = 1 THEN
IF n = 0 THEN
$pivIdx[0] = pivBar
$pivPrc[0] = candPrc
$pivTyp[0] = 1
n = 1
ELSE
IF lastTypH = 1 THEN
IF candPrc > lastPrcH THEN
$pivIdx[n-1] = pivBar
$pivPrc[n-1] = candPrc
ENDIF
ELSE
$pivIdx[n] = pivBar
$pivPrc[n] = candPrc
$pivTyp[n] = 1
n = n + 1
ENDIF
ENDIF
ENDIF
ENDIF
// --- LOW candidate ---
IF isPivL THEN
candPrc = low[prd]
lastIdxL = 0
lastPrcL = 0
lastTypL = 0
IF n > 0 THEN
lastIdxL = $pivIdx[n-1]
lastPrcL = $pivPrc[n-1]
lastTypL = $pivTyp[n-1]
ENDIF
okL = 1
IF n > 0 THEN
IF (pivBar - lastIdxL) < backstep THEN
okL = 0
ENDIF
ENDIF
IF okL = 1 THEN
IF n > 0 THEN
IF lastTypL = 1 THEN
devPctL = abs(candPrc - lastPrcL) / lastPrcL * 100
IF devPctL < deviation THEN
okL = 0
ENDIF
ENDIF
ENDIF
ENDIF
IF okL = 1 THEN
IF n = 0 THEN
$pivIdx[0] = pivBar
$pivPrc[0] = candPrc
$pivTyp[0] = -1
n = 1
ELSE
IF lastTypL = -1 THEN
IF candPrc < lastPrcL THEN
$pivIdx[n-1] = pivBar
$pivPrc[n-1] = candPrc
ENDIF
ELSE
$pivIdx[n] = pivBar
$pivPrc[n] = candPrc
$pivTyp[n] = -1
n = n + 1
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// ============================================================
// === 2. EVALUACION DE PATRON XABCD ===
// ============================================================
evalPattern = 0
IF n >= 5 THEN
IF n <> n[1] THEN
evalPattern = 1
ENDIF
ENDIF
IF evalPattern = 1 THEN
xPrc = $pivPrc[n-5]
aPrc = $pivPrc[n-4]
bPrc = $pivPrc[n-3]
cPrc = $pivPrc[n-2]
dPrc = $pivPrc[n-1]
dTyp = $pivTyp[n-1]
isBull = 0
IF dTyp = -1 THEN
isBull = 1
ENDIF
xa = abs(xPrc - aPrc)
ab = abs(aPrc - bPrc)
bc = abs(bPrc - cPrc)
cd = abs(cPrc - dPrc)
ad = abs(aPrc - dPrc)
ratiosOk = 0
IF xa > 0 THEN
IF ab > 0 THEN
IF bc > 0 THEN
ratiosOk = 1
ENDIF
ENDIF
ENDIF
foundPid = 0
IF ratiosOk = 1 THEN
rAB = ab / xa
rBC = bc / ab
rCD = cd / bc
rAD = ad / xa
// BAT: AB=0.382-0.500 XA, BC=0.382-0.886 AB, CD=1.618-2.618 BC, AD=0.886 XA
abOk = 0
IF rAB >= 0.382 - corrFrac THEN
IF rAB <= 0.500 + corrFrac THEN
abOk = 1
ENDIF
ENDIF
bcOk = 0
IF rBC >= 0.382 - corrFrac THEN
IF rBC <= 0.886 + corrFrac THEN
bcOk = 1
ENDIF
ENDIF
cdOk = 0
IF rCD >= 1.618 - corrFrac THEN
IF rCD <= 2.618 + corrFrac THEN
cdOk = 1
ENDIF
ENDIF
adOk = 0
IF rAD >= 0.886 - corrFrac THEN
IF rAD <= 0.886 + corrFrac THEN
adOk = 1
ENDIF
ENDIF
IF abOk = 1 THEN
IF bcOk = 1 THEN
IF cdOk = 1 THEN
IF adOk = 1 THEN
foundPid = 1
ENDIF
ENDIF
ENDIF
ENDIF
// GARTLEY: AB=0.618 XA, BC=0.382-0.886 AB, CD=1.272-1.618 BC, AD=0.786 XA
IF foundPid = 0 THEN
abOk = 0
IF rAB >= 0.618 - corrFrac THEN
IF rAB <= 0.618 + corrFrac THEN
abOk = 1
ENDIF
ENDIF
bcOk = 0
IF rBC >= 0.382 - corrFrac THEN
IF rBC <= 0.886 + corrFrac THEN
bcOk = 1
ENDIF
ENDIF
cdOk = 0
IF rCD >= 1.272 - corrFrac THEN
IF rCD <= 1.618 + corrFrac THEN
cdOk = 1
ENDIF
ENDIF
adOk = 0
IF rAD >= 0.786 - corrFrac THEN
IF rAD <= 0.786 + corrFrac THEN
adOk = 1
ENDIF
ENDIF
IF abOk = 1 THEN
IF bcOk = 1 THEN
IF cdOk = 1 THEN
IF adOk = 1 THEN
foundPid = 2
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// CRAB: AB=0.382-0.618 XA, BC=0.382-0.886 AB, CD=2.618-3.618 BC, AD=1.618 XA
IF foundPid = 0 THEN
abOk = 0
IF rAB >= 0.382 - corrFrac THEN
IF rAB <= 0.618 + corrFrac THEN
abOk = 1
ENDIF
ENDIF
bcOk = 0
IF rBC >= 0.382 - corrFrac THEN
IF rBC <= 0.886 + corrFrac THEN
bcOk = 1
ENDIF
ENDIF
cdOk = 0
IF rCD >= 2.618 - corrFrac THEN
IF rCD <= 3.618 + corrFrac THEN
cdOk = 1
ENDIF
ENDIF
adOk = 0
IF rAD >= 1.618 - corrFrac THEN
IF rAD <= 1.618 + corrFrac THEN
adOk = 1
ENDIF
ENDIF
IF abOk = 1 THEN
IF bcOk = 1 THEN
IF cdOk = 1 THEN
IF adOk = 1 THEN
foundPid = 3
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// BUTTERFLY: AB=0.786 XA, BC=0.382-0.886 AB, CD=1.618-2.618 BC, AD=1.272 XA
IF foundPid = 0 THEN
abOk = 0
IF rAB >= 0.786 - corrFrac THEN
IF rAB <= 0.786 + corrFrac THEN
abOk = 1
ENDIF
ENDIF
bcOk = 0
IF rBC >= 0.382 - corrFrac THEN
IF rBC <= 0.886 + corrFrac THEN
bcOk = 1
ENDIF
ENDIF
cdOk = 0
IF rCD >= 1.618 - corrFrac THEN
IF rCD <= 2.618 + corrFrac THEN
cdOk = 1
ENDIF
ENDIF
adOk = 0
IF rAD >= 1.272 - corrFrac THEN
IF rAD <= 1.272 + corrFrac THEN
adOk = 1
ENDIF
ENDIF
IF abOk = 1 THEN
IF bcOk = 1 THEN
IF cdOk = 1 THEN
IF adOk = 1 THEN
foundPid = 4
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// AB=CD: CD ~ AB en magnitud, BC = 0.618-0.786 retrace de AB
IF foundPid = 0 THEN
rAcd = 1
IF ab > 0 THEN
rAcd = cd / ab
ENDIF
abcdOk = 0
IF rAcd >= 1 - corrFrac THEN
IF rAcd <= 1 + corrFrac THEN
abcdOk = 1
ENDIF
ENDIF
bcOk = 0
IF rBC >= 0.618 - corrFrac THEN
IF rBC <= 0.786 + corrFrac THEN
bcOk = 1
ENDIF
ENDIF
IF abcdOk = 1 THEN
IF bcOk = 1 THEN
foundPid = 5
ENDIF
ENDIF
ENDIF
// THREE DRIVES: B = 1.272-1.618 XA, D = 1.272-1.618 BX
IF foundPid = 0 THEN
xb = abs(xPrc - bPrc)
xd = abs(xPrc - dPrc)
ir1 = 0
ir2 = 0
IF xa > 0 THEN
ir1 = xb / xa
ENDIF
IF xb > 0 THEN
ir2 = xd / xb
ENDIF
ir1Ok = 0
IF ir1 >= 1.272 - corrFrac THEN
IF ir1 <= 1.618 + corrFrac THEN
ir1Ok = 1
ENDIF
ENDIF
ir2Ok = 0
IF ir2 >= 1.272 - corrFrac THEN
IF ir2 <= 1.618 + corrFrac THEN
ir2Ok = 1
ENDIF
ENDIF
IF ir1Ok = 1 THEN
IF ir2Ok = 1 THEN
foundPid = 6
ENDIF
ENDIF
ENDIF
ENDIF
// Si hay patron, registrar como ultimo
IF foundPid > 0 THEN
lastPid = foundPid
lastBull = isBull
lastConfBar = barindex
ENDIF
ENDIF
// ============================================================
// === 3. CONDICION DE FILTRADO DEL SCREENER ===
// ============================================================
// Filtro por tipo de patron (usa las flags showXxx)
typeOk = 0
IF lastPid = 1 THEN
IF showBat = 1 THEN
typeOk = 1
ENDIF
ENDIF
IF lastPid = 2 THEN
IF showGartley = 1 THEN
typeOk = 1
ENDIF
ENDIF
IF lastPid = 3 THEN
IF showCrab = 1 THEN
typeOk = 1
ENDIF
ENDIF
IF lastPid = 4 THEN
IF showButterfly = 1 THEN
typeOk = 1
ENDIF
ENDIF
IF lastPid = 5 THEN
IF showABCD = 1 THEN
typeOk = 1
ENDIF
ENDIF
IF lastPid = 6 THEN
IF showThreeDrives = 1 THEN
typeOk = 1
ENDIF
ENDIF
// Filtro por direccion
dirOk = 1
IF dirFilter = 1 THEN
IF lastBull = 0 THEN
dirOk = 0
ENDIF
ENDIF
IF dirFilter = -1 THEN
IF lastBull = 1 THEN
dirOk = 0
ENDIF
ENDIF
// Filtro por antiguedad
ageOk = 0
barsAge = barindex - lastConfBar
IF lastPid > 0 THEN
IF barsAge <= maxBarsAge THEN
ageOk = 1
ENDIF
ENDIF
// Condicion compuesta (IFs anidados para evitar ambiguedad y respetar learning 028)
cond = 0
IF typeOk = 1 THEN
IF dirOk = 1 THEN
IF ageOk = 1 THEN
cond = 1
ENDIF
ENDIF
ENDIF
SCREENER[cond = 1](lastPid AS "Pat", lastBull AS "Bull", barsAge AS "Barras")