
La stratégie de trading quantitative Adaptive Zero Lag Exponential Moving Average est une stratégie de trading quantitative développée à partir de l’idée de la Zéro Lag Exponential Moving Average d’Ehlers. La stratégie utilise la moyenne mobile indicielle comme indicateur de base et ajoute la méthode d’adaptation Instantaneous Frequency Measurement pour optimiser dynamiquement la périodicité de la moyenne mobile indicielle.
L’idée centrale de cette stratégie est tirée de la théorie des filtres à zéro retard de John Ehlers. L’indice des moyennes mobiles, bien qu’étant un indicateur technique bien connu, est intrinsèquement sujet à des problèmes de retard. Ehlers a pu éliminer efficacement le retard en ajoutant un facteur de correction d’erreur dans la formule de calcul de l’indice des moyennes mobiles, permettant ainsi à l’indice des moyennes mobiles à zéro retard de suivre les variations de prix avec plus de sensibilité.
Dans la stratégie EMA à zéro retard adaptatif, nous utilisons la méthode de mesure de la fréquence en temps réel pour optimiser les paramètres cycliques des moyennes mobiles de l’indice à zéro retard. La mesure de la fréquence en temps réel est divisée en deux types, la méthode de la corde arrière et la méthode de la symétrie positive, qui permettent de mesurer les cycles dominants de la variation de la séquence de prix. Nous suivons en temps réel les meilleurs cycles calculés par ces deux méthodes de mesure et définissons dynamiquement les paramètres cycliques de l’indice à zéro retard, ce qui les rend plus adaptés à l’environnement actuel du marché.
Lorsque la ligne rapide (la moyenne mobile de l’indice zéro retardé) traverse la ligne lente (la moyenne mobile de l’indice ordinaire), faites plus et faites moins lorsque vous traversez, ce qui forme un signal de stratégie de négociation similaire à la croisée des moyennes mobiles.
La stratégie EMA auto-adaptative à zéro décalage combine un filtre à zéro décalage et une approche d’optimisation du cycle auto-adaptatif, avec les avantages suivants:
Les stratégies d’adaptation à l’EMA à zéro retard présentent également des risques, principalement:
Pour maîtriser ces risques, il est nécessaire de bien tester les paramètres de réglage dans différents environnements de marché, d’ajuster les points d’arrêt et de stop-loss de manière appropriée, et de bien vérifier les environnements physiques simulés dans la rétroanalyse.
La stratégie EMA pour l’adaptation au retard zéro a une large marge d’optimisation, les principales directions étant les suivantes:
Grâce à ces outils d’optimisation, il est possible d’améliorer encore le taux de réussite, le taux de gain, les indicateurs d’ajustement au risque, etc. de la stratégie.
La stratégie EMA auto-adaptative à zéro décalage, combinant avec succès les filtres à zéro décalage et l’idée d’optimisation du cycle dynamique, est une stratégie de trading quantitatif à moins de paramètres, facile à utiliser et à optimiser. Elle présente des caractéristiques de sensibilité à la réponse, d’adaptabilité et de bonne performance dans les marchés tendanciels.
/*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)