Chiến lược giao dịch dựa trên đường trung bình động thích ứng Ehlers MESA


Ngày tạo: 2023-09-28 15:37:13 sửa đổi lần cuối: 2023-09-28 15:37:13
sao chép: 0 Số nhấp chuột: 1229
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này dựa trên phương pháp chuyển động thích ứng của Ehlers MESA, được thiết kế để theo dõi hai đường trung bình giao nhau. Chiến lược giao dịch theo xu hướng này là một chiến lược giao dịch hai đường trung bình giao nhau: làm nhiều khi đi qua đường chậm trên đường nhanh và trống khi đi qua đường chậm dưới đường nhanh.

Nguyên tắc chiến lược

Cốt lõi của chiến lược này là tính toán hai đường trung bình di chuyển thích ứng: đường MAMA và đường FAMA. Trong đó, công thức tính toán đường MAMA như sau:

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, dphase là chênh lệch pha. alpha được điều chỉnh động theo chênh lệch pha, để thực hiện tham số mài mòn thích ứng.

Công thức tính FAMA là:

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

Đường FAMA là đường phẳng sóng thấp của đường MAMA.

Chiến lược này tạo ra tín hiệu giao dịch bằng cách so sánh mối quan hệ kích thước giữa đường MAMA và đường FAMA để xác định hiện tại có xu hướng tăng hay giảm.

Phân tích lợi thế chiến lược

Chiến lược này có một số ưu điểm:

  1. Sử dụng trung bình di chuyển thích ứng, các tham số sẽ tự động điều chỉnh theo sự thay đổi của thị trường, không cần thiết phải thiết lập các tham số cố định.

  2. Thêm dây lọc FAMA thấp, có thể lọc sự đột phá giả.

  3. Sử dụng thiết kế trung bình di chuyển kép, có thể theo dõi xu hướng đường dài trong thị trường.

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

  5. Chỉ số trực quan, có thể nhìn thấy 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. Chiến lược giao chéo hai dòng dễ tạo ra nhiều tín hiệu giao dịch, nên kiểm soát khoảng cách và rút lui thích hợp.

  2. Các đường MAMA và FAMA rất phức tạp, và các tham số không được thiết lập đúng có thể dẫn đến biến dạng đường cong.

  3. Các tham số thích ứng có thể dẫn đến quá trình tối ưu hóa, cần phải được xác minh kết hợp với các chỉ số kỹ thuật khác.

  4. Bi-line crossover có sự chậm trễ về thời gian, có thể bỏ lỡ điểm chuyển hướng.

  5. Cần chú ý đến nguy cơ mất mát do phá vỡ giả.

Hướng tối ưu hóa chiến lược

Chiến lược này có thể được tối ưu hóa theo các hướng sau:

  1. Tối ưu hóa các thiết lập tham số, tìm ra sự kết hợp tốt nhất của các tham số giới hạn nhanh và chậm.

  2. Tăng chiến lược dừng lỗ, kiểm soát chặt chẽ lỗ hổng đơn.

  3. Kết hợp với các tín hiệu lọc của các chỉ số khác, chẳng hạn như MACD, RSI, v.v., để tránh phá vỡ giả.

  4. Tăng các chỉ số đánh giá xu hướng, tránh giao dịch ngược.

  5. Tối ưu hóa nhịp điệu nhập cảnh, điều chỉnh yêu cầu khoảng cách giữa các giao dịch song song, giảm giao dịch quá thường xuyên.

  6. Tối ưu hóa chiến lược dừng, sử dụng các cách dừng khác nhau tùy theo cường độ của xu hướng.

  7. Kiểm tra sự khác biệt trong các thiết lập tham số của các giống khác nhau để tìm kiếm sự kết hợp tham số tốt nhất.

Tóm tắt

Chiến lược này là một chiến lược theo dõi xu hướng điển hình, sử dụng Ehlers MESA Adaptive Moving Average để xây dựng một chỉ số trực quan và tạo ra tín hiệu giao dịch theo cách chéo hai đường. Chiến lược có các lợi thế như tùy biến tự điều chỉnh, phá vỡ giả mạo, hiển thị, nhưng cũng có rủi ro sau thời gian trễ, giao dịch nhiều lần.

Mã nguồn chiến lược
/*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)