Ý tưởng cốt lõi của chiến lược này là sử dụng chỉ số Average True Range (ATR) để thiết lập một đường dừng lỗ kéo dài thích nghi để tối đa hóa sự bảo vệ các vị trí có lợi nhuận trong khi tránh dừng lỗ sớm. Chỉ số ATR có thể nắm bắt năng động sự biến động của thị trường và điều chỉnh khoảng cách dừng lỗ dựa trên sự biến động của thị trường, đảm bảo dừng lỗ hiệu quả trong khi giảm thiểu khả năng dừng lỗ được kích hoạt. Chiến lược này cũng kết hợp Bollinger Bands để hình dung giới hạn trên và dưới của đường dừng lỗ, với tùy chọn thêm bảo vệ cưa để chống lại hiệu ứng cưa chích trong các thị trường dao động.
Chiến lược này sử dụng trung bình thời gian N của chỉ số ATR nhân với một yếu tố như khoảng cách dừng lỗ cơ bản. Giá trị ATR càng lớn, biến động thị trường càng lớn, vì vậy khoảng cách dừng lỗ càng rộng. Giá trị ATR càng nhỏ, khoảng cách dừng lỗ càng hẹp. Điều này cho phép điều chỉnh năng động khoảng cách dừng lỗ dựa trên biến động thị trường.
Cụ thể, chiến lược sử dụng logic cốt lõi sau:
Tính toán giá trị ATR của khoảng thời gian ATR (nATRPeriod).
Nhận khoảng cách dừng lỗ cơ bản nLoss bằng cách nhân giá trị ATR bằng một nhân (nATRMultip).
Cập nhật đường dừng lỗ xATRTrailingStop dựa trên đường cao, thấp và dừng lỗ hiện tại của giai đoạn trước.
Nếu mức thấp hiện tại kích hoạt đường dừng lỗ của giai đoạn trước, đường dừng lỗ sẽ di chuyển xuống dưới khoảng cách thấp nLoss.
Nếu mức cao hiện tại kích hoạt đường dừng lỗ của giai đoạn trước, đường dừng lỗ di chuyển xuống phía trên mức cao bằng khoảng cách nLoss.
Nếu stop loss không được kích hoạt, điều chỉnh đường stop loss dựa trên khoảng cách của giá gần với nó.
Thêm khoảng cách bảo vệ phích tùy chọn để tối ưu hóa thêm đường dừng mất mát.
Chụp Bollinger Bands để hình dung giới hạn trên và dưới của đường dừng lỗ.
Xác định hướng vị trí dựa trên màu sắc của đường dừng lỗ.
Chiến lược sử dụng các chỉ số ATR linh hoạt để cho phép đường dừng lỗ điều chỉnh thích nghi dựa trên sự biến động của thị trường, đảm bảo khoảng cách dừng lỗ hợp lý trong khi tránh dừng lỗ quá mức gây ra tổn thất không cần thiết của các vị trí.
Những lợi thế của chiến lược này:
Sử dụng chỉ số ATR để điều chỉnh khoảng cách dừng lỗ thích nghi năng động với các điều kiện thị trường khác nhau.
Bộ nhân có thể tùy chỉnh cho phép điều chỉnh linh hoạt khoảng cách dừng lỗ.
Thêm Bollinger Bands cung cấp hình ảnh của giới hạn trên và dưới của đường dừng lỗ.
Bảo vệ chốt tùy chọn tránh chốt chốt trong các thị trường khác nhau.
Có thể được sử dụng như là dừng lỗ để tối đa hóa việc rút tiền của các vị trí có lợi nhuận.
Logic chiến lược là rõ ràng và dễ hiểu với một số tham số tối ưu hóa.
Áp dụng cho nhiều sản phẩm và khung thời gian.
Một số rủi ro của chiến lược này cần lưu ý:
Chỉ số ATR phản ứng chậm với các cú sốc thị trường, dẫn đến khoảng cách dừng lỗ lớn.
Cài đặt nhân quá mức cũng làm tăng khoảng cách dừng lỗ, làm tăng rủi ro mất mát.
Bảo vệ wick có thể làm cho đường dừng mất mát quá lỏng khi whipsaw tăng.
Các quy tắc nhập cảnh không được xem xét, không thể được sử dụng như chiến lược nhập cảnh / xuất cảnh.
Kiểm tra và tối ưu hóa các thông số cần thiết cho các sản phẩm và khung thời gian khác nhau.
Việc dừng lỗ có thể làm tăng lỗ, đòi hỏi quản lý vốn hiệu quả.
Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:
Kiểm tra các khoảng thời gian ATR khác nhau để tối ưu hóa khoảng cách dừng mất mát.
Điều chỉnh nhân để cân bằng giữa khoảng cách dừng lỗ và xác suất.
Tối ưu hóa thời gian bảo vệ phích để ngăn chặn whipsaw.
Hãy thử thêm các điều kiện nhập vào trên stop loss để làm cho nó vào chiến lược / Exits.
Thêm chỉ số xu hướng để điều chỉnh khoảng cách dừng lỗ dựa trên xu hướng.
Điều chỉnh stop loss dựa trên lý thuyết Elliott Waves.
Chỉ số này được sử dụng để xác định số lượng lỗ đơn.
Chiến lược này sử dụng đặc điểm thích nghi của chỉ số ATR để thiết kế một cơ chế dừng lỗ năng động. Trong khi đảm bảo dừng lỗ, nó cũng giảm thiểu các yếu tố kích hoạt dừng lỗ không cần thiết. Logic chiến lược đơn giản và rõ ràng, cho phép tối ưu hóa linh hoạt dựa trên nhu cầu. Nó hoạt động tốt nhất như là dừng lỗ để tối đa hóa bảo vệ lợi nhuận. Với tối ưu hóa tham số và kiểm soát rủi ro thích hợp, chiến lược này có thể là một công cụ dừng lỗ hiệu quả trong giao dịch định lượng.
/*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")