Chiến lược định lượng giao cắt trung bình động SMA xu hướng dài hạn

SMA EMA
Ngày tạo: 2025-01-06 17:01:08 sửa đổi lần cuối: 2025-01-06 17:01:08
sao chép: 3 Số nhấp chuột: 432
1
tập trung vào
1617
Người theo dõi

Chiến lược định lượng giao cắt trung bình động SMA xu hướng dài hạn

Tổng quan

Chiến lược này là một hệ thống giao dịch định lượng dựa trên các tín hiệu giao nhau của đường trung bình động đơn giản (SMA) nhiều giai đoạn. Giao dịch chủ yếu bằng cách xác định các cơ hội thoái lui ngắn hạn trong xu hướng tăng dài hạn. Chiến lược này sử dụng các chỉ báo SMA với năm giai đoạn là 5 ngày, 10 ngày, 20 ngày, 60 ngày và 120 ngày để đánh giá xu hướng thị trường và cơ hội giao dịch thông qua mối quan hệ vị thế và tín hiệu giao nhau của các đường trung bình động.

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

Logic cốt lõi của chiến lược bao gồm những phần chính sau:

  1. Xu hướng dài hạn có thể được đánh giá bằng mối quan hệ vị trí tương đối giữa SMA20 và SMA60. Khi SMA20 ở trên SMA60, điều đó xác nhận rằng thị trường đang trong xu hướng tăng.
  2. Dựa trên cơ sở xác nhận xu hướng tăng dài hạn, tín hiệu mua sẽ được kích hoạt khi đường SMA5 ngắn hạn phục hồi từ dưới SMA20 lên trên. Điều này cho thấy thị trường đang phục hồi sau đợt điều chỉnh ngắn hạn trong xu hướng tăng.
  3. Khi SMA20 cắt SMA5, tín hiệu đóng sẽ được kích hoạt. Điều này cho thấy đà tăng ngắn hạn đã yếu đi và có thể bước vào giai đoạn điều chỉnh.
  4. Chiến lược này cũng bao gồm chức năng lọc thời gian, có thể giới hạn phạm vi thời gian của thử nghiệm ngược và tăng tính linh hoạt của chiến lược.

Lợi thế chiến lược

  1. Logic chiến lược rõ ràng và đơn giản, dễ hiểu và triển khai, không liên quan đến các quy trình tính toán phức tạp.
  2. Bằng cách sử dụng phối hợp nhiều đường trung bình động trong nhiều giai đoạn, chúng ta có thể lọc hiệu quả nhiễu thị trường và cải thiện độ tin cậy của các tín hiệu giao dịch.
  3. Chiến lược này tập trung vào các cơ hội thoái lui trong thị trường có xu hướng, phù hợp với khái niệm cốt lõi của “giao dịch theo xu hướng”.
  4. Sử dụng SMA thay vì EMA giúp giảm độ nhạy với thay đổi giá và giảm tín hiệu sai.
  5. Logic vào và ra rõ ràng, giúp thực hiện và kiểm soát rủi ro dễ dàng hơn.

Rủi ro chiến lược

  1. Hệ thống đường trung bình động có độ trễ, có thể dẫn đến thời điểm vào và thoát lệnh không tối ưu.
  2. Trong một thị trường biến động, việc đường trung bình động giao nhau thường xuyên có thể tạo ra quá nhiều tín hiệu sai.
  3. Chiến lược này thiếu cơ chế lọc biến động và có thể phải đối mặt với rủi ro giảm giá lớn hơn trong thời kỳ biến động cao.
  4. Nếu không tính đến sự hợp tác của các chỉ báo kỹ thuật khác như khối lượng giao dịch, độ tin cậy của tín hiệu cần được cải thiện.
  5. Các tham số trung bình động cố định có thể không phù hợp với mọi môi trường thị trường.

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

  1. Giới thiệu chỉ báo ATR để lọc biến động và tránh giao dịch khi biến động quá cao.
  2. Thêm cơ chế xác nhận khối lượng để cải thiện độ tin cậy của tín hiệu giao dịch.
  3. Phát triển cơ chế chu kỳ trung bình động thích ứng để cho phép chiến lược thích ứng tốt hơn với các môi trường thị trường khác nhau.
  4. Thêm bộ lọc cường độ xu hướng, chẳng hạn như chỉ báo ADX, để đảm bảo giao dịch theo xu hướng mạnh.
  5. Cải thiện cơ chế dừng lỗ, chẳng hạn như thêm lệnh dừng lỗ theo sau, để kiểm soát rủi ro tốt hơn.

