A estratégia de negociação quantitativa de média móvel exponencial de atraso zero adaptativa é uma estratégia de negociação quantitativa desenvolvida com base na ideia de John Ehlers de média móvel exponencial de atraso zero (ZLEMA). Esta estratégia usa a média móvel exponencial como indicador de base e incorpora um método adaptativo de medição de frequência instantânea (IFM) para otimizar dinamicamente o parâmetro de período da média móvel exponencial.
A ideia central desta estratégia se origina da teoria de filtros de atraso zero de John Ehlers. Embora a média móvel exponencial seja um indicador técnico amplamente conhecido, ela tem inerentemente o problema do atraso. Ehlers introduz um fator de correção de erro na fórmula de cálculo da média móvel exponencial para eliminar efetivamente o fenômeno do atraso, tornando a EMA de atraso zero mais sensível no rastreamento de mudanças de preço.
Na estratégia Adaptive Zero Lag EMA, utilizamos os métodos de medição de frequência instantânea para otimizar de forma adaptativa o parâmetro de período do ZLEMA. O IFM consiste em duas técnicas - o método Cosine e o método Inphase-Quadrature, que podem medir o ciclo dominante da oscilação de preços. Ao rastrear em tempo real os períodos ideais calculados por essas duas medições, definimos dinamicamente o parâmetro de período do ZLEMA para se adequar melhor à condição atual do mercado.
Quando a EMA rápida (ZLEMA) cruza a EMA lenta de baixo, um sinal longo é gerado. Quando a EMA rápida cruza abaixo da EMA lenta, um sinal curto é acionado. Isso forma uma estratégia de negociação semelhante ao sistema de cruzamento da média móvel.
A estratégia Adaptive Zero Lag EMA combina o filtro de atraso zero e a otimização do período adaptativo, com as seguintes vantagens:
Esta estratégia apresenta também alguns riscos:
Para controlar esses riscos, precisamos testar completamente os parâmetros em diferentes condições de mercado, ajustar o SL/TP adequadamente e simular o ambiente de negociação ao vivo em backtests.
Ainda há muito espaço para otimizar ainda mais esta estratégia:
Através destes meios de otimização, há potencial para melhorar ainda mais a taxa de vitória, rentabilidade, métricas ajustadas ao risco da estratégia.
A estratégia Adaptive Zero Lag EMA combina com sucesso o filtro de atraso zero e a otimização de período dinâmico. Com menos parâmetros e fácil de operar, é especialmente adequada para mercados de tendência. Juntamente com o stop loss adequado, o dimensionamento da posição e outras técnicas de gerenciamento de risco, sua estabilidade e lucratividade podem ser ainda melhoradas.
/*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)