Stratégie de tendance dynamique croisée de la moyenne mobile MACD

Auteur:ChaoZhang est là., Date: le 19 février 2024 à 10h48
Les étiquettes:

img

Résumé

Cette stratégie est basée sur la combinaison des moyennes mobiles de l'indicateur MACD pour réaliser un jugement dynamique de la tendance à travers les périodes. Elle appartient à une stratégie de suivi de tendance plus classique. Elle juge principalement la direction et la force de la tendance actuelle à travers la différence entre les moyennes mobiles rapides et lentes du MACD et la relation entre sa ligne de signal.

Principe de stratégie

  1. Jugez la direction de la tendance actuelle en fonction de la différence entre les moyennes mobiles rapides et lentes de l'indicateur MACD et de sa relation avec la ligne de signal.
  2. La différence MACD qui traverse au-dessus de la ligne de signal est un signal long, et celle qui traverse en dessous est un signal court.
  3. Introduire la différence MACD et l'histogramme MACD dans le même sens pour améliorer les signaux de stratégie.
  4. Ajoutez un module de jugement transversal, utilisez l'indicateur MACD d'un délai plus long comme filtre de signal et base d'ajustement de position.
  5. Réglage dynamique de la position, réduction de la taille de la position lorsque le signal de cycle croisé est plus faible et augmentation de la position lorsque le signal est renforcé.

Analyse des avantages

  1. L'efficacité du MACD lui-même pour déterminer la direction de la tendance est relativement élevée.
  2. La combinaison de la différence MACD et de la double vérification de l'histogramme peut améliorer la précision du signal.
  3. Le jugement transversal améliore la stabilité de la stratégie et évite d'être induit en erreur par des signaux à haute fréquence.
  4. L'ajustement dynamique de la position permet à la stratégie de mieux saisir les opportunités et d'augmenter les rendements excédentaires.

Analyse des risques et solutions

  1. Les signaux MACD présentent un décalage, ce qui peut entraîner des effets de signal légèrement inférieurs.
  • Solution: Augmenter la différence entre les moyennes mobiles rapides et lentes pour capturer les signaux à l'avance.
  1. Les signaux croisés ne sont pas nécessairement précis et peuvent induire en erreur les stratégies.
  • Solution: mettre en place un mécanisme d'ajustement dynamique de la position pour assurer la prédominance de la stratégie du cycle principal.
  1. La stabilité globale des stratégies combinées à facteurs multiples peut être insuffisante.
  • Solution: ajuster soigneusement la proportion de poids de chaque paramètre stratégique pour assurer la robustesse globale.

Directions d'optimisation

  1. Tester les effets de différentes combinaisons de paramètres de cycle.
  2. Tester l'impact de différentes combinaisons transversales sur l'efficacité de la stratégie.
  3. Ajuster les paramètres de l'indicateur MACD, tels que les cycles de moyenne mobile rapide et lente, les cycles de lignes de signal, etc.
  4. Testez les effets de différents facteurs d'ajustement de position.
  5. Testez les effets des backtests sur d'autres variétés.

Résumé

Cette stratégie de tendance dynamique croisée de la moyenne mobile MACD intègre les avantages des indicateurs classiques et des références à plusieurs délais.


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

//@temelbulut
//@version=5
strategy('MACD Strategy %80', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=50)

fastLength = input.int(title='MACD Fast Length', defval=12, minval=1)
slowLength = input.int(title='MACD Slow Length', defval=26, minval=1)
signalLength = input.int(title='MACD Signal Length', defval=9, minval=1)
crossscore = input(title='Cross (buy/sell) Score', defval=10.)
indiside = input(title='indicator Direction Score', defval=8)
histside = input(title='Histogram Direction Score', defval=2)
shotsl = input(title='Show Stop Loss Line', defval=false)
Mult = input.float(title='Stop Loss Factor', defval=1.2, minval=0.1, maxval=100)
Period = input.int(title='Stop Loss Period', defval=10, minval=1, maxval=100)
lookaheadi = input(title='Lookahead', defval=true)

HTF = timeframe.period == '1' ? '5' : timeframe.period == '3' ? '15' : timeframe.period == '5' ? '15' : timeframe.period == '15' ? '60' : timeframe.period == '30' ? '60' : timeframe.period == '45' ? '60' : timeframe.period == '60' ? '240' : timeframe.period == '120' ? '240' : timeframe.period == '180' ? '240' : timeframe.period == '240' ? 'D' : timeframe.period == 'D' ? 'W' : 'W'

calc = timeframe.period == '1' ? 5 : timeframe.period == '3' ? 5 : timeframe.period == '5' ? 3 : timeframe.period == '15' ? 4 : timeframe.period == '30' ? 4 : timeframe.period == '45' ? 4 : timeframe.period == '60' ? 4 : timeframe.period == '120' ? 3 : timeframe.period == '180' ? 3 : timeframe.period == '240' ? 6 : timeframe.period == 'D' ? 5 : 1

count() =>
    indi = ta.ema(close, fastLength) - ta.ema(close, slowLength)
    signal = ta.ema(indi, signalLength)
    Anlyse = 0.0
    // direction of indi and histogram
    hist = indi - signal
    Anlyse := indi > indi[1] ? hist > hist[1] ? indiside + histside : hist == hist[1] ? indiside : indiside - histside : 0
    Anlyse += (indi < indi[1] ? hist < hist[1] ? -(indiside + histside) : hist == hist[1] ? -indiside : -(indiside - histside) : 0)
    Anlyse += (indi == indi[1] ? hist > hist[1] ? histside : hist < hist[1] ? -histside : 0 : 0)
    // cross now earlier ?
    countcross = indi >= signal and indi[1] < signal[1] ? crossscore : indi <= signal and indi[1] > signal[1] ? -crossscore : 0.
    countcross += nz(countcross[1]) * 0.6
    Anlyse += countcross
    nz(Anlyse)

Anlys = count()
AnlysHfrm = lookaheadi ? request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_on) : request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_off)
Result = (AnlysHfrm * calc + Anlys) / (calc + 1)

longCondition = ta.change(Result) != 0 and Result > 0
if longCondition
    strategy.entry('MACD Long', strategy.long,alert_message = 'MACD Long')

shortCondition = ta.change(Result) != 0 and Result < 0
if shortCondition
    strategy.entry('MACD Short', strategy.short,alert_message = 'MACD Short')

countstop(pos) =>
    Upt = hl2 - Mult * ta.atr(Period)
    Dnt = hl2 + Mult * ta.atr(Period)
    TUp = 0.
    TDown = 0.
    TUp := close[1] > TUp[1] ? math.max(Upt, TUp[1]) : Upt
    TDown := close[1] < TDown[1] ? math.min(Dnt, TDown[1]) : Dnt
    tslmtf = pos == 1 ? TUp : TDown
    tslmtf

pos = longCondition ? 1 : -1
stline = 0.
countstop__1 = countstop(pos)
security_1 = request.security(syminfo.tickerid, HTF, countstop__1)
stline := ta.change(time(HTF)) != 0 or longCondition or shortCondition ? security_1 : nz(stline[1])
plot(stline, color=shotsl ? color.rgb(148, 169, 18) : na, style=plot.style_line, linewidth=2, title='Stop Loss')



Plus de