Đây là một chiến lược giao dịch dao động khoảng thời gian hàng ngày dựa trên các kỹ thuật động lực sử dụng ATR Stops. Nó được tạo ra bởi Kory Hoang từ Stably.
Chiến lược xác định hướng xu hướng bằng cách sử dụng các chỉ số động lực và thiết lập các đường dừng lỗ dựa trên ATR để thực hiện giao dịch swing low buy-high sell.
Mã đầu tiên thiết lập khoảng thời gian backtesting.
Sau đó, trong phần chỉ số, các chỉ số sau đây được tính:
Lý thuyết chính để đánh giá xu hướng là:
Nếu đóng cửa cao hơn đường dừng lỗ giảm trước đó, nó được đánh giá là xu hướng tăng; nếu đóng cửa thấp hơn đường dừng lỗ tăng trước đó, nó được đánh giá là xu hướng giảm.
Khi xu hướng thay đổi, điều chỉnh vị trí đường dừng lỗ.
Cụ thể, trong xu hướng tăng, đường dừng lỗ được đặt ở mức giá cao nhất của thanh trước trừ giá trị ATR; trong xu hướng giảm, đường dừng lỗ được đặt ở mức giá thấp nhất của thanh trước cộng với giá trị ATR.
Điều này nhận ra xu hướng sau khi dừng lỗ.
Trong phần Quy tắc giao dịch, mở các vị trí dài / ngắn khi giá vượt qua đường dừng lỗ.
Những lợi thế của chiến lược này:
Ngoài ra còn có một số rủi ro:
Một số tối ưu hóa:
Một số hướng để tối ưu hóa chiến lược này:
Kiểm tra các tham số ATR khác nhau để tìm ra tối ưu. Kiểm tra lại nhiều bộ tham số và đánh giá tỷ lệ lợi nhuận / rủi ro.
Tối ưu hóa stop loss kết hợp các số liệu biến động trên ATR. Thêm số liệu biến động, thư giãn stop loss đúng trong các giai đoạn biến động tăng.
Thêm bộ lọc xu hướng để tránh giao dịch trong thị trường hỗn loạn. Thêm chỉ số đánh giá xu hướng, chỉ giao dịch khi xu hướng rõ ràng.
Thêm cơ chế kích thước vị trí. Điều chỉnh kích thước vị trí dựa trên tỷ lệ sử dụng tài khoản, thời gian dừng lỗ liên tiếp vv
Thêm kiểm soát rủi ro lỗ hổng qua đêm.
Là một chiến lược giao dịch swing hàng ngày cơ bản, logic tổng thể là rõ ràng. Nó đánh giá xu hướng với các kỹ thuật động lực và sử dụng ATR để ngăn chặn lỗ, kiểm soát rủi ro hiệu quả.
Vẫn còn nhiều chỗ để tối ưu hóa, có thể cải thiện từ các khía cạnh như phán đoán xu hướng, phương pháp dừng lỗ, kích thước vị trí vv để làm cho chiến lược thực tế hơn.
/*backtest start: 2023-01-29 00:00:00 end: 2024-02-04 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("BTC Swinger", overlay=true, commission_value = 0.25, default_qty_type=strategy.percent_of_equity, default_qty_value = 100) ///////////////////////////////////////////////////////////// //START - SET DATE RANGE // === BACKTEST RANGE === FromMonth = input(defval = 1, title = "From Month", minval = 1) FromDay = input(defval = 1, title = "From Day", minval = 1) FromYear = input(defval = 2010, title = "From Year") ToMonth = input(defval = 12, title = "To Month", minval = 1) ToDay = input(defval = 31, title = "To Day", minval = 1) ToYear = input(defval = 2020, title = "To Year") startDate = time > timestamp(FromYear, FromMonth, FromDay, 1, 1) endDate = time < timestamp(ToYear, ToMonth, ToDay, 23, 59) withinTimeRange = true ///////////////////////////////////////////////////////////// //END - SET DATE RANGE ///////////////////////////////////////////////////////////// //START - INDICATORS length = input(3) mult = input(1, minval = 0.01) atr_ = atr(length) max1 = max(nz(max_[1]), close) min1 = min(nz(min_[1]), close) is_uptrend_prev = nz(is_uptrend[1], true) stop = is_uptrend_prev ? max1 - mult * atr_ : min1 + mult * atr_ vstop_prev = nz(vstop[1]) vstop1 = is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop) is_uptrend = close - vstop1 >= 0 is_trend_changed = is_uptrend != is_uptrend_prev max_ = is_trend_changed ? close : max1 min_ = is_trend_changed ? close : min1 vstop = is_trend_changed ? is_uptrend ? max_ - mult * atr_ : min_ + mult * atr_ : vstop1 plot(vstop, color = is_uptrend ? yellow : red, style=circles, linewidth=2) ///////////////////////////////////////////////////////////// //END - INDICATORS ///////////////////////////////////////////////////////////// //START - TRADING RULES direction = input(defval=1, title = "Strategy Direction", minval=-1, maxval=1) strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long)) condition1 = close > vstop and withinTimeRange condition2 = close < vstop and withinTimeRange strategy.entry("BUY", strategy.long, when = condition1) strategy.entry("SELL", strategy.short, when = condition2) ///////////////////////////////////////////////////////////// //END - TRADING RULES