
Die Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy ist eine quantitative Trading-Strategie, die auf dem Konzept des Zero Lag Exponential Moving Average von Ehlers basiert. Die Strategie verwendet den Index-Moving-Average als Basisindikator und fügt die Adaptionsmethode der Instantaneous Frequency Measurement hinzu, um die Perioden der Index-Moving-Average dynamisch zu optimieren.
Die Kernidee der Strategie stammt aus John Ehlers Theorie des Null-Lager-Filters. Der Index-Moving-Average ist zwar ein bekannter technischer Indikator, hat aber seine natürliche Problematik der Lagritude. Ehlers kann die Lagritude effektiv beseitigen, indem er einen Fehlerkorrekturfaktor in die Berechnungsformel des Index-Moving-Averages einfügt, wodurch der Index-Moving-Average mit Null-Lager-Lager-Average die Preisentwicklung empfindlicher verfolgen kann.
In der EMA-Strategie für die Anpassung an den Null-Lager-Zyklus nutzen wir die Methode der Instant-Frequenzmessung, um die Periodiparameter des Null-Lager-Index-Moving-Averages selbst anzupassen. Die Instant-Frequenzmessung ist in zwei Arten unterteilt: die Abstufungsmethode und die Positiv-Symmetrie, mit denen die vorherrschende Periode der Preisfolge-Veränderung gemessen werden kann. Wir verfolgen in Echtzeit die optimale Periode, die durch diese beiden Messmethoden berechnet wird, und setzen die Periodiparameter des Null-Lager-Index-Moving-Averages dynamisch fest, um sie besser an die aktuelle Marktumgebung anzupassen.
Wenn die schnelle Linie (Zero Lag Index Moving Average) über die langsame Linie (Normal Index Moving Average) geht, wird die Linie unterhalb der schnellen Linie frei gemacht, wodurch ein Handelsstrategie-Signal entsteht, das der Kreuzung des Moving Averages ähnelt.
Eine EMA-Strategie mit einer Kombination aus einem Zero-Lag-Filter und einer Anpassungs-Zyklus-Optimierung hat folgende Vorteile:
Eine EMA-Strategie zur Anpassung an die Null-Lager-Situation birgt auch Risiken, die sich in folgenden Punkten widerspiegeln:
Um diese Risiken zu kontrollieren, müssen wir die Parameter-Einstellungen in verschiedenen Marktumgebungen ausreichend testen, die Stop-Loss-Stopp-Punkte entsprechend anpassen und die Umgebung in der Rückmessung so gut wie möglich simulieren.
Die EMA-Strategie für die Anpassung an die Null-Lagerung bietet viel Optimierungsmöglichkeiten. Die wichtigsten Bereiche sind:
Durch diese Optimierungsmethoden wird erwartet, dass die Strategie ihre Gewinn- und Verlustraten, ihre Risikoverlagerungsindikatoren usw. weiter verbessern kann.
Die EMA-Strategie mit der erfolgreichen Kombination von Null-Zollager-Filter und der Idee der dynamischen Zyklusoptimierung ist eine quantitative Handelsstrategie mit weniger Parametern, die einfach zu bedienen und zu optimieren ist. Sie weist reaktionssensible, anpassungsfähige Eigenschaften auf und funktioniert besser in Trendmärkten. In Kombination mit geeigneten Stop-Loss- und Positionsmanagement-Methoden können sowohl die Stabilität als auch die 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)