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