Stratégie de jugement de tendance dynamique MACD basée sur la moyenne mobile


Date de création: 2024-02-19 10:48:11 Dernière modification: 2024-02-19 10:48:11
Copier: 0 Nombre de clics: 598
1
Suivre
1617
Abonnés

Stratégie de jugement de tendance dynamique MACD basée sur la moyenne mobile

Aperçu

La stratégie est basée sur une combinaison de lignes de moyenne des indicateurs MACD, permettant de déterminer la tendance dynamique à travers les périodes de temps. Elle appartient à la stratégie de suivi de tendance classique.

Principe de stratégie

  1. Déterminez la direction de la tendance actuelle en fonction de la différence de la ligne moyenne rapide de l’indicateur MACD et de sa relation avec la ligne de signal
  2. La différence de MACD est le signal de passage en haut pour le signal de passage en bas pour le signal de passage en bas.
  3. L’introduction de la différence MACD et de la colonne MACD est synchronisée pour renforcer le signal stratégique
  4. Ajout d’un module de jugement inter-périodes, en utilisant les MACD de périodes plus élevées comme base de filtrage du signal et de régulation de la position
  5. Adaptation dynamique des positions, réduction de la taille des positions lorsque le signal intercyclique est faible, augmentation des positions lorsque le signal est renforcé

Analyse des avantages

  1. L’indicateur MACD lui-même est plus efficace pour déterminer la direction de la tendance
  2. La combinaison de la différence MACD et de la double vérification des lignes colonnades améliore la précision du signal
  3. Les jugements intercycliques améliorent la stabilité des stratégies et évitent les signaux de haute fréquence trompeurs
  4. Les ajustements de position dynamiques permettent aux stratégies de mieux saisir les opportunités et d’améliorer les gains excédentaires

Analyse des risques et solutions

  1. Le signal MACD est retardé, ce qui peut entraîner une faible efficacité.
  • Solution: ajouter la moyenne rapide et la moyenne lente afin de prévoir le signal
  1. Les signaux intercycliques ne sont pas toujours précis et peuvent induire en erreur les stratégies
  • La solution: introduire un mécanisme d’ajustement dynamique des positions, permettant à la stratégie de cycle principal de dominer
  1. La stratégie combinée multifactorielle peut ne pas être suffisamment stable dans l’ensemble
  • La solution: ajuster soigneusement la proportion des paramètres de la stratégie pour assurer une bonne santé globale

Direction d’optimisation

  1. Tester l’effet de différentes combinaisons de paramètres périodiques
  2. Tester l’impact de différentes combinaisons inter-cycle sur les effets de la stratégie
  3. Ajustez les paramètres de l’indicateur MACD, tels que le cycle de la ligne moyenne rapide et lente, le cycle de la ligne de signal, etc.
  4. Tester l’efficacité de différents facteurs de régulation des positions
  5. Tests de retour sur d’autres variétés

Résumer

Le MACD est une combinaison linéaire de stratégies de tendances dynamiques sur plusieurs périodes, qui intègre les avantages de l’analyse des indicateurs classiques et des références à plusieurs périodes. Grâce à l’optimisation des paramètres et aux tests combinés, il est possible de construire une stratégie de suivi de tendances plus stable et plus rentable.

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