Ehlers MESA Adaptive Moving Average Chiến lược giao dịch

Tác giả:ChaoZhang, Ngày: 2023-09-28 15:37:13
Tags:

Tổng quan

Chiến lược này dựa trên Đường trung bình chuyển động thích nghi Ehlers MESA và thiết kế một chiến lược giao dịch xu hướng theo dõi các chéo giữa hai đường trung bình chuyển động. Nó đi dài khi đường nhanh vượt qua trên đường chậm, và đi ngắn khi đường nhanh vượt qua dưới đường chậm. Đây là một chiến lược chéo trung bình chuyển động kép điển hình.

Chiến lược logic

Cốt lõi của chiến lược này là tính toán hai đường trung bình động thích nghi: đường MAMA và đường FAMA.

alpha = fl / dphase
alpha = iff(alpha < sl, sl, iff(alpha > fl, fl, alpha))  
mama = alpha*src + (1 - alpha)*nz(mama[1])

Trong đó fl là giới hạn nhanh, sl là giới hạn chậm, và dphase là sự khác biệt pha. Alpha điều chỉnh thích nghi dựa trên sự khác biệt pha để đạt được làm mịn thích nghi.

Dòng FAMA được tính như sau:

fama = .5*alpha*mama + (1 - .5*alpha)*nz(fama[1])

Dòng FAMA là một đường thông qua lọc thấp của đường MAMA.

Chiến lược so sánh mối quan hệ quy mô giữa các đường MAMA và FAMA để xác định xem thị trường hiện đang trong xu hướng tăng hay giảm, và tạo ra các tín hiệu giao dịch dựa trên điều này.

Phân tích lợi thế

Chiến lược có những lợi thế sau:

  1. Sử dụng các đường trung bình động thích nghi, trong đó các thông số tự động điều chỉnh dựa trên những thay đổi của thị trường, mà không cần các thông số cố định được thiết lập bằng tay.

  2. Dòng lọc FAMA có thể lọc ra các sự đột phá giả.

  3. Sử dụng một thiết kế trung bình động kép có thể theo dõi xu hướng trung bình đến dài hạn.

  4. Logic chiến lược đơn giản và rõ ràng dễ hiểu và sửa đổi.

  5. Các chỉ số trực quan hiển thị rõ các tín hiệu giao dịch.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Các chiến lược chéo hai đường có thể tạo ra các tín hiệu giao dịch quá mức, nên nên kiểm soát giảm và khoảng thời gian thích hợp.

  2. Tính toán MAMA và FAMA phức tạp, cài đặt tham số không đúng có thể gây ra biến dạng đường cong.

  3. Các thông số thích nghi có thể dẫn đến quá tải, cần xác minh với các chỉ số kỹ thuật khác.

  4. Các đường chéo hai đường có thời gian trễ, có thể bỏ lỡ các điểm chuyển hướng.

  5. Cần phải cảnh giác với rủi ro dừng lỗ từ các vụ phá vỡ sai.

Hướng dẫn tối ưu hóa

Chiến lược có thể được tối ưu hóa trong các lĩnh vực sau:

  1. Tối ưu hóa cài đặt tham số để tìm kết hợp giới hạn nhanh và giới hạn chậm tốt nhất.

  2. Thêm các chiến lược dừng lỗ để kiểm soát chặt chẽ mỗi giao dịch dừng lỗ.

  3. Thêm các chỉ số khác vào các tín hiệu lọc, chẳng hạn như MACD, RSI vv để tránh đột phá sai.

  4. Thêm các chỉ số đánh giá xu hướng để tránh giao dịch ngược xu hướng.

  5. Tối ưu hóa tốc độ nhập khẩu bằng cách điều chỉnh các yêu cầu chéo để giảm giao dịch quá thường xuyên.

  6. Tối ưu hóa chiến lược thu lợi nhuận theo sức mạnh của xu hướng.

  7. Kiểm tra sự khác biệt tham số giữa các sản phẩm khác nhau để tìm kết hợp tham số tối ưu.

Tóm lại

Nhìn chung, đây là một xu hướng điển hình sau chiến lược, sử dụng các trung bình động thích nghi của Ehlers MESA để xây dựng một chỉ số trực quan và tạo ra các tín hiệu giao dịch thông qua các đường chéo kép. Chiến lược có những lợi thế như các tham số thích nghi, lọc các đột phá sai và trực quan hóa, nhưng cũng có những rủi ro như thời gian trễ và giao dịch quá mức. Những cải tiến trong tương lai có thể được thực hiện thông qua tối ưu hóa tham số, chiến lược dừng lỗ, lọc tín hiệu v.v. để làm cho chiến lược mạnh mẽ hơn.


