Chiến lược dừng kéo theo động dựa trên ATR và SMA

Tác giả:ChaoZhang, Ngày: 2024-03-11 11:55:21
Tags:

img

Tổng quan

Chiến lược này kết hợp chỉ số ATR (Mức trung bình True Range) và chỉ số SMA (Mức trung bình di chuyển đơn giản) để thực hiện một hệ thống giao dịch dừng sau động. Khi giá vượt trên SMA, nó mở một vị trí dài và thiết lập một mức dừng lỗ động dựa trên ATR. Giá dừng lỗ sẽ tiếp tục tăng khi giá tăng. Khi giá giảm xuống dưới mức dừng lỗ động, vị trí được đóng. Ý tưởng chính của chiến lược này là khóa lợi nhuận và giảm rút trong các thị trường xu hướng bằng cách sử dụng mức dừng lỗ động.

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

  1. Tính toán đường SMA 50 ngày. Khi giá đóng lớn hơn đường SMA 50 ngày, mở một vị trí dài.
  2. Tính toán chỉ số ATR với một khoảng thời gian 10, nhân với một giá trị khóa (bên mặc định là 3) để có được phạm vi dừng lỗ nLoss.
  3. Tính toán giá dừng lỗ động xATRTrailingStop, với giá trị ban đầu là 0.
    • Khi giá đóng cửa và giá đóng cửa trước đó đều lớn hơn giá dừng lỗ trước đó, giá dừng lỗ mới là giá dừng lỗ trước đó lớn hơn và (giá đóng cửa - nLoss).
    • Khi giá đóng cửa và giá đóng cửa trước đó đều thấp hơn giá dừng lỗ trước đó, giá dừng lỗ mới là giá thấp hơn của giá dừng lỗ trước đó và (giá đóng cửa + nLoss).
    • Trong các trường hợp khác, giá dừng lỗ mới là (giá đóng - nLoss) hoặc (giá đóng + nLoss).
  4. Khi giá đóng cửa giảm xuống dưới giá dừng lỗ động, đóng vị trí.
  5. Các điểm dừng lỗ được đánh dấu bằng các màu sắc khác nhau: màu xanh lá cây cho lỗ dừng dài, màu đỏ cho lỗ dừng ngắn và màu xanh lam cho các trường hợp khác.

Phân tích lợi thế

  1. Cơ chế dừng lỗ động có thể bảo vệ lợi nhuận và giảm rủi ro rút vốn trong thị trường xu hướng. so với dừng lỗ cố định, dừng lỗ động linh hoạt hơn và có thể thích nghi với các điều kiện thị trường khác nhau.
  2. Phạm vi dừng lỗ được tính dựa trên chỉ số ATR. ATR có thể phản ánh tốt quy mô biến động thị trường, vì vậy khoảng cách dừng lỗ sẽ tự động điều chỉnh theo biến động của điều kiện thị trường gần đây. Nó làm tăng khoảng dừng lỗ khi biến động tăng và giảm khoảng dừng lỗ khi biến động giảm.
  3. Sử dụng SMA làm cơ sở để đánh giá xu hướng có thể nắm bắt thị trường xu hướng tương đối rõ ràng.
  4. Cho phép người dùng thiết lập thời gian ATR và các tham số giá trị chính, có thể điều chỉnh các tham số chiến lược linh hoạt để thích nghi với các đặc điểm của các giống và chu kỳ khác nhau.

Phân tích rủi ro

  1. Trong thị trường không rõ ràng hoặc dao động, chiến lược này có thể trải qua việc mở và đóng các vị trí thường xuyên, dẫn đến chi phí giao dịch tăng và lợi nhuận giảm.
  2. Chiến lược này chỉ có logic dài và không thể lợi nhuận trong một xu hướng giảm, đối mặt với nguy cơ của một thị trường một chiều.
  3. Điểm dừng lỗ dựa trên tính toán ATR. Khi thị trường dao động mạnh mẽ, khoảng dừng lỗ có thể quá lớn, dẫn đến tăng rủi ro. Hãy xem xét việc thiết lập phạm vi dừng lỗ tối đa để kiểm soát mức lỗ tối đa của một giao dịch duy nhất.
  4. Lựa chọn tham số không chính xác có thể dẫn đến thất bại chiến lược. Ví dụ, nếu thời gian ATR quá nhỏ, nó có thể dẫn đến lỗ dừng quá nhạy cảm và kích hoạt thường xuyên; nếu quá lớn, nó có thể không dừng lỗ kịp thời và khuếch đại lỗ.

