Stratégie dynamique de stop-profit et de stop-loss basée sur le double trailing stop ATR


Date de création: 2024-03-22 13:52:59 Dernière modification: 2024-03-22 13:52:59
Copier: 1 Nombre de clics: 616
1
Suivre
1617
Abonnés

Stratégie dynamique de stop-profit et de stop-loss basée sur le double trailing stop ATR

Aperçu

La stratégie utilise deux indicateurs ATR (Average True Range) de différentes périodes pour construire une ligne de stop de suivi dynamique double, générant un signal de transaction lorsque le prix franchit la ligne de stop. La stratégie utilise également la longueur de l’entité de la ligne d’aiguille pour définir dynamiquement le prix de stop pour réaliser un stop dynamique.

Principe de stratégie

  1. Calculer les valeurs de l’indicateur ATR de deux périodes différentes (défauts 10 et 20) et multiplier par leur coefficient de sensibilité respectif (défauts 1 et 2) pour obtenir deux largeurs de stop.
  2. Il génère des signaux de surchauffe ou de surchauffe en fonction de la position du prix au-dessus ou au-dessous des deux lignes de stop et de la situation de rupture.
  3. Le prix d’arrêt est calculé dynamiquement en fonction de 1,65 fois la longueur de l’entité de fil d’aiguille actuelle.
  4. Après l’ouverture de la position, si le prix atteint le seuil d’arrêt, la position est fermée.
  5. L’utilisation d’indicateurs tels que l’EMA aide à juger de la tendance actuelle et fournit une référence pour l’entrée.

La stratégie utilise les caractéristiques de l’indicateur ATR pour construire des doubles arrêts dynamiques, qui s’adaptent mieux aux différentes volatilités du marché, tout en répondant rapidement aux mutations du marché. La configuration des arrêts dynamiques permet à la stratégie d’obtenir plus de bénéfices en cas de tendance.

Analyse des avantages

  1. La double ligne de stop-loss dynamique est adaptée aux différentes fluctuations du marché et offre une plus grande flexibilité.
  2. Le prix d’arrêt est calculé en fonction de la dynamique de la longueur de l’entité de l’axe actuelle, permettant d’obtenir plus de bénéfices dans des conditions de tendance.
  3. L’utilisation d’indicateurs tels que les EMA pour aider à juger des tendances et fournir une référence pour les entrées augmente la fiabilité de la stratégie.
  4. La logique du code est claire, lisible, facile à comprendre et à optimiser.

Analyse des risques

  1. Dans les marchés en crise, les transactions fréquentes peuvent entraîner des frais de commissions plus élevés, affectant les bénéfices.
  2. Les paramètres des paramètres de la ligne d’arrêt et du multiplicateur d’arrêt doivent être optimisés en fonction des caractéristiques des différents marchés et produits. Des paramètres inappropriés peuvent entraîner une mauvaise performance de la stratégie.
  3. La stratégie repose principalement sur le fait que le prix brise la ligne de stop dynamique pour générer un signal, ce qui peut générer un signal erroné pour certaines fausses brèches de grandes fluctuations.

Direction d’optimisation

  1. Pour les marchés en crise, vous pouvez envisager d’introduire plus d’indicateurs ou de conditions pour filtrer les signaux de trading, tels que le RSI, le MACD, etc.
  2. Pour différents produits et marchés, il est possible de rechercher les paramètres et les multiples d’arrêt les plus optimaux en effectuant un historique et en optimisant les paramètres.
  3. L’introduction d’un module de gestion des positions et de contrôle des risques peut être envisagée, afin d’ajuster la taille des positions en fonction de la volatilité du marché et de la dynamique du risque du compte.
  4. L’ajout de plus d’indicateurs de tendance améliore la fiabilité et l’exactitude des signaux.

Résumer

La stratégie est mieux adaptée aux différents environnements de marché grâce à sa conception avec une double ligne de stop-loss dynamique et un arrêt dynamique. Elle fonctionne bien dans les conditions de tendance. Cependant, dans les marchés en turbulence, il est possible de faire face à des problèmes de négociation fréquente et de compensation des pertes.

Code source de la stratégie
/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="UT Bot Strategy", overlay=true)

// Inputs
a1 = input(1, title="Key Value 1 ('This changes the sensitivity')")
c1 = input(10, title="ATR Period 1")
a2 = input(2, title="Key Value 2 ('This changes the sensitivity')")
c2 = input(20, title="ATR Period 2")
h = input(false, title="Signals from Heikin Ashi Candles")