/*backtest
start: 2023-09-20 00:00:00
end: 2023-09-27 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// @author LazyBear 
// 
// List of my public indicators: http://bit.ly/1LQaPK8 
// List of my app-store indicators: http://blog.tradingview.com/?p=970 
//
strategy("Ehlers MESA Adaptive Moving Average [LazyBear with ekoronin fix]", shorttitle="EMAMA_LB (ekoronin fix)", overlay=false, calc_on_every_tick=true, precision=0)
src=input(close, title="Source")
fl=input(.4, title="Fast Limit")
sl=input(.04, title="Slow Limit")
pi = 3.1415926
sp = (4*src + 3*src[1] + 2*src[2] + src[3]) / 10.0
dt = (.0962*sp + .5769*nz(sp[2]) - .5769*nz(sp[4])- .0962*nz(sp[6]))*(.075*nz(p[1]) + .54)
q1 = (.0962*dt + .5769*nz(dt[2]) - .5769*nz(dt[4])- .0962*nz(dt[6]))*(.075*nz(p[1]) + .54)
i1 = nz(dt[3])
jI = (.0962*i1 + .5769*nz(i1[2]) - .5769*nz(i1[4])- .0962*nz(i1[6]))*(.075*nz(p[1]) + .54)
jq = (.0962*q1 + .5769*nz(q1[2]) - .5769*nz(q1[4])- .0962*nz(q1[6]))*(.075*nz(p[1]) + .54)
i2_ = i1 - jq
q2_ = q1 + jI
i2 = .2*i2_ + .8*nz(i2[1])
q2 = .2*q2_ + .8*nz(q2[1])
re_ = i2*nz(i2[1]) + q2*nz(q2[1])
im_ = i2*nz(q2[1]) - q2*nz(i2[1])
re = .2*re_ + .8*nz(re[1])
im = .2*im_ + .8*nz(im[1])
//p1 = iff(im!=0 and re!=0, 360/atan(im/re), nz(p[1]))
p1 = iff(im!=0 and re!=0, 2*pi/atan(im/re), nz(p[1]))
p2 = iff(p1 > 1.5*nz(p1[1]), 1.5*nz(p1[1]), iff(p1 < 0.67*nz(p1[1]), 0.67*nz(p1[1]), p1))
p3 = iff(p2<6, 6, iff (p2 > 50, 50, p2))
p = .2*p3 + .8*nz(p3[1])
spp = .33*p + .67*nz(spp[1])
//phase = atan(q1 / i1)
phase = 180/pi * atan(q1 / i1) 
dphase_ = nz(phase[1]) - phase
dphase = iff(dphase_< 1, 1, dphase_)
alpha_ = fl / dphase
alpha = iff(alpha_ < sl, sl, iff(alpha_ > fl, fl, alpha_))
mama = alpha*src + (1 - alpha)*nz(mama[1])
fama = .5*alpha*mama + (1 - .5*alpha)*nz(fama[1])
//pa=input(false, title="Mark crossover points")
//plotarrow(pa?(cross(mama, fama)?mama<fama?-1:1:na):na, title="Crossover Markers")
//fr=input(false, title="Fill MAMA/FAMA Region")
//duml=plot(fr?(mama>fama?mama:fama):na, style=circles, color=gray, linewidth=0, title="DummyL")
//mamal=plot(mama, title="MAMA", color=red, linewidth=2)
//famal=plot(fama, title="FAMA", color=green, linewidth=2)
//fill(duml, mamal, red, transp=70, title="NegativeFill")
//fill(duml, famal, green, transp=70, title="PositiveFill")
//ebc=input(false, title="Enable Bar colors")
//bc=mama>fama?lime:red
//barcolor(ebc?bc:na)

longSpike=mama>fama? 1:0
shortSpike=mama<fama? 1:0

plot(longSpike, title = "Mama Long", style=line, linewidth=1, color=yellow)
plot(shortSpike, title = "Mama Short", style=line, linewidth=1, color=red)

//possig = iff(reverse and pos == 1, -1,
//          iff(reverse and pos == -1, 1, pos))	   
if (longSpike) 
    strategy.entry("Long", strategy.long)
if (shortSpike)
    strategy.entry("Short", strategy.short)	


Thêm nữa