Hướng tối ưu hóa

  1. Bạn có thể mở một vị trí ngắn khi giá giảm xuống dưới SMA, và cũng sử dụng logic dừng lỗ năng động.
  2. Đưa ra quản lý vị trí dài và ngắn để điều chỉnh kích thước vị trí theo sức mạnh của xu hướng. Tăng vị trí khi xu hướng mạnh để tăng lợi nhuận; giảm vị trí khi xu hướng yếu để kiểm soát rủi ro.
  3. Tối ưu hóa logic stop loss và đặt phạm vi stop loss tối đa để ngăn ngừa tổn thất quá mức trong các tình huống cực đoan. Đồng thời, hãy xem xét việc đặt điểm lấy lợi nhuận để đóng vị trí một cách tích cực khi thu nhập dự kiến đạt được, thay vì giữ nó cho đến khi stop loss được kích hoạt.
  4. Tối ưu hóa các tham số bằng cách đi qua các kết hợp tham số khác nhau để tìm các cài đặt tham số tốt nhất.
  5. Xem xét thêm các điều kiện lọc, chẳng hạn như chỉ số khối lượng giao dịch và biến động, để đánh giá tốt hơn xu hướng và rủi ro và cải thiện độ tin cậy của tín hiệu.

Tóm lại

Chiến lược này thực hiện một hệ thống giao dịch dừng lại theo dõi năng động dựa trên các chỉ số ATR và SMA, có thể tự động điều chỉnh vị trí dừng lỗ trong thị trường xu hướng để bảo vệ lợi nhuận và kiểm soát rủi ro. Logic chiến lược rõ ràng và có những lợi thế rõ ràng, nhưng nó cũng có một số hạn chế và điểm rủi ro. Thông qua tối ưu hóa và cải tiến hợp lý, chẳng hạn như thêm logic ngắn, tối ưu hóa quản lý vị trí, thiết lập mức dừng lỗ tối đa, v.v., độ bền và lợi nhuận của chiến lược có thể được cải thiện hơn nữa. Trong các ứng dụng thực tế, cần phải điều chỉnh các tham số chiến lược một cách linh hoạt theo các loại và chu kỳ giao dịch khác nhau và kiểm soát rủi ro nghiêm ngặt. Nói chung, chiến lược này cung cấp một ý tưởng khả thi cho giao dịch định lượng và xứng đáng được khám phá và tối ưu hóa thêm.


/*backtest
start: 2023-03-05 00:00:00
end: 2024-03-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Trailingstop", overlay=true)

if close > sma(close, 50)
    strategy.entry("long", strategy.long)

// Trailing stop loss for long positions
Trailperc = 0.20
price_stop_long = 0.0

if (strategy.position_size > 0)
    stopValue = close * (1 - Trailperc)
    price_stop_long := max(stopValue, price_stop_long[1])
else
    price_stop_long := 0

if (strategy.position_size > 0)
    strategy.exit(id="stoploss_long", stop=price_stop_long)

// Trailing stop loss for short positions
Trailperc_short = 0.20
price_stop_short = 0.0

if (strategy.position_size < 0)
    stopValue_short = close * (1 + Trailperc_short)
    price_stop_short := min(stopValue_short, price_stop_short[1])
else
    price_stop_short := 0

if (strategy.position_size < 0)
    strategy.exit(id="stoploss_short", stop=price_stop_short)

// ATR Trailing Stop for visualization
keyvalue = input(3, title="Key Value. 'This changes the sensitivity'", step=0.5)
atrperiod = input(10, title="ATR Period")
xATR = atr(atrperiod)
nLoss = keyvalue * xATR

xATRTrailingStop = 0.0
xATRTrailingStop := iff(close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), close - nLoss),
   iff(close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), close + nLoss),
   iff(close > nz(xATRTrailingStop[1], 0), close - nLoss, close + nLoss)))

pos = 0  
pos :=   iff(close[1] < nz(xATRTrailingStop[1], 0) and close > nz(xATRTrailingStop[1], 0), 1,
   iff(close[1] > nz(xATRTrailingStop[1], 0) and close < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0)))

xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue

plot(xATRTrailingStop, color = xcolor, title = "Trailing Stop")

Thêm nữa