Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy adalah strategi perdagangan kuantitatif yang dikembangkan berdasarkan gagasan John Ehlers tentang Zero Lag Exponential Moving Average (ZLEMA). Strategi ini menggunakan rata-rata bergerak eksponensial sebagai indikator dasar dan menggabungkan metode adaptif Pengukuran Frekuensi Instan (IFM) untuk secara dinamis mengoptimalkan parameter periode rata-rata bergerak eksponensial.
Ide inti dari strategi ini berasal dari teori John Ehlers tentang filter lag nol. Meskipun rata-rata bergerak eksponensial adalah indikator teknis yang dikenal luas, secara inheren memiliki masalah lag. Ehlers memperkenalkan faktor koreksi kesalahan dalam rumus perhitungan rata-rata bergerak eksponensial untuk secara efektif menghilangkan fenomena lag, membuat EMA Zero Lag lebih sensitif dalam melacak perubahan harga.
Dalam strategi Adaptive Zero Lag EMA, kami memanfaatkan metode pengukuran frekuensi instan untuk mengoptimalkan parameter periode ZLEMA secara adaptif. IFM terdiri dari dua teknik - metode Cosine dan metode Inphase-Quadrature, yang dapat mengukur siklus dominasi osilasi harga. Dengan melacak periode optimal yang dihitung oleh dua pengukuran ini secara real-time, kami secara dinamis mengatur parameter periode ZLEMA agar lebih sesuai dengan kondisi pasar saat ini.
Ketika EMA cepat (ZLEMA) melintasi EMA lambat dari bawah, sinyal panjang dihasilkan. Ketika EMA cepat melintasi EMA lambat, sinyal pendek dipicu. Ini membentuk strategi perdagangan yang mirip dengan sistem crossover rata-rata bergerak.
Strategi EMA Adaptive Zero Lag menggabungkan filter zero lag dan optimalisasi periode adaptif, dengan keuntungan berikut:
Ada juga beberapa risiko dalam strategi ini:
Untuk mengendalikan risiko ini, kita perlu menguji secara lengkap parameter di berbagai kondisi pasar, menyesuaikan SL/TP dengan benar, dan mensimulasikan lingkungan perdagangan langsung dalam backtest.
Masih banyak ruang untuk lebih mengoptimalkan strategi ini:
Melalui cara optimasi ini, ada potensi untuk meningkatkan tingkat kemenangan, profitabilitas, metrik yang disesuaikan dengan risiko strategi.
Strategi Adaptive Zero Lag EMA berhasil menggabungkan filter zero lag dan optimasi periode dinamis. Dengan lebih sedikit parameter dan mudah dioperasikan, strategi ini sangat cocok untuk pasar tren. Bersama dengan stop loss yang tepat, ukuran posisi dan teknik manajemen risiko lainnya, stabilitas dan profitabilitasnya dapat ditingkatkan lebih lanjut. Masih ada potensi yang luas untuk mengoptimalkan strategi ini untuk kinerja 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)