Stratégie à double sens de déglutition de la volatilité

Auteur:ChaoZhang est là., Date: le 21 janvier 2023 12:04:19
Les étiquettes:

img

Résumé

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 logique de la stratégie

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.

Analyse des avantages

  • Utilise l'ATR pour suivre dynamiquement la volatilité du marché et réduire les risques d'arrêt des pertes
  • Les bénéfices du commerce bidirectionnel résultant des fluctuations du marché
  • Ouvre des positions inversées au début des changements de tendance pour un taux de gain plus élevé

Analyse des risques

  • La volatilité extrême peut entraîner un échec de l'arrêt des pertes à mesure que l'ATR est retardé
  • Il existe un risque d'écart de rentabilité pour les positions longues
  • Peut négocier de petits bénéfices fréquemment

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.

Directions d'optimisation

  • Combiner d'autres indicateurs pour les signaux de changement de tendance
  • Optimiser les paramètres ATR
  • Ajouter le contrôle de taille des transactions

Résumé

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

Plus de