Die Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy ist eine quantitative Handelsstrategie, die auf der Grundlage der Idee von John Ehlers von Zero Lag Exponential Moving Average (ZLEMA) entwickelt wurde.
Die Kernidee dieser Strategie stammt aus der Theorie von John Ehlers über Nullverzögerungsfilter. Obwohl der exponentielle gleitende Durchschnitt ein weithin bekannter technischer Indikator ist, hat er inhärent das Problem der Verzögerung. Ehlers führt einen Fehlerkorrekturfaktor in die Berechnungsformel des exponentiellen gleitenden Durchschnitts ein, um das Verzögerungsphänomen effektiv zu beseitigen, wodurch die Nullverzögerung EMA empfindlicher bei der Verfolgung von Preisänderungen wird.
In der Adaptive Zero Lag EMA-Strategie nutzen wir die sofortigen Frequenzmessmethoden, um den Periodenparameter des ZLEMA anpassungsfähig zu optimieren. Der IFM besteht aus zwei Techniken - der Kosin-Methode und der Inphase-Quadratur-Methode, die den dominierenden Zyklus der Preisschwankung messen kann. Durch die Echtzeitverfolgung der durch diese beiden Messungen berechneten optimalen Perioden setzen wir den Periodenparameter des ZLEMA dynamisch so ein, dass er besser zu den aktuellen Marktbedingungen passt.
Wenn die schnelle EMA (ZLEMA) die langsame EMA von unten überschreitet, wird ein langes Signal erzeugt. Wenn die schnelle EMA unter die langsame EMA überschreitet, wird ein kurzes Signal ausgelöst. Dies bildet eine Handelsstrategie, die dem gleitenden Durchschnitts-Crossover-System ähnelt.
Die Adaptive Zero Lag EMA-Strategie kombiniert den Null-Lag-Filter und die Adaptive Period-Optimierung mit folgenden Vorteilen:
Diese Strategie birgt auch einige Risiken:
Um diese Risiken zu kontrollieren, müssen wir die Parameter unter verschiedenen Marktbedingungen vollständig testen, die SL/TP ordnungsgemäß anpassen und die Live-Handelsumgebung im Rahmen von Backtests simulieren.
Es gibt noch viel Raum für eine weitere Optimierung dieser Strategie:
Durch diese Optimierungsmittel besteht das Potenzial, die Gewinnrate, die Rentabilität und die risikobereinigten Kennzahlen der Strategie weiter zu verbessern.
Die Adaptive Zero Lag EMA-Strategie kombiniert erfolgreich den Null-Lag-Filter und die dynamische Periodenoptimierung. Mit weniger Parametern und einfach zu bedienen, ist sie besonders für Trendmärkte geeignet. Zusammen mit einem ordnungsgemäßen Stop-Loss, Positionsgrößen und anderen Risikomanagementtechniken können ihre Stabilität und Rentabilität weiter verbessert werden. Es besteht weiterhin ein großes Potenzial, diese Strategie für eine noch bessere Performance zu optimieren.
/*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)