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

Tác giả:ChaoZhang, Ngày: 2023-11-22 10:07:19
Tags:

img

Tổng quan

Ý tưởng chính của chiến lược này là sử dụng sự chéo chéo giữa các đường trung bình di chuyển nhanh và chậm để đánh giá xu hướng thị trường và có vị trí khi các đường trung bình di chuyển ngắn hạn và dài hạn đảo ngược, để đạt được hiệu ứng theo dõi xu hướng.

Chiến lược logic

  1. Thiết lập thời gian trung bình di chuyển ngắn hạn shortma (7 ngày mặc định) và thời gian trung bình di chuyển dài hạn longma (77 ngày mặc định)
  2. Khi MA ngắn vượt qua MA dài, nó được xác định là tín hiệu mua và ghi lại barsince mabuy. MA dài ngụ ý xu hướng tăng đã bắt đầu. Khi MA ngắn vượt qua dưới MA dài, nó được xác định là tín hiệu bán và ghi lại barsince masell. MA dài ngụ ý xu hướng tăng đã kết thúc.
  3. So sánh các giá trị barsince. Càng nhiều thanh kể từ khi MA ngắn đi xuống, xu hướng tăng càng kéo dài. Càng nhiều thanh kể từ khi MA ngắn đi lên, tín hiệu đảo ngược càng mạnh.
  4. Khi barsince cho tín hiệu bán lớn hơn barsince cho tín hiệu mua, một tín hiệu mua được kích hoạt. Khi barsince cho tín hiệu mua lớn hơn barsince cho tín hiệu bán, một tín hiệu bán được kích hoạt.
  5. Về cơ bản đây là một chiến lược đảo ngược MA kép, sử dụng đảo ngược chéo của MA nhanh và chậm để phát hiện các điểm đảo ngược xu hướng.

Ưu điểm

  1. Sử dụng hai MAs để lọc một số tín hiệu sai
  2. Thêm thanh vì so sánh tránh phá vỡ sai và đảo ngược giá gần
  3. Dễ hiểu và thực hiện
  4. Các tham số MA có thể tùy chỉnh phù hợp với các giai đoạn và thị trường khác nhau

Rủi ro

  1. Chiến lược MA kép có xu hướng tạo ra các tín hiệu giao dịch thường xuyên hơn
  2. Điều chỉnh tham số MA kém có thể bỏ lỡ xu hướng dài hơn
  3. Stop loss khi phá vỡ MAs dài hạn có thể xa, dẫn đến rút vốn lớn hơn
  4. Không thể lọc hiệu quả cuộn dây và dao động

Hướng dẫn cải thiện

  1. Thêm các chỉ số khác để tránh các whipsaws trong các thị trường khác nhau
  2. Thêm cơ chế dừng lỗ
  3. Tối ưu hóa các kết hợp tham số MA
  4. Điều chỉnh động các tham số MA dựa trên chu kỳ thị trường

Tóm lại

Chiến lược nói chung có logic rõ ràng, dễ hiểu, sử dụng các bước đảo ngược MA nhanh và chậm để phát hiện các điểm đảo ngược xu hướng. Về lý thuyết, nó có thể theo dõi xu hướng hiệu quả. Nhưng trong thực tế thực hiện nó vẫn cần tối ưu hóa chính thuật toán và điều chỉnh các tham số để làm cho nó mạnh mẽ hơn và thực tế hơn.


/*backtest
start: 2022-11-15 00:00:00
end: 2023-11-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Up Down", "Up Down", precision = 6, pyramiding = 1, default_qty_type = strategy.percent_of_equity, default_qty_value = 99, commission_type = strategy.commission.percent, commission_value = 0.0, initial_capital = 1000, overlay = true)

buy = close > open and open > close[1]
sell = close < open and open < close[1]

longma = input(77,"Long MA Input")
shortma = input(7,"Short MA Input")
long = sma(close,longma)
short = sma(close, shortma)
mabuy = crossover(short,long) or buy and short > long
masell = crossunder(short,long) or sell and short > long

num_bars_buy = barssince(mabuy)
num_bars_sell = barssince(masell)
//plot(num_bars_buy, color = teal)
//plot(num_bars_sell, color = orange)

xbuy = crossover(num_bars_sell, num_bars_buy)
xsell = crossunder(num_bars_sell, num_bars_buy)
plotshape(xbuy,"Buy Up Arrow", shape.triangleup, location.belowbar, white, size = size.tiny)
plotshape(xsell,"Sell Down Arrow", shape.triangledown, location.abovebar, white, size = size.tiny)
plot(long,"Long MA", fuchsia, 2)

// Component Code Start
// Example usage:
// if testPeriod()
//   strategy.entry("LE", strategy.long)
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(2, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(7, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
// Component Code Stop

if testPeriod()
    strategy.entry("buy", true, when = xbuy, limit = close)
    strategy.close("buy", when = xsell)


Thêm nữa