La stratégie de négociation quantitative adaptative à zéro lag exponentiel est une stratégie de négociation quantitative développée sur la base de l'idée d'Ehlers d'une moyenne mobile exponentielle à zéro lag. La stratégie utilise une moyenne mobile indicielle comme indicateur de base et ajoute une méthode d'adaptation de mesure instantanée de fréquence pour optimiser les paramètres de cycle de la moyenne mobile de l'indice.
L'idée centrale de la stratégie est tirée de la théorie du filtre à retardement zéro de John Ehlers. Bien qu'une moyenne mobile indicielle soit un indicateur technique bien connu, il y a un problème de retardement inhérent. Ehlers élimine efficacement le retard en ajoutant un facteur de correction d'erreur dans la formule de calcul de la moyenne mobile indicielle, ce qui permet à la moyenne mobile indicielle à retardement zéro de suivre plus sensiblement les changements de prix.
Dans la stratégie EMA adaptative à zéro décalage, nous utilisons une méthode de mesure de fréquence instantanée pour optimiser les paramètres cycliques des moyennes mobiles de l'indice à zéro décalage. La mesure de fréquence instantanée est divisée en deux méthodes, la méthode des conjonctions et la méthode de la symétrie orthogonale, qui permettent de mesurer les cycles dominants des variations 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 nous définissons dynamiquement les paramètres cycliques des moyennes mobiles de l'indice à zéro décalage, ce qui les rend plus adaptés à l'environnement du marché actuel.
Lorsque la ligne rapide (l'indice de décalage zéro moyenne mobile) traverse la ligne lente (l'indice de décalage ordinaire moyenne mobile) plus longtemps, la ligne inférieure est vide, ce qui forme un signal de stratégie de trading similaire à celui de l'intersection d'une moyenne mobile.
La stratégie d'EMA à retardement zéro d'adaptation combine un filtre à retardement zéro et une méthode d'optimisation du cycle d'adaptation avec les avantages suivants:
Il existe également des risques liés à l'adaptation à la stratégie EMA à retard zéro, principalement:
Pour contrôler ces risques, nous devons tester pleinement les paramètres de paramètres dans différents environnements du marché, ajuster les points de rupture appropriés et vérifier pleinement les simulations de l'environnement de marché dans le retrait.
L'adaptation à la stratégie de l'EMA à retard zéro laisse encore beaucoup de place à l'optimisation, notamment en ce qui concerne:
Ces moyens d'optimisation permettent d'améliorer encore le taux de réussite, le taux de rentabilité, les indicateurs d'ajustement au risque, etc.
L'idée d'une stratégie EMA adaptative à zéro décalage, qui combine avec succès un filtre zéro décalage et une optimisation des cycles dynamiques, est une stratégie de trading quantifiée avec moins de paramètres, facile à utiliser et à optimiser. Elle présente des caractéristiques de sensibilité et de forte adaptabilité, et fonctionne mieux sur les marchés tendance. Avec des moyens de gestion des pertes et des positions appropriés, sa stabilité et sa rentabilité peuvent être améliorées.
/*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)