Chiến lược này là một chiến lược giao dịch hai hướng theo dõi biến động. Nó sử dụng chỉ số Average True Range (ATR) để thiết lập dừng lỗ và xác định hướng xu hướng dựa trên giá vượt qua mức dừng lỗ. Nó mở các vị trí ngược khi hướng xu hướng thay đổi.
Chiến lược này sử dụng ATR 3 ngày để tính biến động. Giá trị ATR nhân với một hệ số được sử dụng như mức dừng lỗ. Khi giá vượt quá mức dừng lỗ, nó đánh giá nó là xu hướng tăng và đóng các vị trí dài khi giá giảm xuống dưới mức dừng lỗ. Khi giá dưới mức dừng lỗ, nó đánh giá nó là xu hướng giảm và đóng các vị trí ngắn khi giá tăng lên trên mức dừng lỗ. Nó mở các vị trí ngược khi xu hướng thay đổi. Mức dừng lỗ được tối ưu hóa trong xu hướng và đặt lại khi xu hướng thay đổi.
Để giảm thiểu rủi ro: tăng hệ số ATR cho các mức dừng rộng hơn, hạn chế tần suất giao dịch, đặt mức lợi nhuận tối thiểu, v.v.
Đây là một chiến lược dừng kéo theo hai hướng ổn định nói chung. ATR thiết lập mức dừng năng động để kiểm soát giảm. Giao dịch hai hướng cũng làm tăng cơ hội lợi nhuận. Tăng cường tối ưu hóa hơn có thể làm cho chiến lược mạnh mẽ hơn, tăng khả năng theo dõi xu hướng.
/*backtest start: 2022-11-14 00:00:00 end: 2023-11-20 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("BCH Swinger v1", 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 = 2017, title = "From Year") ToMonth = input(defval = 10, title = "To Month", minval = 1) ToDay = input(defval = 01, 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