Die Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy ist eine Quantitative Trading Strategie, die auf der Grundlage von Ehlers' Ideen des Zero Lag Exponential Moving Average entwickelt wurde. Die Strategie verwendet die Index-Moving Average als Basisindikator und fügt eine adaptive Methode der Instantaneous Frequency Measurement hinzu, um die Periodenparameter der Index-Moving Average zu optimieren.
Der Kerngedanke der Strategie stammt aus John Ehlers' Theorie des Filters mit nuller Verzögerung. Die bewegliche Index-Durchschnittslinie ist zwar ein bekannter technischer Indikator, hat aber Probleme mit Verzögerung. Durch die Einführung eines Fehlerkorrekturfaktors in die Berechnungsformel der beweglichen Index-Durchschnittslinie kann die Verzögerung effektiv beseitigt werden und die beweglichen Index-Durchschnittslinien mit nuller Verzögerung die Preisbewegung sensibler verfolgen können.
In der Adaptive Zero-Lack-EMA-Strategie passen wir die Periodenparameter der beweglichen Durchschnittslinie des Null-Lack-Index mit der Methode der Instant Frequency-Messung an. Die Instant Frequency-Messung ist in zwei Arten aufgeteilt: Stringmethode und Orthographie, die die dominierenden Perioden der Veränderungen der Preissequenz messen. Wir verfolgen die optimalen Perioden, die mit diesen beiden Methoden in Echtzeit berechnet werden, und setzen dynamisch die Periodenparameter der beweglichen Durchschnittslinie des Null-Lack-Index ein, um sie dem aktuellen Marktumfeld besser anzupassen.
Wenn die schnelle Linie (Zero-Lack-Index-Bewegungsgleichlinie) mehr als die langsame Linie (Normal-Index-Bewegungsgleichlinie) durchläuft, wird die untere Linie leer, was ein Handelsstrategie-Signal bildet, das ähnlich wie die Kreuzung der beweglichen Durchschnitte ist.
Die Adaptive-Zero-Lack-EMA-Strategie kombiniert Filter mit Zero-Lack-Filter und Adaptive-Zyklus-Optimierung mit folgenden Vorteilen:
Es besteht auch ein gewisses Risiko, sich an die Strategie der EMA mit Nullverzögerung anzupassen, vor allem durch:
Um diese Risiken zu kontrollieren, müssen wir die Parameter-Einstellungen in verschiedenen Marktumgebungen ausreichend testen, die Stop-Loss-Schlusspunkte angemessen anpassen und im Rücktest so gut wie möglich simulieren, um die reale Umgebung zu simulieren.
Die EMA-Strategie für die Anpassung an die Null-Stillstands-Ema-Strategie hat noch viel Optimierungsmöglichkeiten.
Durch diese Optimierungsmethoden können Sie die Gewinnquote, die Profitabilität, die Risikobereinigungsindikatoren usw. weiter verbessern.
Die Adaptive Zero-Lack-EMA-Strategie, die sich erfolgreich mit einer Kombination von Zero-Lack-Filtern und Dynamic-Cycle-Optimierung auswirkt, ist eine weniger parametrische, einfach zu bedienende und optimierte, quantitative Handelsstrategie. Sie ist reaktionsempfindlich und anpassungsfähig und funktioniert besser in Trendsmärkten. Mit geeigneten Stop-Loss- und Positionsmanagementmitteln können ihre Stabilität und Profitabilität verbessert werden.
/*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)