Tóm tắt

Chiến lược này sử dụng đường trung bình động SMA nhiều giai đoạn để xây dựng hệ thống giao dịch tập trung vào việc nắm bắt cơ hội thoái lui trong xu hướng tăng dài hạn. Thiết kế chiến lược ngắn gọn và thiết thực, dễ hiểu và dễ triển khai. Bằng cách đưa ra các biện pháp tối ưu hóa như lọc biến động và xác nhận khối lượng, tính mạnh mẽ và độ tin cậy của chiến lược này dự kiến ​​sẽ được cải thiện hơn nữa.

Mã nguồn chiến lược
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Long-Term Growing Stock Strategy", overlay=true)
// Date Range
// STEP 1. Create inputs that configure the backtest's date range
useDateFilter = input.bool(true, title="Filter Date Range of Backtest",group="Backtest Time Period")
backtestStartDate = input(timestamp("1 Jan 2014"),title="Start Date", group="Backtest Time Period",tooltip="This start date is in the time zone of the exchange " + "where the chart's instrument trades. It doesn't use the time " +"zone of the chart or of your computer.")
backtestEndDate = input(timestamp("31 Dec 2024"), title="End Date", group="Backtest Time Period")
// STEP 2. See if current bar falls inside the date range
inTradeWindow = true


// Calculate EMAs
// ema20 = ta.ema(close, ema20_length)
// ema60 = ta.ema(close, ema60_length)
// ema120 = ta.ema(close, ema120_length)
sma5 = ta.sma(close, 5)
sma10 = ta.sma(close, 10)
sma20 = ta.sma(close, 20)
sma60 = ta.sma(close, 60)
sma120 = ta.sma(close, 120)

// Long-term growth condition: EMA 20 > EMA 60 > EMA 120
longTermGrowth = sma20 > sma60
//  and ema60 > ema120

// Entry condition: Stock closes below EMA 20 and then rises back above EMA 10

// entryCondition = ta.crossover(close, ema20) or (close[1] < ema20[1] and close > ema20)
entryCondition =  sma5[1] <= sma20[1] and sma5 > sma20
// ta.crossover(sma5, sma20)

// Exit condition: EMA 20 drops below EMA 60
// exitCondition = ema5 < ema60 or (year == 2024 and month == 12 and dayofmonth == 30)
exitCondition = ta.crossover(sma20, sma5)

// Execute trades
if entryCondition and inTradeWindow
    strategy.entry("Long Entry", strategy.long)

if exitCondition and inTradeWindow
    strategy.close("Long Entry")
// plotchar(true, char="sma5: " + str.tostring(sma5))
// plotchar(true, char="sma5: " + sma20)
// label.new(x=bar_index, y=high + 10, text="SMA 5: " + str.tostring(sma5), color=color.blue, style=label.style_label_down, textcolor=color.white, size=size.small)
// label.new(x=bar_index, y=low, text="SMA 20: " + str.tostring(sma20), color=color.red, style=label.style_label_down, textcolor=color.white, size=size.small)


// x = time + (time - time[1]) * offset_x

//     var label lab = na
//     label.delete(lab)
//     lab := label.new(x=x, y=0, text=txt, xloc=xloc.bar_time, yloc=yloc.belowbar, color=color.red, textcolor=color.black, size=size.normal, style=label.style_label_up)
//     label.set_x(lab, x)



// Plot EMAs for visualization
// plot(ema20, color=color.red, title="EMA 20")
// plot(ema60, color=color.green, title="EMA 60")
// plot(ema120, color=color.blue, title="EMA 120")