Chiến lược Breakout xu hướng MA kép là một chiến lược giao dịch định lượng sử dụng hai trung bình động của các giai đoạn khác nhau để xác định xu hướng và tạo ra tín hiệu nhập cảnh. Nó chủ yếu đánh giá hướng xu hướng tổng thể thông qua MA chậm và sử dụng MA nhanh để lọc nhập cảnh. Khi hướng của xu hướng khung thời gian lớn hơn là phù hợp, nó chọn thanh đảo để nhập, để theo đuổi tỷ lệ thắng và lợi nhuận cao hơn.
Chiến lược bao gồm các phần chính sau:
Đánh giá xu hướng: Tính toán MA 21 giai đoạn, được định nghĩa là MA chậm. Vị trí của nó tương đối ổn định và có thể được sử dụng để đánh giá hướng xu hướng tổng thể. Khi giá tăng gần MA này, đó là xu hướng tăng. Khi giá giảm gần MA này, đó là xu hướng giảm.
Việc lọc mục nhập: Tính toán MA 5 giai đoạn, được định nghĩa là MA nhanh. Chỉ khi giá vượt qua cả MA chậm và MA nhanh, tín hiệu giao dịch được kích hoạt. Thiết kế này chủ yếu lọc thêm khả năng phá vỡ sai.
Bộ lọc nến: Chiến lược chỉ đi dài khi nến hiện tại giảm, hoặc đi ngắn khi nến hiện tại tăng. Điều này xem xét rằng sử dụng thanh đảo để vào có thể đạt được tỷ lệ thành công cao hơn. Nó cũng kết hợp chỉ số RSI nhanh để tránh bước vào các khu vực mua quá mức hoặc bán quá mức.
Bộ lọc kim tự tháp: Đối với thị trường tiền điện tử, chiến lược bổ sung bao gồm một điều kiện đột phá biến động gấp ba để nắm bắt các cơ hội bán quá mức trong xu hướng giảm đáng kể.
Dừng Loss: Chiến lược hỗ trợ dừng lỗ di chuyển. Sau khi mở các vị trí, mức dừng lỗ sẽ được cập nhật trong thời gian thực dựa trên tỷ lệ phần trăm đã thiết lập.
Những lợi thế của chiến lược này bao gồm:
Chiến lược này cũng có một số rủi ro:
Để đối phó với những rủi ro này, tối ưu hóa có thể được thực hiện trong các khía cạnh sau:
Các khía cạnh chính để tối ưu hóa chiến lược này bao gồm:
Tối ưu hóa tham số: Kiểm tra hệ thống để tìm kết hợp thời gian MA nhanh và chậm tối ưu để cải thiện lợi nhuận điều chỉnh rủi ro.
Nhận dạng mô hình: Thêm các chỉ số khác như KDJ, MACD để xác định các tín hiệu đảo ngược đáng tin cậy hơn.
Dừng Loss Optimization: Phát triển các thuật toán dừng lỗ nổi hoặc kéo theo để giảm nguy cơ bị dừng lại.
Học máy: Thu thập và gắn nhãn nhiều dữ liệu lịch sử hơn để tự động tạo các quy tắc giao dịch bằng ML.
Định kích thước vị trí: Điều chỉnh động kích thước vị trí dựa trên điều kiện thị trường.
Dual MA Trend Breakout Strategy thường là một chiến lược theo xu hướng đơn giản và thực tế. So với các thuật toán máy học phức tạp, chiến lược này dễ hiểu và nắm vững hơn, với độ tin cậy cao hơn. Với điều chỉnh tham số, mở rộng tính năng và tăng cường ML, chiến lược này có tiềm năng cải thiện rất lớn và là điểm khởi đầu tuyệt vời cho giao dịch định lượng.
/*backtest start: 2023-12-31 00:00:00 end: 2024-01-07 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy(title = "Noro's Trend MAs Strategy v2.0 +CB", shorttitle = "Trend MAs str 2.0", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=100.0, pyramiding=0) //Settings needlong = input(true, "long") needshort = input(true, "short") needstops = input(false, "stops") stoppercent = input(5, defval = 5, minval = 1, maxval = 50, title = "Stop, %") useohlc4 = input(false, defval = false, title = "Use OHLC4") usefastsma = input(true, "Use fast MA Filter") fastlen = input(5, defval = 5, minval = 1, maxval = 50, title = "fast MA Period") slowlen = input(21, defval = 20, minval = 2, maxval = 200, title = "slow MA Period") bars = input(2, defval = 2, minval = 0, maxval = 3, title = "Bars Q") needbg = input(false, defval = false, title = "Need trend Background?") needarr = input(false, defval = false, title = "Need entry arrows?") needex = input(true, defval = true, title = "Need extreme? (crypto/fiat only!!!)") src = useohlc4 == true ? ohlc4 : close //PriceChannel 1 lasthigh = highest(src, slowlen) lastlow = lowest(src, slowlen) center = (lasthigh + lastlow) / 2 //PriceChannel 2 lasthigh2 = highest(src, fastlen) lastlow2 = lowest(src, fastlen) center2 = (lasthigh2 + lastlow2) / 2 //Trend trend = low > center and low[1] > center[1] ? 1 : high < center and high[1] < center[1] ? -1 : trend[1] //Bars bar = close > open ? 1 : close < open ? -1 : 0 redbars = bars == 0 ? 1 : bars == 1 and bar == -1 ? 1 : bars == 2 and bar == -1 and bar[1] == -1 ? 1 : bars == 3 and bar == -1 and bar[1] == -1 and bar[2] == -1 ? 1 : 0 greenbars = bars == 0 ? 1 : bars == 1 and bar == 1 ? 1 : bars == 2 and bar == 1 and bar[1] == 1 ? 1 : bars == 3 and bar == 1 and bar[1] == 1 and bar[2] == 1 ? 1 : 0 //Fast RSI fastup = rma(max(change(close), 0), 2) fastdown = rma(-min(change(close), 0), 2) fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown)) //CryptoBottom mac = sma(close, 10) len = abs(close - mac) sma = sma(len, 100) max = max(open, close) min = min(open, close) up3 = close < open and len > sma * 3 and min < min[1] and fastrsi < 10 ? 1 : 0 //Signals up = trend == 1 and (low < center2 or usefastsma == false) and (redbars == 1) ? 1 : 0 dn = trend == -1 and (high > center2 or usefastsma == false) and (greenbars == 1) ? 1 : 0 up2 = high < center and high < center2 and bar == -1 ? 1 : 0 dn2 = low > center and low > center2 and bar == 1 ? 0 : 0 //Lines plot(center, color = blue, linewidth = 3, transp = 0, title = "Slow MA") plot(center2, color = red, linewidth = 3, transp = 0, title = "PriceChannel 2") //Arrows plotarrow(up == 1 and needarr == true ? 1 : 0, colorup = black, colordown = black, transp = 0) plotarrow(dn == 1 and needarr == true ? -1 : 0, colorup = black, colordown = black, transp = 0) //Background col = needbg == false ? na : trend == 1 ? lime : red bgcolor(col, transp = 90) //Alerts alertcondition(up == 1, title='buy', message='Uptrend') alertcondition(dn == 1, title='sell', message='Downtrend') //Trading stoplong = up == 1 and needstops == true ? close - (close / 100 * stoppercent) : stoplong[1] stopshort = dn == 1 and needstops == true ? close + (close / 100 * stoppercent) : stopshort[1] longCondition = up == 1 or (up2 == 1 and needex == true) or up3 == 1 if (longCondition) strategy.entry("Long", strategy.long, needlong == false ? 0 : na) strategy.exit("Stop Long", "Long", stop = stoplong) shortCondition = dn == 1 if (shortCondition) strategy.entry("Short", strategy.short, needshort == false ? 0 : na) strategy.exit("Stop Short", "Short", stop = stopshort)