Cette stratégie est une stratégie de trading bidirectionnelle qui suit la volatilité. Elle utilise l'indicateur Average True Range (ATR) pour définir les stop-loss et détermine la direction de la tendance en fonction du prix qui franchit le niveau de stop-loss. Elle ouvre des positions inversées lorsque la direction de la tendance change.
La stratégie utilise l'ATR à 3 jours pour calculer la volatilité. La valeur ATR multipliée par un coefficient est utilisée comme niveau de stop loss. Lorsque le prix est au-dessus du niveau de stop loss, elle le juge comme une tendance haussière et ferme les positions longues lorsque le prix tombe en dessous du niveau de stop loss. Lorsque le prix est en dessous du niveau de stop loss, elle le juge comme une tendance baissière et ferme les positions courtes lorsque le prix dépasse le niveau de stop loss. Elle ouvre des positions inverses lorsque la tendance change. Le niveau de stop loss est optimisé pendant les tendances et réinitialisé lorsque les tendances changent.
Pour atténuer les risques: augmenter le coefficient ATR pour des niveaux d'arrêt plus larges, limiter la fréquence des transactions, fixer des niveaux minimaux de prise de profit, etc.
Il s'agit d'une stratégie globale stable de trailing stop bidirectionnelle. ATR définit des niveaux d'arrêt dynamiques pour contrôler les retraits. Le trading bidirectionnel augmente également les chances de profit.
/*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