
Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy là một chiến lược giao dịch định lượng được phát triển dựa trên tư tưởng ZERO LAG EXPONENTIAL MOVING AVERAGE của Ehlers. Chiến lược này sử dụng chỉ số trung bình di chuyển như một chỉ số cơ bản và thêm vào các tham số chu kỳ của chỉ số di chuyển theo phương pháp thích ứng của đo tần số tức thời.
Ý tưởng cốt lõi của chiến lược này bắt nguồn từ lý thuyết bộ lọc trễ không của John Ehlers. Mặc dù chỉ số trung bình di chuyển chỉ số là một chỉ số kỹ thuật được biết đến rộng rãi, nhưng nó có vấn đề về độ trễ. Bằng cách thêm một yếu tố điều chỉnh lỗi vào công thức tính toán của chỉ số trung bình di chuyển, Ehlers có thể loại bỏ hiệu quả sự trễ, làm cho chỉ số trung bình di chuyển chỉ số trễ không có thể theo dõi sự thay đổi giá một cách nhạy cảm hơn.
Trong chiến lược EMA tự điều chỉnh, chúng tôi sử dụng phương pháp đo tần số tức thời để tự điều chỉnh các tham số chu kỳ của chỉ số di chuyển trung bình với độ trễ bằng không. Đo tần số tức thời được phân thành hai phương pháp chốt và giao tiếp chính, có thể đo chu kỳ thống trị của sự thay đổi chuỗi giá. Chúng tôi theo dõi các chu kỳ tốt nhất được tính toán bởi hai phương pháp đo lường này trong thời gian thực, động thiết lập các tham số chu kỳ của chỉ số di chuyển trung bình với độ trễ bằng không, để phù hợp hơn với môi trường thị trường hiện tại.
Khi đường nhanh (trên đường trung bình di chuyển của chỉ số 0) đi qua đường chậm (trên đường trung bình di chuyển của chỉ số thông thường), làm nhiều khi đi qua, làm rỗng khi đi xuống, do đó tạo ra một tín hiệu chiến lược giao dịch tương tự như đường trung bình di chuyển.
Chiến lược EMA tự điều chỉnh với độ trễ không kết hợp bộ lọc không trễ và phương pháp tối ưu hóa chu kỳ tự điều chỉnh với các ưu điểm sau:
Các chiến lược EMA tự điều chỉnh với độ trễ bằng không cũng có một số rủi ro, đặc biệt là:
Để kiểm soát những rủi ro này, chúng tôi cần kiểm tra đầy đủ các thiết lập tham số trong các môi trường thị trường khác nhau, điều chỉnh điểm dừng lỗ thích hợp và xác minh đầy đủ các môi trường thực tế mô phỏng trong phản hồi.
Chiến lược EMA tự điều chỉnh với độ chậm trễ bằng không có nhiều khả năng tối ưu hóa, bao gồm:
Những phương pháp tối ưu hóa này có thể giúp cải thiện hơn nữa tỷ lệ chiến thắng, tỷ lệ lợi nhuận, chỉ số điều chỉnh rủi ro của chiến lược.
Chiến lược EMA tự thích ứng với độ trễ không kết hợp thành công với bộ lọc trễ không và ý tưởng tối ưu hóa chu kỳ động, là một chiến lược giao dịch định lượng ít tham số, dễ vận hành và tối ưu hóa. Nó có tính năng nhạy cảm, tự thích ứng, hoạt động tốt trong thị trường xu hướng.
/*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)