Stratégie de négociation MACD avec ATR stop loss adaptatif

Auteur:ChaoZhang est là., Date: 2023-09-20 à 15h23
Les étiquettes:

Résumé

Cette stratégie utilise l'indicateur MACD pour générer des signaux de trading et un stop loss adaptatif basé sur ATR pour contrôler les risques.

La logique de la stratégie

  1. Le croisement de la ligne delta MACD 0 produit des signaux d'achat et de vente.

  2. L'exposition au risque est calculée sur la base des N dernières périodes d'ATR, ce qui reflète la volatilité.

  3. Le stop loss s'ajuste de manière adaptative aux changements de volatilité, s'élargissant lorsque la volatilité augmente.

  4. Mettre à jour le stop-loss en temps réel lorsque vous êtes en position, afin de verrouiller les bénéfices et de contrôler les risques.

  5. Exit positions lorsque le stop loss est déclenché pour gérer les risques.

Les avantages

  1. Le MACD est sensible au suivi des tendances.

  2. Les arrêts adaptatifs s'adaptent à différents environnements de marché, évitant les arrêts trop serrés ou trop lâches.

  3. Les lignes d'arrêt visuelles reflètent intuitivement l'état de risque.

  4. Des règles de stratégie simples et claires, faciles à comprendre et à mettre en œuvre.

  5. Des prélèvements contrôlables et une gestion efficace des risques.

Les risques

  1. Le MACD peut générer de faux signaux provoquant des pertes inutiles.

  2. Les paramètres d'ATR incorrects entraînent des arrêts trop serrés ou trop lâches.

  3. Risque d'arrêt trop fréquent.

  4. Difficile de s'arrêter quand la tendance est inversée.

  5. Risque de surajustement lors de l'optimisation des paramètres.

Amélioration

  1. Testez les paramètres MACD pour une combinaison optimale.

  2. Essayez d'autres méthodes d'arrêt comme les arrêts de trailing.

  3. Optimiser les arrêts pour équilibrer la fréquence et le contrôle des risques.

  4. Ajouter un filtre de tendance pour empêcher les arrêts de renversement.

  5. Prenez en considération l'impact des coûts de négociation pour éviter les sur-trades.

  6. Utilisez le glissement ou les arrêts renforcés pour assurer le déclenchement des arrêts.

Conclusion

Cette stratégie négocie des signaux MACD avec des arrêts dynamiques ATR adaptatifs. Elle présente des risques et une simplicité contrôlables. Mais les signaux MACD peuvent être faux et les arrêts nécessitent une optimisation continue.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-02-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("MACD BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() =>  true

///////////////  MACD  /////////////// 
fastLength = input(13) 
slowlength = input(30) 
MACDLength = input(12) 

MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD

///////////////  Strategy  /////////////// 
long = crossover(delta, 0)
short = crossunder(delta, 0)

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
atrLkb = input(2, minval=1, title='ATR Stop Period')
atrMult = input(1.25, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop = 0.0
longStop :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1]
shortStop = 0.0
shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1]

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("Long", strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long SL", "Long", stop=longStop, when=since_longEntry > 0)
    strategy.exit("Short SL", "Short", stop=shortStop, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
barcolor(long ? color.lime : short ? color.red : na)
plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=2)
plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=2)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)

Plus de