Chiến lược dừng lỗ di chuyển ATR dựa trên chỉ báo UT Bot


Ngày tạo: 2024-03-11 11:17:33 sửa đổi lần cuối: 2024-03-11 11:17:33
sao chép: 0 Số nhấp chuột: 1101
1
tập trung vào
1166
Người theo dõi

Chiến lược dừng lỗ di chuyển ATR dựa trên chỉ báo UT Bot

Tổng quan

Chiến lược này dựa trên chỉ số UT Bot được phát triển bởi QuantNomad, kết hợp với tư duy dừng lỗ di động. Mã gốc được viết bởi @Yo_adriiiiaan, @HPotter đã sửa đổi. Chiến lược này sẽ được sử dụng với các khái niệm tiền thông minh của LuxAlgo.

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

Các nguyên tắc chính của chiến lược này là:

  1. Giao dịch nhiều lần khi giá đóng cửa cao hơn 50 trung bình di chuyển đơn giản.
  2. Đối với các vị trí nhiều đầu, đặt giá dừng di chuyển. Giá dừng di chuyển là 80% của giá đóng cửa hiện tại (khoảng 1-20%). Giá dừng di chuyển sẽ di chuyển lên khi giá tăng, nhưng không di chuyển xuống, do đó đóng vai trò bảo vệ lợi nhuận.
  3. Đối với vị trí đầu trống, cũng đặt giá dừng di chuyển. Giá dừng di chuyển là 120% giá đóng cửa hiện tại (< 1 + 20%). Giá dừng di chuyển sẽ đi xuống khi giá giảm, nhưng không đi lên.
  4. Sử dụng ATR ((Average True Range) làm cơ sở tham chiếu cho dừng di chuyển. Cách tính giá dừng di chuyển ATR là: Khi di chuyển lên, lấy giá dừng di chuyển ATR trước đó và giá đóng cửa hiện tại - ATR*Key Value) lớn hơn; khi di chuyển xuống, lấy giá dừng lỗ ATR trước đó và giá đóng cửa hiện tại + ATR*Key Value) là giá trị nhỏ hơn của cả hai. Trong đó Key Value là tham số được thiết lập bởi người dùng để điều chỉnh độ nhạy của dừng di động.
  5. Xác định hướng nắm giữ hiện tại dựa trên sự phá vỡ của giá dừng động ATR. Cung cấp vị trí đầu nhiều khi giá vượt qua giá dừng động ATR; Cung cấp vị trí đầu trống khi giá vượt qua giá dừng động ATR; Trong các trường hợp khác, giữ vị trí nắm giữ hiện tại không thay đổi.

Phân tích lợi thế

  1. Thiết lập dừng di chuyển có thể bảo vệ lợi nhuận tốt, cho phép chiến lược có thể thu được nhiều lợi nhuận hơn trong tình huống xu hướng.
  2. Cài đặt dừng lỗ cho các vị trí nhiều đầu và trống, có thể thích ứng với các tình huống khác nhau.
  3. Sử dụng ATR như một tài liệu tham khảo để dừng lỗ, bạn có thể điều chỉnh động vị trí dừng lỗ, linh hoạt hơn và hiệu quả hơn.
  4. Cung cấp các tham số giá trị chính để người dùng tối ưu hóa, có thể điều chỉnh theo các giống và chu kỳ khác nhau để cải thiện khả năng thích ứng.

Phân tích rủi ro

  1. Trong các tình huống chấn động, các lỗ hổng thường xuyên có thể dẫn đến quá nhiều giao dịch, tăng chi phí xử lý và giảm lợi nhuận.
  2. Phạm vi dừng động của tỷ lệ phần trăm cố định là tương đối đơn giản và có thể không đáp ứng tốt với biến động giá trong một số trường hợp.
  3. Chiến lược chỉ tính đến lệnh dừng di động, không đặt lệnh dừng di động, có thể bỏ lỡ một số cơ hội kiếm tiền.
  4. Lựa chọn tham số có ảnh hưởng lớn đến hiệu suất chiến lược, tham số không đúng có thể mang lại rủi ro rút lui lớn hơn.

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

  1. Có thể xem xét kết hợp với các chỉ số hoặc điều kiện khác, chẳng hạn như khối lượng giao dịch, tỷ lệ biến động, để tối ưu hóa các điều kiện nhập cảnh, nâng cao độ tin cậy của tín hiệu.
  2. Đối với phương pháp tính toán dừng di chuyển, có thể khám phá các phương pháp phức tạp và hiệu quả hơn, chẳng hạn như sử dụng dừng parallax, dừng phần trăm động, v.v.
  3. Các cơ chế dừng động có thể được thêm vào, chẳng hạn như thiết lập dừng động theo ATR hoặc tỷ lệ phần trăm để khóa lợi nhuận tốt hơn.
  4. Đối với các giống và chu kỳ khác nhau, bạn có thể tối ưu hóa tham số, tìm kiếm sự kết hợp tham số phù hợp nhất. Bạn cũng có thể điều chỉnh các tham số động theo thay đổi của tình trạng thị trường.

Tóm tắt

Chiến lược này dựa trên chỉ số UT Bot, thêm logic dừng di động, có thể đóng vai trò bảo vệ lợi nhuận trong tình huống xu hướng. Đồng thời, chiến lược thiết lập dừng lỗ cho vị trí nhiều đầu và vị trí trống, có khả năng thích ứng mạnh mẽ. Sử dụng ATR làm cơ sở tham chiếu cho dừng di động, có thể điều chỉnh vị trí dừng lỗ động, tăng tính linh hoạt. Tuy nhiên, chiến lược có thể đối mặt với rủi ro chi phí giao dịch cao do tổn thất thường xuyên trong tình huống xung đột, và thiếu thiết lập dừng di động, có thể mất lợi nhuận. Ngoài ra, lựa chọn tham số có ảnh hưởng lớn đến hiệu suất của chiến lược.

Trong tương lai, có thể cải thiện chiến lược để đạt được lợi nhuận ổn định hơn từ việc tối ưu hóa điều kiện nhập cảnh, khám phá các phương pháp dừng chân di động phức tạp hơn, thêm cơ chế dừng chân di động, tối ưu hóa tham số cho các giống và chu kỳ khác nhau. Nhìn chung, ý tưởng chiến lược này đơn giản, dễ hiểu và thực hiện, nhưng vẫn còn không gian tối ưu hóa hơn nữa, đáng để tiếp tục khám phá và cải thiện.

Mã nguồn chiến lược
/*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")