Chiến lược dừng lỗ theo dõi thích ứng dựa trên chỉ báo ATR


Ngày tạo: 2023-10-19 12:42:26 sửa đổi lần cuối: 2023-10-19 12:42:26
sao chép: 0 Số nhấp chuột: 843
1
tập trung vào
1617
Người theo dõi

Chiến lược dừng lỗ theo dõi thích ứng dựa trên chỉ báo ATR

Tổng quan

Ý tưởng cốt lõi của chiến lược này là sử dụng chỉ số trung bình sóng thực (ATR) để thiết lập một đường dừng theo dõi tự điều chỉnh để bảo vệ tối đa các vị trí có lợi nhuận và tránh dừng lại sớm. Chỉ số ATR có thể động nắm bắt mức độ biến động của thị trường, điều chỉnh khoảng cách dừng lại theo biến động của thị trường và giảm thiểu khả năng kích hoạt dừng lại trong khi đảm bảo dừng lại.

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

Chiến lược này sử dụng giá trị trung bình của chu kỳ N của chỉ số ATR nhân với một nhân số làm khoảng cách dừng cơ bản. ATR càng lớn, nghĩa là thị trường biến động lớn hơn, khoảng cách dừng sẽ được thiết lập rộng hơn; ATR càng nhỏ, khoảng cách dừng sẽ được thiết lập hẹp hơn.

Cụ thể, chiến lược sử dụng logic cốt lõi sau:

  1. Tính ATR của chu kỳ ATR ((nATRPeriod)).

  2. Cần nhân ATR với nLoss để có được khoảng dừng cơ bản nLoss.

  3. Đường dừng xATRTrailingStop được cập nhật dựa trên mức cao, mức thấp hiện tại và đường dừng của chu kỳ trước.

  4. Nếu mức thấp hiện tại đã kích hoạt đường dừng của chu kỳ trước, thì đường dừng sẽ di chuyển đến khoảng cách nLoss dưới mức thấp.

  5. Nếu điểm cao hiện tại đã kích hoạt đường dừng của chu kỳ trước, thì điểm dừng sẽ di chuyển dưới đường dừng đến khoảng cách nLoss trên điểm cao.

  6. Nếu không kích hoạt dừng, hãy điều chỉnh đường dừng theo khoảng cách của giá đóng cửa từ đường dừng.

  7. Thêm khoảng cách bảo vệ bóng tối tùy chọn để tối ưu hóa hơn nữa.

  8. Hình vẽ quỹ đạo của vòng Brin để hình dung giới hạn trên và dưới của đường dừng.

  9. Định hướng giữ vị trí dựa trên màu của đường dừng

Chiến lược này sử dụng các chỉ số ATR linh hoạt để cho phép đường dừng tự điều chỉnh theo biến động của thị trường, đảm bảo khoảng cách dừng hợp lý và tránh mất vị trí không cần thiết do dừng quá mạnh.

Phân tích lợi thế

Chiến lược này có những ưu điểm sau:

  1. Sử dụng chỉ số ATR để điều chỉnh động khoảng cách dừng để thích ứng với các điều kiện thị trường khác nhau.

  2. Các tham số nhân có thể được tùy chỉnh, cho phép điều chỉnh linh hoạt khoảng cách dừng.

  3. Tham gia vào quỹ đạo của Brin, tạo thành giới hạn hình ảnh trên và dưới của đường dừng.

  4. Có thể chọn chế độ bảo vệ bóng râm để tránh sự chấn động của thị trường.

  5. Nó có thể được sử dụng để theo dõi dừng lỗ, cho phép rút tối đa các vị trí có lợi nhuận.

  6. Chiến lược của họ rất rõ ràng và dễ hiểu, và các tham số của họ ít được tối ưu hóa.

  7. Có thể được sử dụng trong nhiều loại và chu kỳ, ứng dụng rộng rãi.

Phân tích rủi ro

Tuy nhiên, chiến lược này cũng có một số rủi ro cần lưu ý:

  1. Chỉ số ATR phản ứng chậm với sự kiện bất ngờ của thị trường, có thể dẫn đến khoảng cách dừng lỗ quá lớn.

  2. Việc đặt hệ số nhân quá lớn cũng có thể dẫn đến khoảng cách dừng lỗ quá rộng, làm tăng nguy cơ thua lỗ.

  3. Chức năng bảo vệ đường nét sẽ làm cho đường dừng thiệt hại trở nên lỏng lẻo hơn khi rung động tăng lên.

  4. Không tính đến quy tắc nhập cảnh, không thể là chiến lược Entries / Exits.

  5. Cần thử nghiệm nhiều lần các tham số tối ưu hóa để thích ứng với các giống và chu kỳ khác nhau.

  6. Việc phá vỡ lệnh dừng có thể dẫn đến sự gia tăng tổn thất và cần quản lý tài chính hiệu quả.

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