////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
 
// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2019, title="From Year", minval=1970)
 
// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2100, title="To Year", minval=1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate
 
////////////////////////////////////////////////////////////////////////////////

xATR1 = atr(c1)
nLoss1 = a1 * xATR1
xATR2 = atr(c2)
nLoss2 = a2 * xATR2

src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=false) : close

xATRTrailingStop1 = 0.0
xATRTrailingStop1 := iff(src > nz(xATRTrailingStop1[1], 0) and src[1] > nz(xATRTrailingStop1[1], 0), max(nz(xATRTrailingStop1[1]), src - nLoss1),
   iff(src < nz(xATRTrailingStop1[1], 0) and src[1] < nz(xATRTrailingStop1[1], 0), min(nz(xATRTrailingStop1[1]), src + nLoss1), 
   iff(src > nz(xATRTrailingStop1[1], 0), src - nLoss1, src + nLoss1)))

xATRTrailingStop2 = 0.0
xATRTrailingStop2 := iff(src > nz(xATRTrailingStop2[1], 0) and src[1] > nz(xATRTrailingStop2[1], 0), max(nz(xATRTrailingStop2[1]), src - nLoss2),
   iff(src < nz(xATRTrailingStop2[1], 0) and src[1] < nz(xATRTrailingStop2[1], 0), min(nz(xATRTrailingStop2[1]), src + nLoss2), 
   iff(src > nz(xATRTrailingStop2[1], 0), src - nLoss2, src + nLoss2)))
 
pos = 0   
pos := iff(src[1] < nz(xATRTrailingStop1[1], 0) and src > nz(xATRTrailingStop1[1], 0), 1,
   iff(src[1] > nz(xATRTrailingStop1[1], 0) and src < nz(xATRTrailingStop1[1], 0), -1, nz(pos[1], 0))) 
   
xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue 

ema1 = ema(src, 1)
above1 = crossover(ema1, xATRTrailingStop1)
below1 = crossover(xATRTrailingStop1, ema1)
buy1 = src > xATRTrailingStop1 and above1 
sell1 = src < xATRTrailingStop1 and below1
barbuy1 = src > xATRTrailingStop1 
barsell1 = src < xATRTrailingStop1 

ema2 = ema(src, 1)
above2 = crossover(ema2, xATRTrailingStop2)
below2 = crossover(xATRTrailingStop2, ema2)
buy2 = src > xATRTrailingStop2 and above2 
sell2 = src < xATRTrailingStop2 and below2
barbuy2 = src > xATRTrailingStop2 
barsell2 = src < xATRTrailingStop2 

plotshape(buy1,  title="Buy 1",  text='Buy 1',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell1, title="Sell 1", text='Sell 1', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)
plotshape(buy2,  title="Buy 2",  text='Buy 2',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell2, title="Sell 2", text='Sell 2', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)

barcolor(barbuy1  ? color.green : na)
barcolor(barsell1 ? color.red   : na)
barcolor(barbuy2  ? color.green : na)
barcolor(barsell2 ? color.red   : na)

// Calculate SL and TP levels
candle_size = abs(open - close)
tp_level = close + candle_size *65

// Close long positions if TP is hit
strategy.exit("TP Long", "long", limit=tp_level)

// Close short positions if TP is hit
strategy.exit("TP Short", "short", limit=tp_level)

// Enter long position
strategy.entry("long", strategy.long, when=(buy1 or buy2) and time_cond)

// Enter short position
strategy.entry("short", strategy.short, when=(sell1 or sell2) and time_cond)

//adding ema with width
// Calculate EMA and SMA
ema5 = ema(close, 5)
ema200 = ema(close, 200)
ema21 = ema(close, 21)
ema50 = ema(close, 50)
sma50 = sma(close, 50)

// Plot EMA and SMA with width
plot(ema5, color=color.rgb(130, 235, 139), title="EMA 5", linewidth=1)
plot(ema200, color=color.rgb(243, 246, 249), title="EMA 200", linewidth=2)
plot(ema21, color=color.blue, title="21", linewidth=1)
plot(ema50, color=color.rgb(255, 64, 0), title="EMA 50", linewidth=2)
//plot(sma50, color=color.purple, title="SMA 20", linewidth=2)