Chiến lược đảo ngược trung bình di chuyển kép

Tác giả:ChaoZhang, Ngày: 2023-10-24 10:56:08
Tags:

img

Tổng quan

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 logic

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à:

  1. Tính toán EMA 20 ngày và EMA 60 ngày
  2. Đánh giá nếu đường EMA 20 ngày vượt quá đường EMA 60 ngày, nếu có thì đi dài
  3. Đánh giá nếu đường EMA 20 ngày vượt dưới đường EMA 60 ngày, nếu có đi ngắn
  4. Sau khi mua dài, đặt dừng lỗ ở mức 3% dưới giá cao nhất
  5. Sau khi đi ngắn, đặt dừng lỗ ở mức 3% trên giá thấp nhất
  6. Tiếp tục điều chỉnh stop loss khi ở vị trí

Phân tích lợi thế

Những lợi thế của chiến lược này là:

  1. Logic đơn giản dễ thực hiện.
  2. Hai MA có thể lọc hiệu quả các đứt sai.
  3. Đánh chặn khóa trong lợi nhuận tối đa.
  4. Có thể bắt được tín hiệu kịp thời khi xu hướng thay đổi.
  5. Kiểm soát lượng nước, tương đối ổn định.

Phân tích rủi ro

Ngoài ra còn có một số rủi ro:

  1. Sự giao dịch thường xuyên giữa các MAs khi xu hướng không rõ ràng, dẫn đến tổn thất quá mức.
  2. Cài đặt stop loss không đúng có thể quá lỏng lẻo hoặc quá hung hăng.
  3. Các thiết lập tham số sai như độ dài thời gian có thể bỏ lỡ các tín hiệu chính.
  4. Chi phí giao dịch cao làm xói mòn lợi nhuận.

Để giải quyết rủi ro:

  1. Sử dụng bộ lọc khi xu hướng không rõ ràng để tránh giao dịch mù.
  2. Kiểm tra và tối ưu hóa phạm vi dừng mất mát cho cài đặt đúng.
  3. Tìm các thông số tối ưu thông qua backtest và điều chỉnh.
  4. Giảm kích thước vị trí để giảm chi phí giao dịch.

Ý tưởng tối ưu hóa

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

  1. Thêm các bộ lọc khác như RSI để nhập nhiều điều kiện, tránh phá vỡ sai.

  2. 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.

  3. 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.

  4. Thiết lập logic nhập lại sau khi dừng lỗ để giảm tần suất giao dịch.

  5. 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.

  6. 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

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)

Thêm nữa