Chính sách này có thể được tối ưu hóa theo các khía cạnh sau:

  1. Kiểm tra các tham số chu kỳ ATR khác nhau để tối ưu hóa khoảng cách dừng.

  2. Điều chỉnh tham số nhân để tìm sự cân bằng giữa khoảng cách dừng và xác suất dừng.

  3. Tối ưu hóa các tham số chu kỳ bảo vệ bóng râm để ngăn chặn whipsaw.

  4. Cố gắng thêm vào các điều kiện nhập cảnh trên cơ sở dừng lỗ, làm cho nó trở thành chiến lược Entries / Exits.

  5. Thêm chỉ số định xu hướng, điều chỉnh khoảng cách dừng lỗ theo xu hướng.

  6. Kết hợp lý thuyết sóng, điều chỉnh khoảng cách dừng theo vị trí sóng.

  7. Thêm kiểm soát vị trí, hạn chế tổn thất đơn lẻ.

Tóm tắt

Chiến lược này sử dụng tính năng tự điều chỉnh của chỉ số ATR, thiết kế một cơ chế dừng lỗ có thể điều chỉnh động. Trong khi đảm bảo dừng lỗ, cũng giảm thiểu tối đa các kích hoạt dừng lỗ không cần thiết. Ý tưởng chiến lược đơn giản và rõ ràng, có thể được tối ưu hóa linh hoạt theo nhu cầu của riêng mình.

Mã nguồn chiến lược
/*backtest
start: 2022-10-12 00:00:00
end: 2023-10-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
////////////////////////////////////////////////////////////
//  Copyright by HPotter v2.0 13/10/2014
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort 
// The related article is copyrighted material from Stocks & Commodities Jun 2009 
// Modified by River to add Bands, and change color of Trailing Stop and add Wick Protection. Now turned into a Strategy for Backtesting Purposes.
// After backtesting, it seems clear that it functions well as a Trailing Stop, but not as an Entry/Exit strategy.
////////////////////////////////////////////////////////////
strategy(title="ATR Trailing Stop Bands Strategy[R] ", overlay = true)
nATRPeriod = input(5)
nATRMultip = input(4)
length = input(30, "#Periods of Wick Protection", minval=2)
bType = input(0, "Max [1] or Avg Wick Protection [0]", minval=0, maxval=1)
avgupperwick = sma(close[1] <= open[1] ? high[1] - open[1] : high[1] - close[1], length)
maxupperwick = highest(close[1] <= open[1] ? high[1] - open[1] : high[1] - close[1], length)
avglowerwick = sma(close[1] > open[1] ? open[1] - low[1] : close[1] - low[1], length)
maxlowerwick = highest(close[1] > open[1] ? open[1] - low[1] : close[1] - low[1], length)
upperwick = bType == 0 ? avgupperwick : maxupperwick
lowerwick = bType == 0 ? avglowerwick : maxlowerwick
xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR 
upperband = iff(high < nz(upperband[1], 0) and high[1] < nz(upperband[1], 0), min(nz(upperband[1]), high + nLoss + upperwick), high + nLoss + upperwick)
lowerband = iff(low > nz(lowerband[1], 0) and low[1] > nz(lowerband[1], 0), max(nz(lowerband[1]), low - nLoss - lowerwick), low - nLoss - lowerwick) 
xATRTrailingStop = iff(low > nz(xATRTrailingStop[1], 0) and low[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), low - nLoss - lowerwick),
 iff(high < nz(xATRTrailingStop[1], 0) and high[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), high + nLoss + upperwick), 
//                        iff(low <= nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), high + nLoss + upperwick, iff(high >= nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), low - nLoss - lowerwick,0))))
 iff(low <= nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), upperband[1], iff(high >= nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), lowerband[1],0))))

pos =	iff(close[1] > nz(xATRTrailingStop[1], 0) and low <= nz(xATRTrailingStop[1], 0), 1,
 iff(close[1] < nz(xATRTrailingStop[1], 0) and high >= nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) 
color = pos == 1 ? red: pos == -1 ? green : blue 
plot(upperband, color=red, title="ATR Upper")
plot(xATRTrailingStop, color=color, title="ATR Trailing Stop", linewidth=2)
plot(lowerband, color=green, title="ATR Lower")

longCondition = (color == green and color[1] == red)
if (longCondition)
    strategy.entry("Long", strategy.long)
longExitCondition = (color == red and color[1] == green)
if (longExitCondition)
    strategy.close("Long")

shortCondition = (color == red and color[1] == green)
if (shortCondition)
    strategy.entry("Short", strategy.short)
shortexitCondition = (color == green and color[1] == red)
if (shortexitCondition)
    strategy.close("Short")