Stratégie quantitative MACD de croisement de la moyenne mobile double

Auteur:ChaoZhang est là., Date: 2024-02-22 15:32:42 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie génère l'indicateur MACD en calculant la différence entre les lignes moyennes mobiles rapides et lentes, et juge la tendance et les zones de surachat / survente des marchés financiers avec la ligne de signal.

La logique de la stratégie

La logique de base est d'utiliser l'indicateur MACD généré à partir de la différence de MA rapide et lente pour déterminer la direction de la tendance du marché, et la ligne de signal pour juger des niveaux de surachat / survente. Lorsque le MACD et la ligne de signal forment une croix dorée, c'est un signal long pour aller long. Lorsqu'il se forme une croix morte, c'est un signal court pour aller court. Pendant ce temps, il utilise la relation de prixs avec la MA de 200 jours pour filtrer les signaux, prenant uniquement des signaux longs lorsque le prix est au-dessus de la MA de 200 jours et des signaux courts lorsque le prix est inférieur à la MA de 200 jours, afin d'éviter les coups de fouet lors de fortes tendances.

La méthode de calcul spécifique est la suivante:

  1. Moyenne mobile rapide (EMA de 12 jours) moins Moyenne mobile lente (EMA de 26 jours) pour obtenir le MACD
  2. L'EMA de 9 jours du MACD pour obtenir la ligne de signal
  3. MACD moins la ligne de signal pour obtenir l'histogramme MACD

Lorsque le MACD traverse au-dessus de la ligne de signal alors qu'ils sont tous les deux en dessous de 0, c'est un signal long de croix dorée. Lorsque le MACD traverse au-dessous de la ligne de signal alors qu'ils sont tous deux au-dessus de 0, c'est un signal court de croix morte. Pendant ce temps, il ne prend longtemps que lorsque le prix est au-dessus de 200 jours MA, et court lorsque le prix est en dessous de 200 jours MA.

Les avantages

  1. L'utilisation d'un système à deux indicateurs évite les limites d'un seul indicateur et améliore la précision
  2. La combinaison de l'action des prix et des doubles filtres de MA évite les crises lors de fortes tendances
  3. Une large marge d'optimisation des paramètres pour s'adapter aux différents environnements du marché
  4. Le réglage prudent des paramètres conduit à un nombre de signaux moindre mais de meilleure qualité
  5. Logique stratégique simple et facile à mettre en œuvre

Les risques

  1. La volatilité du marché peut entraîner des erreurs dans le jugement des indicateurs
  2. La nature tardive des aides à l'économie affecte la rapidité de la stratégie
  3. Moins de signaux peuvent manquer des opportunités de tendance
  4. Risques d'optimisation excessive lors de l'optimisation des paramètres
  5. Manque de contrôle du prélèvement et de mécanismes d'arrêt des pertes

Les risques peuvent être réduits en raccourcissant les périodes de mise en marché, en ajoutant d'autres indicateurs et en ajoutant un stop loss.

Directions d'optimisation

1.Testé sur différentes périodes de temps allant de 15m à 1D, résultats optimaux sur 4H en rendements ajustés au risque

2. Optimiser les MA rapides et lents afin que le MACD capture les cycles, 7-21 bon pour 15m

3.L'AMH de Hull pour le MACD a donné de bons résultats

4.L'arrêt de la perte par retard améliore la gestion des risques

Conclusion

Il s'agit globalement d'une stratégie très simple et pratique, générant des signaux de trading à haute probabilité grâce à un système à deux indicateurs et à un filtrage des prix. Il a une marge de profit relativement élevée, utilise la combinaison classique de paramètres MACD pour éviter une sur-optimisation. Il y a encore beaucoup de marge d'optimisation en ajustant les paramètres MA, en ajoutant d'autres indicateurs et des mécanismes de stop loss pour améliorer encore la performance.


/*backtest
start: 2024-02-14 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Hurmun

//@version=4
strategy("Simple MACD strategy ", overlay=true, margin_long=100, margin_short=100)


fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false)
// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


movinga2 = input(title="movinga 2", type=input.integer, defval=200)

movinga200 = sma(close, movinga2)

plot(movinga200, "MA", color.orange)
longCondition = crossover(macd, signal) and macd < 0 and signal < 0 and close > movinga200
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = crossunder(macd, signal) and macd > 0 and signal > 0 and close < movinga200
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)
    
shortProfitPerc = input(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100
longProfitPerc = input(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100
    
stoploss = input(title="stoploss in %", minval = 0.0, step=1, defval=2) /100

longStoploss = strategy.position_avg_price * (1 - stoploss)
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)

shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)
shortStoploss = strategy.position_avg_price * (1 + stoploss)
    
if (strategy.position_size > 0 )
    strategy.exit(id="XL TP", limit=longExitPrice, stop=longStoploss)






if (strategy.position_size < 0 )
    strategy.exit(id="XS TP", limit=shortExitPrice, stop=shortStoploss)

Plus de