Parabolica sar cambiando punto de inicio

Viewing 4 posts - 1 through 4 (of 4 total)
  • Author
    Posts
  • #252050 quote
    PedroJimenez
    Participant
    New

    Buenos días me gustaría hacer un indicador que cuando la parabolica sar se encuentre debajo del precio, del punto extremo (máximo de la tendencia de la parabólica sar) me inicia una parabólica sar diferente pero al contrario es decir que su caída sea a la baja al contrario de lo que hace naturalmente y al revés. Adjunto código por si serviría ya que lo inicio pero no se como terminarlo.

    DEFPARAM DrawOnLastBarOnly = true
    
    // --- Parámetros ---
    ONCE SARinit = 0.02
    ONCE SARstep= 0.02
    ONCE SARlimit = 0.2
    ONCE Ticki= 0.02
    // ---------- SAR normal ----------
    psar = SAR[SARinit,SARstep,SARlimit]
    
    // ---------- Punto Extremo (PE) ----------
    ONCE contador= 0
    ONCE cuenta= 0
    ONCE tendenciaPrev= 0
    ONCE PE = close
    
    C1 = close > psar
    C2 = close < psar
    
    IF C1 AND NOT C1[1] THEN
    contador = 1
    tendenciaPrev = 1
    ELSIF C2 AND NOT C2[1] THEN
    cuenta  = 1
    tendenciaPrev = -1
    ELSIF tendenciaPrev = 1 THEN
    contador = contador[1] + 1
    ELSIF tendenciaPrev = -1 THEN
    cuenta = cuenta[1] + 1
    ENDIF
    
    IF C1 THEN
    IF contador > 1 THEN
    PE = HIGHEST[contador](HIGH)
    ELSE
    PE = HIGH
    ENDIF
    ELSIF C2 THEN
    IF cuenta > 1 THEN
    PE = LOWEST[cuenta](LOW)
    ELSE
    PE = LOW
    ENDIF
    ENDIF
    
    
    newPE = (PE <> PE[1])
    
    
    ONCE lastPEbar = 0
    ONCE PEseed = PE
    ONCE dirSeed= 0
    
    IF newPE THEN
    lastPEbar = BarIndex
    PEseed= PE
    IF PE > psar THEN
    dirSeed = -1
    ELSE
    dirSeed =1
    ENDIF
    ENDIF
    
    
    ONCE invParabolic = PE
    ONCE invIsLong = 1
    ONCE invAF = SARinit
    ONCE invHP = HIGH
    ONCE invLP  = LOW
    invFlipped = 0
    
    IF newPE THEN
    invParabolic = PE
    invAF = SARinit
    IF PE > psar THEN
    invIsLong = 0
    invLP= LOW
    invHP= PE
    ELSE
    invIsLong = 1
    invHP= HIGH
    invLP= PE
    ENDIF
    ELSE
    IF invIsLong THEN
    invParabolic = invParabolic + invAF * (invHP - invParabolic)
    invParabolic = MIN(invParabolic, LOW[1])
    invParabolic = MIN(invParabolic, LOW[2])
    invFlipped = 0
    IF LOW < invParabolic THEN
    invIsLong= 0
    invFlipped= 1
    invParabolic = invHP
    invLP= LOW
    invAF= SARinit
    ENDIF
    IF NOT invFlipped THEN
    IF HIGH > invHP THEN
    invHP = HIGH
    invAF = MIN(invAF + SARstep, SARlimit)
    ENDIF
    ENDIF
    ELSE
    invParabolic = invParabolic + invAF * (invLP - invParabolic)
    invParabolic = MAX(invParabolic, HIGH[1])
    invParabolic = MAX(invParabolic, HIGH[2])
    invFlipped = 0
    IF HIGH > invParabolic THEN
    invIsLong = 1
    invFlipped= 1
    invParabolic = invLP
    invHP= HIGH
    invAF = SARinit
    ENDIF
    IF NOT invFlipped THEN
    IF LOW < invLP THEN
    invLP = LOW
    invAF = MIN(invAF + SARstep, SARlimit)
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    
    
    
    
    lenUp   = MAX(contador, 1)
    lenDown = MAX(cuenta, 1)
    
    // Inicializa
    PEactual  = close
    PEcontra  = close
    
    IF C1 THEN
    
    IF contador > 1 THEN
    PEactual = HIGHEST[lenUp](HIGH)
    ELSE
    PEactual = HIGH
    ENDIF
    
    
    IF contador > 1 THEN
    PEcontra = LOWEST[lenUp](LOW)
    ELSE
    PEcontra = LOW
    ENDIF
    
    ELSIF C2 THEN
    
    IF cuenta > 1 THEN
    PEactual = LOWEST[lenDown](LOW)
    ELSE
    PEactual = LOW
    ENDIF
    
    IF cuenta > 1 THEN
    PEcontra = HIGHEST[lenDown](HIGH)
    ELSE
    PEcontra = HIGH
    ENDIF
    ELSE
    
    PEactual = close
    PEcontra = close
    ENDIF
    
    
    DRAWHLINE(PEactual) COLOURED(0,128,255)
    DRAWHLINE(PEcontra) COLOURED(255,128,0)
    
    
    
    ONCE lastBarIndex = 0
    lastBarIndex = MAX(lastBarIndex, BarIndex)
    
    
    IF BarIndex = lastBarIndex THEN
    startBar = MAX(lastPEbar, 0)
    IF startBar <= lastBarIndex THEN
    FOR k = startBar TO lastBarIndex DO
    steps = k - startBar
    y = PEseed + dirSeed * steps * Ticki
    DRAWTEXT("■", k, y, Dialog, Bold, 11) COLOURED(0,0,200)
    NEXT
    ENDIF
    ENDIF
    
    
    
    
    RETURN
    #252089 quote
    Iván González
    Moderator
    Master

    Buenas. No sé si lo he entendido bien… te paso mi propuesta:

    increment = 0.02
    initial = 0.02
    limite = 0.2
    
    IF BARINDEX < 2 THEN
       Lparabolic = LOW
       islong = 1
       af = limite
       hp = HIGH
       lp = LOW
       invLparabolic = low
    ELSE
       IF islong THEN
          Lparabolic = Lparabolic + af * (hp - Lparabolic)
          Lparabolic = MIN(Lparabolic, LOW[1])
          Lparabolic = MIN(Lparabolic, LOW[2])
          invLparabolic = invLparabolic - af * (hp - Lparabolic)
       ELSE
          Sparabolic=Sparabolic + af * (lp - Sparabolic)
          Sparabolic=MAX(Sparabolic, HIGH[1])
          Sparabolic=MAX(Sparabolic, HIGH[2])
          InvSparabolic=InvSparabolic - af * (lp - Sparabolic)
       ENDIF
       
       reverse = 0
       
       IF islong THEN
          IF LOW < Lparabolic THEN
             islong = 0
             reverse = 1
             Sparabolic = hp
             lp = LOW
             af = initial
             InvSparabolic = hp
          ENDIF
       ELSE
          IF HIGH > Sparabolic THEN
             islong = 1
             reverse =1
             Lparabolic = lp
             hp = HIGH
             af = initial
             invLparabolic = lp
          ENDIF
       ENDIF
       
       IF NOT reverse THEN
          IF islong THEN
             IF HIGH > hp THEN
                hp = HIGH
                af = af + increment
                af = MIN (af,limite)
             ENDIF
          ELSE
             IF LOW < lp THEN
                lp = LOW
                af = af + increment
                af = MIN (af,limite)
             ENDIF
          ENDIF
       ENDIF
       
    ENDIF
    
    If isLong then
       DRAWPOINT(barindex, Lparabolic, 2) Coloured(0,255,0)
       DRAWPOINT(barindex, invLparabolic, 2) Coloured(0,255,255)
    EndIf
    If NOT isLong then
       DRAWPOINT(barindex,Sparabolic,2) Coloured(255,0,0)
       DRAWPOINT(barindex,invSparabolic,2) Coloured(255,0,255)
    EndIf
    Return
    
    robertogozzi thanked this post
    #252124 quote
    PedroJimenez
    Participant
    New

    Buenas, no quiero algo asi como este indicador que solo en la tendencia actual de la parabolica sar me dibuje una sar en el PE y vaya hacia el lado contrario de la parabolica sar y ademas que si la rebasa el precio cambie de posicion como haria una parabolica sar normal solo que inicie del PE como en la imagen, adjunto el codigo :

    //---------------------------------------------
    //   PARABÓLICA PERSONALIZADA ANCLADA A PE
    //   (Incluye cálculo de PSAR y PE original)
    //   Pintado SOLO desde el último PE (sin cambiar tu lógica)
    //---------------------------------------------
    DEFPARAM DrawOnLastBarOnly = true
    
    //==== Parámetros PSAR / Parabólica
    increment = 0.02
    initial   = 0.02
    limite    = 0.2
    
    //==== PSAR base
    psar = SAR[0.02, 0.02, 0.2]
    
    //==== Cálculo de PE (tal cual tu lógica original)
    C1 = close > psar
    C2 = close < psar
    
    IF barindex = 0 THEN
    CONTADOR = 0
    CUENTA = 0
    TENDENCIAANTERIOR = 0
    PE = close
    
    // >>> NUEVO: tracking del último PE y de la última barra
    ONCE lastPEbar = 0
    ONCE lastBarIndex = 0
    ENDIF
    
    // Actualizamos la última barra vista
    lastBarIndex = MAX(lastBarIndex, barindex)
    
    IF C1 AND NOT C1[1] THEN
    CONTADOR = 1
    TENDENCIAANTERIOR = 1
    ELSIF C2 AND NOT C2[1] THEN
    CUENTA = 1
    TENDENCIAANTERIOR = -1
    ELSIF TENDENCIAANTERIOR = 1 THEN
    CONTADOR = CONTADOR[1] + 1
    ELSIF TENDENCIAANTERIOR = -1 THEN
    CUENTA = CUENTA[1] + 1
    ENDIF
    
    IF C1 THEN
    IF CONTADOR > 1 THEN
    PE = HIGHEST[CONTADOR](HIGH)
    ELSE
    PE = HIGH
    ENDIF
    ENDIF
    
    IF C2 THEN
    IF CUENTA > 1 THEN
    PE = LOWEST[CUENTA](LOW)
    ELSE
    PE = LOW
    ENDIF
    ENDIF
    
    // >>> NUEVO: detectar nuevo PE para anclar el dibujo
    newPE = (PE <> PE[1])
    IF newPE THEN
    lastPEbar = barindex
    ENDIF
    
    //==== Variables de la parabólica anclada a PE (TU LÓGICA)
    IF barindex = 0 THEN
    isLong        = 1
    af            = initial
    hp            = high
    lp            = low
    Lparabolic    = PE
    invLparabolic = PE
    Sparabolic    = PE
    invSparabolic = PE
    
    // (Tenías startDraw; lo mantenemos pero NO lo usamos para pintar)
    startDraw  = 0
    ENDIF
    
    // Si en las primeras velas se detecta claramente C1/C2, ajustamos isLong y puntos de arranque (TU LÓGICA)
    IF barindex = 1 THEN
    IF C1 THEN
    isLong        = 1
    Lparabolic    = PE
    invLparabolic = PE
    hp            = HIGH
    af            = initial
    startDraw     = barindex
    // >>> anclamos también el PE de arranque
    lastPEbar     = barindex
    ELSIF C2 THEN
    isLong        = 0
    Sparabolic    = PE
    invSparabolic = PE
    lp            = LOW
    af            = initial
    startDraw     = barindex
    // >>> anclamos también el PE de arranque
    lastPEbar     = barindex
    ENDIF
    ENDIF
    
    //==== Actualización en cada barra (TU LÓGICA INTACTA)
    IF barindex >= 2 THEN
    
    // Evolución de la curva según tendencia vigente
    IF isLong THEN
    // Largos
    Lparabolic    = Lparabolic + af * (hp - Lparabolic)
    Lparabolic    = MIN(Lparabolic, LOW[1])
    Lparabolic    = MIN(Lparabolic, LOW[2])
    invLparabolic = invLparabolic - af * (hp - Lparabolic)
    ELSE
    // Cortos
    Sparabolic    = Sparabolic + af * (lp - Sparabolic)
    Sparabolic    = MAX(Sparabolic, HIGH[1])
    Sparabolic    = MAX(Sparabolic, HIGH[2])
    invSparabolic = invSparabolic - af * (lp - Sparabolic)
    ENDIF
    
    reverse = 0
    
    //---- Detección de giro y nuevo arranque en PE (TU LÓGICA)
    IF isLong THEN
    // Giro LARGO -> CORTO
    IF LOW < Lparabolic THEN
    isLong        = 0
    reverse       = 1
    // Nuevo tramo: arranca en PE
    Sparabolic    = PE
    invSparabolic = PE
    lp            = LOW
    af            = initial
    startDraw     = barindex     // tú lo tenías así
    // >>> y anclamos el dibujo al PE del giro
    lastPEbar     = barindex
    ENDIF
    ELSE
    // Giro CORTO -> LARGO
    IF HIGH > Sparabolic THEN
    isLong        = 1
    reverse       = 1
    // Nuevo tramo: arranca en PE
    Lparabolic    = PE
    invLparabolic = PE
    hp            = HIGH
    af            = initial
    startDraw     = barindex     // tú lo tenías así
    // >>> y anclamos el dibujo al PE del giro
    lastPEbar     = barindex
    ENDIF
    ENDIF
    
    //---- Gestión del AF si no hay giro (TU LÓGICA)
    IF NOT reverse THEN
    IF isLong THEN
    IF HIGH > hp THEN
    hp = HIGH
    af = af + increment
    af = MIN(af, limite)
    ENDIF
    ELSE
    IF LOW < lp THEN
    lp = LOW
    af = af + increment
    af = MIN(af, limite)
    ENDIF
    ENDIF
    ENDIF
    
    ENDIF
    
    //=======================================================
    //==== PINTADO SOLO EN LA ÚLTIMA BARRA DESDE EL ÚLTIMO PE
    //==== (USANDO TUS SERIES YA CALCULADAS; SIN RE-CALCULAR)
    //=======================================================
    IF barindex = lastBarIndex THEN
    // seguridad por si lastPEbar no se ha fijado aún
    startBar = MAX(lastPEbar, 0)
    IF startBar <= lastBarIndex THEN
    FOR k = startBar TO lastBarIndex DO
    // offset relativo para tomar el valor de tus series en la barra k
    idx = lastBarIndex - k
    IF isLong THEN
    y = invLparabolic[idx]
    DRAWPOINT(k, y, 2) COLOURED(0,255,255)
    ELSE
    y = invSparabolic[idx]
    DRAWPOINT(k, y, 2) COLOURED(255,0,255)
    ENDIF
    NEXT
    ENDIF
    ENDIF
    
    RETURN
    
    #252403 quote
    PedroJimenez
    Participant
    New

    Buenas Ivan sabes algo?

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

Parabolica sar cambiando punto de inicio


ProBuilder: Indicadores y Herramientas

New Reply
Author
Summary

This topic contains 3 replies,
has 2 voices, and was last updated by PedroJimenez
4 months ago.

Topic Details
Forum: ProBuilder: Indicadores y Herramientas
Language: Spanish
Started: 10/01/2025
Status: Active
Attachments: 1 files
Logo Logo
Loading...