Strategi Dagangan Kuantitatif Purata Bergerak Eksponensial Zero Lag adalah strategi perdagangan kuantitatif yang dibangunkan berdasarkan idea John Ehlers tentang Purata Bergerak Eksponensial Zero Lag (ZLEMA). Strategi ini menggunakan purata bergerak eksponensial sebagai penunjuk asas dan menggabungkan kaedah pengukuran frekuensi segera (IFM) adaptif untuk mengoptimumkan parameter tempoh purata bergerak eksponensial secara dinamik.
Idea teras strategi ini berasal dari teori John Ehlers tentang penapis lag sifar. Walaupun purata bergerak eksponensial adalah penunjuk teknikal yang diketahui secara meluas, ia secara semula jadi mempunyai masalah kelewatan. Ehlers memperkenalkan faktor pembetulan ralat dalam formula pengiraan purata bergerak eksponensial untuk menghilangkan fenomena kelewatan secara berkesan, menjadikan EMA Zero Lag lebih sensitif dalam mengesan perubahan harga.
Dalam strategi Adaptive Zero Lag EMA, kami menggunakan kaedah pengukuran frekuensi serta-merta untuk mengoptimumkan parameter tempoh ZLEMA secara adaptif. IFM terdiri daripada dua teknik - kaedah Cosine dan kaedah Inphase-Quadrature, yang dapat mengukur kitaran dominasi osilasi harga. Dengan mengesan masa nyata tempoh optimum yang dikira oleh kedua-dua pengukuran ini, kami secara dinamik menetapkan parameter tempoh ZLEMA untuk lebih sesuai dengan keadaan pasaran semasa.
Apabila EMA pantas (ZLEMA) melintasi EMA perlahan dari bawah, isyarat panjang dihasilkan. Apabila EMA pantas melintasi di bawah EMA perlahan, isyarat pendek dicetuskan. Ini membentuk strategi perdagangan yang serupa dengan sistem persilangan purata bergerak.
Strategi EMA Zero Lag Adaptif menggabungkan penapis zero lag dan pengoptimuman tempoh adaptif, dengan kelebihan berikut:
Terdapat juga beberapa risiko dalam strategi ini:
Untuk mengawal risiko ini, kita perlu menguji sepenuhnya parameter dalam keadaan pasaran yang berbeza, menyesuaikan SL / TP dengan betul, dan mensimulasikan persekitaran perdagangan langsung dalam backtests.
Masih banyak ruang untuk mengoptimumkan lagi strategi ini:
Melalui cara pengoptimuman ini, terdapat potensi untuk meningkatkan lagi kadar kemenangan, keuntungan, metrik yang disesuaikan dengan risiko strategi.
Adaptive Zero Lag EMA strategi berjaya menggabungkan penapis zero lag dan pengoptimuman tempoh dinamik. Dengan lebih sedikit parameter dan mudah dikendalikan, ia sangat sesuai untuk pasaran trend. Bersama-sama dengan kerugian berhenti yang betul, saiz kedudukan dan teknik pengurusan risiko lain, kestabilan dan keuntungan dapat ditingkatkan lagi. Masih ada potensi yang luas untuk mengoptimumkan strategi ini untuk prestasi yang lebih baik.
/*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)