Harmonic Pattern Detector

Viewing 2 posts - 1 through 2 (of 2 total)
  • Author
    Posts
  • #260915 quote
    NicoGB67
    Participant
    Senior

    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.

    #260960 quote
    Iván González
    Moderator
    Master

    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")
    



    NicoGB67 thanked this post
Viewing 2 posts - 1 through 2 (of 2 total)
  • You must be logged in to reply to this topic.

Harmonic Pattern Detector


ProScreener: Buscadores de Mercado y Rastreo

New Reply
Author
author-avatar
NicoGB67 @nicogb67 Participant
Summary

This topic contains 1 reply,
has 2 voices, and was last updated by Iván González
3 hours, 19 minutes ago.

Topic Details
Forum: ProScreener: Buscadores de Mercado y Rastreo
Language: Spanish
Started: 05/07/2026
Status: Active
Attachments: No files
Logo Logo
Loading...