Stratégie de trading MACD basée sur le stop loss ATR adaptatif


Date de création: 2023-09-20 15:23:00 Dernière modification: 2023-09-20 15:23:00
Copier: 1 Nombre de clics: 867
1
Suivre
1617
Abonnés

Aperçu

Cette stratégie utilise l’indicateur MACD pour générer des signaux de négociation et utilise un stop-loss adaptatif basé sur l’ATR pour contrôler le risque.

Principe de stratégie

  1. Le décalage delta de l’indicateur MACD sur l’axe 0 génère des signaux d’achat et de vente.

  2. Le stop-loss dynamique est calculé sur la base de l’ATR pour le cycle N le plus récent. L’ATR peut refléter la volatilité du marché.

  3. Le stop-loss s’adapte à la fluctuation du taux de volatilité et s’allège lorsque la volatilité augmente.

  4. Le stop loss est mis à jour en temps réel pendant la tenue d’un signal pour bloquer les bénéfices et contrôler les risques.

  5. Lorsque le stop-loss est déclenché, quittez la position et effectuez la maîtrise du risque.

Analyse des avantages

  1. Le MACD est plus sensible au suivi des tendances.

  2. Le stop-loss dynamique peut s’adapter à l’environnement du marché et éviter les stops trop rapprochés ou trop éloignés.

  3. La visualisation de la marge de stop loss reflète le risque visuellement.

  4. Les règles de la stratégie sont simples, claires et faciles à comprendre.

  5. Les retraits sont contrôlables et les risques sont bien gérés.

Analyse des risques

  1. Les indicateurs MACD peuvent générer de faux signaux entraînant des pertes inutiles.

  2. Les paramètres ATR sont mal définis, ce qui entraîne des problèmes de proximité ou de distance.

  3. Le risque de dommages trop fréquemment déclenchés

  4. La tendance est difficile à inverser et la perte de temps.

  5. Il peut y avoir un risque de suradaptation lors de l’optimisation des paramètres.

Direction d’optimisation

  1. Tester une combinaison de différents paramètres MACD pour trouver le paramètre optimal.

  2. Essayez d’autres méthodes de réduction des pertes, comme le suivi des pertes.

  3. Optimiser les paramètres de stop loss, équilibrer la fréquence de stop loss et le contrôle des risques.

  4. L’ajout d’un mécanisme de jugement de tendance pour éviter le stop-loss inverse.

  5. Prendre en compte l’impact des coûts de transaction et prévenir les transactions excessives.

  6. L’utilisation de points de glissement ou d’un arrêt renforcé assure l’effet d’arrêt.

Résumer

Cette stratégie est basée sur l’indicateur MACD, et utilise des stop-loss ATR adaptés. Elle présente des caractéristiques pratiques et faciles à contrôler. Cependant, les signaux MACD sont sujets aux erreurs de jugement, et le mécanisme de stop-loss doit être constamment optimisé.

Code source de la stratégie
/*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)