
La estrategia de trading cuantitativa Adaptive Zero Lag Exponential Moving Average es una estrategia de trading cuantitativa desarrollada en base a la idea de la media móvil exponencial de cero retardo de Ehlers. La estrategia utiliza la media móvil de índice como indicador de referencia, y se agrega al método de adaptación de la medición de frecuencia instantánea para optimizar dinámicamente el período de la media móvil de índice.
La idea central de esta estrategia se deriva de la teoría de filtros de cero retraso de John Ehlers. El índice de movimiento promedio, aunque es un indicador técnico muy conocido, tiene un problema de retraso inherente. Ehlers elimina efectivamente el retraso mediante la inclusión de un factor de corrección de error en la fórmula de cálculo del índice de movimiento promedio, lo que hace que el índice de movimiento promedio de cero retraso sea más sensible a los cambios en los precios.
En la estrategia de EMA de retraso cero de auto-adaptación, utilizamos métodos de medición de la frecuencia en tiempo real para optimizar los parámetros periódicos de los promedios móviles del índice de retraso cero. La medición de la frecuencia en tiempo real se divide en dos tipos, la secuencia de la secuencia de la secuencia de precios y la secuencia de la secuencia de precios.
Cuando la línea rápida (la media móvil del índice de retraso cero) cruza la línea lenta (la media móvil del índice común) hace más y hace espacio cuando cruza, lo que forma una señal de estrategia de negociación similar a la de la media móvil cruzada.
La estrategia de EMA de autoadaptación con cero retraso combina filtros de cero retraso y métodos de optimización de ciclos de autoadaptación, con las siguientes ventajas:
La estrategia de adaptarse a un EMA de retraso cero también tiene ciertos riesgos, que se reflejan principalmente en:
Para controlar estos riesgos, necesitamos probar adecuadamente los ajustes de parámetros en diferentes entornos de mercado, ajustar adecuadamente los puntos de parada de pérdidas y verificar adecuadamente en la retroevaluación lo que sea posible para simular el entorno en el disco.
Hay un amplio margen de optimización para la estrategia de EMA de Adaptación a la Retraso Cero, que incluye:
A través de estas herramientas de optimización, se espera mejorar aún más la tasa de éxito, la rentabilidad, los indicadores de ajuste al riesgo de la estrategia, etc.
La estrategia de EMA de auto-adaptación con cero retraso, que combina con éxito el filtro de cero retraso y la idea de optimización del ciclo dinámico, es una estrategia de negociación cuantitativa con menos parámetros, fácil de operar y optimizar. Tiene características de alta sensibilidad a la respuesta, alta adaptabilidad y un buen rendimiento en mercados de tendencia.
/*backtest
start: 2024-01-19 00:00:00
end: 2024-02-18 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy(title="Adaptive Zero Lag EMA v2", shorttitle="AZLEMA", overlay = true)
src = input(title="Source", defval=close)
Period = input(title="Period", defval = 20)
adaptive = input(title="Adaptive Method", options=["Off", "Cos IFM", "I-Q IFM", "Average"], defval="Off")
GainLimit = input(title="Gain Limit", defval = 10)
Threshold = input(title="Threshold", type = float, defval=0.05, step=0.01)
fixedSL = input(title="SL Points", defval=70)
fixedTP = input(title="TP Points", defval=5)
risk = input(title='Risk', defval=0.01, step=0.01)
//##############################################################################
//I-Q IFM
//#############################################################################
range = input(title="Max Period", defval=60, minval=8, maxval=100)
PI = 3.14159265359
imult = 0.635
qmult = 0.338
inphase = 0.0
quadrature = 0.0
re = 0.0
im = 0.0
deltaIQ = 0.0
instIQ = 0.0
lenIQ = 0.0
V = 0.0
P = src - src[7]
inphase := 1.25*(P[4] - imult*P[2]) + imult*nz(inphase[3])
quadrature := P[2] - qmult*P + qmult*nz(quadrature[2])
re := 0.2*(inphase*inphase[1] + quadrature*quadrature[1]) + 0.8*nz(re[1])
im := 0.2*(inphase*quadrature[1] - inphase[1]*quadrature) + 0.8*nz(im[1])
if (re!= 0.0)
deltaIQ := atan(im/re)
for i=0 to range
V := V + deltaIQ[i]
if (V > 2*PI and instIQ == 0.0)
instIQ := i
if (instIQ == 0.0)
instIQ := nz(instIQ[1])
lenIQ := 0.25*instIQ + 0.75*nz(lenIQ[1])
//##############################################################################
//COSINE IFM
//#############################################################################
s2 = 0.0
s3 = 0.0
deltaC = 0.0
instC = 0.0
lenC = 0.0
v1 = 0.0
v2 = 0.0
v4 = 0.0
v1 := src - src[7]
s2 := 0.2*(v1[1] + v1)*(v1[1] + v1) + 0.8*nz(s2[1])
s3 := 0.2*(v1[1] - v1)*(v1[1] - v1) + 0.8*nz(s3[1])
if (s2 != 0)
v2 := sqrt(s3/s2)
if (s3 != 0)
deltaC := 2*atan(v2)
for i = 0 to range
v4 := v4 + deltaC[i]
if (v4 > 2*PI and instC == 0.0)
instC := i - 1
if (instC == 0.0)
instC := instC[1]
lenC := 0.25*instC + 0.75*nz(lenC[1])
if (adaptive == "Cos IFM")
Period := round(lenC)
if (adaptive == "I-Q IFM")
Period := round(lenIQ)
if (adaptive == "Average")
Period := round((lenC + lenIQ)/2)
//##############################################################################
//ZERO LAG EXPONENTIAL MOVING AVERAGE
//##############################################################################
LeastError = 1000000.0
EC = 0.0
Gain = 0.0
EMA = 0.0
Error = 0.0
BestGain = 0.0
alpha =2/(Period + 1)
EMA := alpha*src + (1-alpha)*nz(EMA[1])
for i = -GainLimit to GainLimit
Gain := i/10
EC := alpha*(EMA + Gain*(src - nz(EC[1]))) + (1 - alpha)*nz(EC[1])
Error := src - EC
if(abs(Error)<LeastError)
LeastError := abs(Error)
BestGain := Gain
EC := alpha*(EMA + BestGain*(src - nz(EC[1]))) + (1-alpha)*nz(EC[1])
plot(EC, title="EC", color=orange, linewidth=2)
plot(EMA, title="EMA", color=red, linewidth=2)
buy = crossover(EC,EMA) and 100*LeastError/src > Threshold
sell = crossunder(EC,EMA) and 100*LeastError/src > Threshold
strategy.initial_capital = 50000
if (time>timestamp(2016, 1, 1 , 0, 0))
//LONG
balance = strategy.initial_capital + strategy.netprofit
lots = ((risk * balance)/fixedSL)*1
strategy.entry("BUY", strategy.long, qty=lots, oca_name="BUY", when=buy)
strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP)
//SHORT
strategy.entry("SELL", strategy.short, qty=lots, oca_name="SELL", when=sell)
strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP)