Chiến lược này chủ yếu sử dụng trung bình di chuyển kép như tín hiệu mua và bán để kiếm lợi nhuận từ sự đảo ngược xu hướng. Nó đi dài khi trung bình di chuyển ngắn hạn vượt qua trên trung bình di chuyển dài hạn, và đi ngắn khi trung bình di chuyển ngắn hạn vượt qua dưới trung bình di chuyển dài hạn. Nó thuộc về một chiến lược dừng lỗ kéo theo phổ biến.
Chiến lược đầu tiên thiết lập hai đường trung bình động, một MA ngắn hạn 20 ngày và một MA dài hạn 60 ngày.
Cụ thể, khi MA ngắn hạn vượt qua trên MA dài hạn, nó báo hiệu xu hướng tăng, vì vậy đi dài. Khi MA ngắn hạn vượt dưới MA dài hạn, nó báo hiệu xu hướng giảm, vì vậy đi ngắn.
Phương pháp dừng lỗ sau khi đi dài hoặc ngắn là dừng lại dựa trên giá cao nhất và giá thấp nhất để khóa lợi nhuận tối đa.
Lý thuyết chính của mã là:
Những lợi thế của chiến lược này là:
Ngoài ra còn có một số rủi ro:
Để giải quyết rủi ro:
Chiến lược có thể được tối ưu hóa hơn nữa trong các lĩnh vực sau:
Thêm các bộ lọc khác như RSI để nhập nhiều điều kiện, tránh phá vỡ sai.
Tối ưu hóa các khoảng thời gian MA để tìm kết hợp tham số tốt nhất. Có thể kiểm tra các khoảng thời gian khác nhau bằng cách bước tiến gia tăng.
Tối ưu hóa phạm vi stop loss thông qua tính toán backtest để tìm phạm vi tối ưu.
Thiết lập logic nhập lại sau khi dừng lỗ để giảm tần suất giao dịch.
Kết hợp với chỉ số xu hướng để tạm dừng giao dịch khi xu hướng không rõ ràng.
Thêm kích thước vị trí và dừng lỗ động dựa trên điều kiện thị trường.
Tóm lại, chiến lược đảo ngược MA kép là đơn giản và thực tế nói chung, xác định các điểm chuyển đổi xu hướng thông qua giao thoa MA kép. Nhưng có những rủi ro cần điều chỉnh tham số, tối ưu hóa stop loss và thêm các bộ lọc để tối đa hóa hiệu quả chiến lược. Với tối ưu hóa tỉ mỉ và quản lý rủi ro có kỷ luật, nó có thể trở thành một chiến lược giao dịch swing mang lại lợi nhuận ổn định.
/*backtest start: 2023-09-23 00:00:00 end: 2023-10-15 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("Noro's Bands Scalper Strategy v1.4", shorttitle = "Scalper str 1.4", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=100.0, pyramiding=0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") takepercent = input(0, defval = 0, minval = 0, maxval = 1000, title = "take, %") needbe = input(true, defval = true, title = "Bands Entry") needct = input(false, defval = false, title = "Counter-trend entry") needdb = input(true, defval = true, title = "Double Body") len = input(20, defval = 20, minval = 2, maxval = 200, title = "Period") needbb = input(true, defval = true, title = "Show Bands") needbg = input(true, defval = true, title = "Show Background") src = close //PriceChannel 1 lasthigh = highest(src, len) lastlow = lowest(src, len) center = (lasthigh + lastlow) / 2 //Distance dist = abs(src - center) distsma = sma(dist, len) hd = center + distsma ld = center - distsma hd2 = center + distsma * 2 ld2 = center - distsma * 2 //Trend trend = close < ld and high < center ? -1 : close > hd and low > center ? 1 : trend[1] //Lines colo = needbb == false ? na : black plot(hd2, color = colo, linewidth = 1, transp = 0, title = "High band 2") plot(hd, color = colo, linewidth = 1, transp = 0, title = "High band 1") plot(center, color = colo, linewidth = 1, transp = 0, title = "center") plot(ld, color = colo, linewidth = 1, transp = 0, title = "Low band 1") plot(ld2, color = colo, linewidth = 1, transp = 0, title = "Low band 2") //Background col = needbg == false ? na : trend == 1 ? lime : red bgcolor(col, transp = 80) //Body body = abs(close - open) smabody = needdb == false ? ema(body, 30) : ema(body, 30) * 2 candle = high - low //Signals bar = close > open ? 1 : close < open ? -1 : 0 up7 = trend == 1 and ((bar == -1 and bar[1] == -1) or (body > smabody and bar == -1)) ? 1 : 0 dn7 = trend == 1 and ((bar == 1 and bar[1] == 1) or (close > hd and needbe == true)) and close > strategy.position_avg_price * (100 + takepercent) / 100 ? 1 : 0 up8 = trend == -1 and ((bar == -1 and bar[1] == -1) or (close < ld2 and needbe == true)) and close < strategy.position_avg_price * (100 - takepercent) / 100 ? 1 : 0 dn8 = trend == -1 and ((bar == 1 and bar[1] == 1) or (body > smabody and bar == 1)) ? 1 : 0 if up7 == 1 or up8 == 1 strategy.entry("Long", strategy.long, needlong == false ? 0 : trend == -1 and needct == false ? 0 : na) if dn7 == 1 or dn8 == 1 strategy.entry("Short", strategy.short, needshort == false ? 0 : trend == 1 and needct == false ? 0 : na)