Stratégie d'équilibrage de la tendance MACD

Auteur:ChaoZhang est là., Date: 2023-10-17 16h15 et 53 min
Les étiquettes:

img

Résumé

Il s'agit d'une stratégie de suivi de tendance qui identifie les directions haussières et baissières à l'aide de l'indicateur MACD. Il génère la ligne principale MACD en calculant la différence entre les moyennes mobiles rapides et lentes.

La logique de la stratégie

Le code définit d'abord le délai de backtesting pour tester la performance historique de la stratégie.

L'indicateur MACD est ensuite calculé, y compris les paramètres de longueur pour la moyenne mobile rapide, la moyenne mobile lente et la moyenne mobile MACD. La ligne rapide réagit plus sensiblement et la ligne lente réagit plus régulièrement. Leur différence forme la ligne principale MACD, qui est ensuite lissée par une moyenne mobile pour former la ligne de signal MACD. Lorsque la différence dépasse la ligne zéro, un signal haussier est généré.

Lorsque les lignes rapides et lentes se croisent, confirmer et enregistrer les signaux d'achat/vente, puis une position peut être ouverte.

Après avoir entré dans une position, suivez continuellement le prix le plus élevé et le plus bas de la position.

Les avantages

  1. L'indicateur MACD peut identifier efficacement les tendances et est l'un des indicateurs techniques classiques.

  2. La différence entre les moyennes mobiles rapides et lentes permet de détecter rapidement l'élan des prix et les changements de direction.

  3. L'effet de filtrage des moyennes mobiles aide à filtrer certains faux signaux.

  4. La stratégie intègre un mécanisme de stop loss pour contrôler les risques.

Les risques

  1. Le MACD est enclin à générer de faux signaux avec un espace d'optimisation limité.

  2. Le placement de stop loss inapproprié peut être trop actif ou conservateur, nécessitant une optimisation individuelle entre les produits.

  3. Le dimensionnement des positions fixes peut facilement conduire à un effet de levier excessif, considérez le dimensionnement des positions en fonction de la taille du compte.

  4. La justification des délais de backtest doit être validée afin d'éviter un surajustement.

Optimisation

  1. Optimiser les combinaisons de moyennes mobiles rapides et lentes pour trouver les meilleurs paramètres adaptés aux différents produits.

  2. Ajoutez d'autres indicateurs comme les chandeliers, les bandes de Bollinger, le RSI pour filtrer les signaux.

  3. Évaluer les différents niveaux d'arrêt de perte en fonction du taux de réduction, du ratio Sharpe.

  4. Explorez les techniques de stop-loss comme le stop-loss, les ordres limités.

  5. Testez la dimensionnement dynamique des positions basé sur le capital, la volatilité.

Conclusion

La stratégie d'équilibrage de tendance MACD est basée sur l'indicateur classique MACD. Elle a la capacité de capturer de manière sensible la dynamique des prix et peut être bien adaptée à différents produits grâce à l'optimisation des paramètres.


/*backtest
start: 2023-09-16 00:00:00
end: 2023-10-16 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
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)

/////////////// Component Code Start ///////////////
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)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true

///////////////  MACD Component - Default settings for one day. /////////////// 
fastLength = input(12) // 72 for 4hr
slowlength = input(26) // 156 for 4 hr
MACDLength = input(12)  // 12 for 4hr

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

long = crossover(delta, 0) 
short = crossunder(delta, 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 = 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 = 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 = 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])

sl_inp = input(5.0, title='Stop Loss %', type=float)/100

/////////////// Strategy Component /////////////// 
// Strategy Entry
if testPeriod()
    strategy.entry("Long Entry",  strategy.long, when=long_signal)
    strategy.entry("Short Entry", strategy.short, when=short_signal)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

// Strategy SL Exit
if testPeriod()
    strategy.exit("Long SL", "Long Entry", stop=long_sl, when=since_longEntry > 1)
    strategy.exit("Short SL", "Short Entry", stop=short_sl, when=since_shortEntry > 1)

//plot(strategy.equity, title="equity", color=blue, linewidth=2, style=areabr)

Plus de