Stratégie dynamique d'arrêt des pertes et de prise de bénéfices basée sur un double arrêt de suivi ATR

Auteur:ChaoZhang est là., Date: 2024-03-22 13:52:59 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie construit deux lignes de stop-loss dynamiques à l'aide de deux indicateurs Average True Range (ATR) avec des périodes différentes, générant des signaux de trading lorsque le prix franchit les lignes de stop-loss. Elle définit également dynamiquement le niveau de profit basé sur la longueur du corps de la bougie actuelle pour atteindre un stop-loss et un profit dynamiques.

Principes de stratégie

  1. Calculer les valeurs de l'indicateur ATR pour deux périodes différentes (défaut 10 et 20) puis les multiplier par leurs coefficients de sensibilité respectifs (défaut 1 et 2) pour obtenir deux largeurs de stop-loss.
  2. Générer des signaux longs ou courts en fonction de la position de prix au-dessus ou en dessous des deux lignes de stop-loss et de la situation de rupture.
  3. Le niveau de prise de profit est calculé dynamiquement sur la base de 1,65 fois (réglable) la longueur actuelle du corps de la bougie.
  4. Après ouverture d'une position, si le prix atteint le niveau de prise de profit, la position est fermée pour prendre des profits.
  5. Utiliser des indicateurs tels que l'EMA pour aider à juger de la tendance actuelle et fournir une référence pour l'entrée.

Cette stratégie utilise les caractéristiques de l'indicateur ATR pour construire des stop-loss dynamiques doubles, qui peuvent bien s'adapter aux différentes volatilités du marché et répondre rapidement aux changements du marché.

Analyse des avantages

  1. Les lignes de stop-loss dynamiques doubles peuvent s'adapter à différentes volatilités du marché et sont très souples.
  2. Le niveau de prise de profit est calculé dynamiquement en fonction de la longueur actuelle du corps de la bougie, ce qui permet d'obtenir plus de profits sur les marchés tendance.
  3. L'utilisation de l'EMA et d'autres indicateurs pour aider à juger de la tendance fournit une référence pour l'entrée et renforce la fiabilité de la stratégie.
  4. La logique du code est claire et lisible, ce qui le rend facile à comprendre et à optimiser.

Analyse des risques

  1. Dans les marchés à plage, les transactions fréquentes peuvent entraîner des coûts de transaction élevés et affecter la rentabilité.
  2. Les paramètres des lignes de stop-loss et des multiplicateurs des bénéfices doivent être optimisés en fonction des différentes caractéristiques du marché et du produit; des paramètres inappropriés peuvent entraîner de mauvaises performances de la stratégie.
  3. La stratégie repose principalement sur les écarts de prix de lignes de stop-loss dynamiques pour générer des signaux, qui peuvent produire de faux signaux dans certains faux écarts à forte fluctuation.

Directions d'optimisation

  1. Pour les marchés liés à la fourchette, envisagez d'introduire plus d'indicateurs ou de conditions pour filtrer les signaux de négociation, tels que le RSI et le MACD.
  2. Pour différents produits et marchés, le backtesting historique et l'optimisation des paramètres peuvent être utilisés pour trouver les paramètres optimaux de la ligne stop-loss et les multiplicateurs de profit.
  3. Envisager l'introduction de modules de gestion des positions et de contrôle des risques pour ajuster dynamiquement la taille des positions en fonction de la volatilité du marché et du risque du compte.
  4. Ajouter plus d'indicateurs de jugement de tendance pour améliorer la fiabilité et l'exactitude des signaux.

Résumé

Cette stratégie, avec sa conception de lignes de stop-loss dynamiques doubles et de prise de profit dynamique, peut bien s'adapter à différents environnements de marché et bien fonctionner sur les marchés en tendance. Cependant, sur les marchés à plage, elle peut faire face au problème des transactions fréquentes et des compensations de profit et de perte. Par conséquent, cette stratégie est plus appropriée pour une utilisation sur les marchés en tendance et doit être optimisée et ajustée en fonction des caractéristiques du produit et des conditions du marché. En outre, il reste encore une marge d'optimisation supplémentaire, comme l'introduction de plus de conditions de filtrage, de gestion de position et de modules de contrôle des risques pour améliorer la robustesse et la rentabilité 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)

Plus de