L'oscillateur MACD avec stratégie de croisement EMA

Auteur:ChaoZhang est là., Date: 23 septembre 2023 à 15h24
Les étiquettes:

Résumé

Il s'agit d'une stratégie de trading simple mais efficace combinant l'oscillateur MACD et le croisement EMA. Actuellement configuré pour les bougies 4h mais adaptable à d'autres délais. Il a bien fonctionné sur BTC et ETH au cours des 3 dernières années, battant buy and hold. Avec des optimisations, il peut être adapté pour les contrats à terme, les indices, le forex, les actions, etc.

La logique de la stratégie

Les éléments clés sont les suivants:

  1. MACD: Juge des changements de dynamique des prix.

  2. EMA: Détermine la direction de la tendance des prix.

  3. Condition de temps: Définition de la période de stratégie valide.

  4. Option longue/courte: le choix de la direction longue ou courte.

Les règles de négociation sont les suivantes:

  1. Longue/courte sortie: lorsque la clôture est supérieure à la EMA, l'histogramme MACD est positif et la bougie en cours est supérieure à la bougie précédente.

  2. Short/exit long: lorsque la clôture est inférieure à la EMA, l'histogramme MACD est négatif et la bougie en cours est inférieure à la bougie précédente.

La stratégie combine le suivi des tendances et l'élan dans un système simple et efficace.

Les avantages

Comparativement aux indicateurs uniques, les principaux avantages sont les suivants:

  1. Le MACD juge la dynamique à court terme, l'EMA détermine la direction de la tendance.

  2. Des règles simples et claires, faciles à comprendre et à mettre en œuvre.

  3. Adaptation flexible des paramètres pour différents produits et délais.

  4. Option de négociation longue/courte ou bidirectionnelle.

  5. Peut définir une période de stratégie valide pour éviter les transactions inutiles.

  6. Des performances stables depuis des années.

  7. Risque contrôlable par transaction.

  8. Potentiel d'optimisation supplémentaire avec l'apprentissage automatique.

Les risques

Malgré les avantages, il y a des risques à considérer:

  1. Le réglage des paramètres larges risque un surajustement.

  2. Aucun arrêt en place, risque des pertes illimitées.

  3. Aucun filtre de volume, risque de fausses fuites.

  4. Le retard dans la capture des virages de tendance, ne peut pas éviter toutes les pertes.

  5. Dégradation des performances dues à l'évolution des régimes du marché.

  6. Basée uniquement sur des données historiques, la robustesse du modèle est essentielle.

  7. La fréquence élevée des échanges augmente les coûts de transaction.

  8. Besoin de surveiller les ratios bénéfice/risque et les courbes d'équité.

Améliorations

La stratégie peut être renforcée par:

  1. Ajout d'un filtre de volume pour éviter les fausses éruptions.

  2. Mise en œuvre d'arrêts pour contrôler les pertes par transaction.

  3. Évaluation de l'efficacité des paramètres sur des périodes de temps.

  4. Incorporer l'apprentissage automatique pour des optimisations dynamiques.

  5. Tests de robustesse sur tous les marchés.

  6. J'ajuste le dimensionnement de la position pour réduire la fréquence.

  7. Optimisation des stratégies de gestion des risques.

  8. Test des instruments de diffusion pour augmenter la fréquence.

  9. Tests arrière continus pour éviter les surajustements.

Conclusion

En résumé, la stratégie forme un système simple mais puissant à partir de la combinaison du MACD et de l'EMA. Mais les optimisations continues et les tests de robustesse sont essentiels pour toute stratégie pour s'adapter aux conditions changeantes du marché.


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

//@version=4
strategy("My Script", overlay=true)

//heiking ashi calculation
UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")
//
// === /INPUTS ===

// === BASE FUNCTIONS ===

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//timecondition
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2020, title = "From Year", minval = 1970)
 //monday and session 
 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2021, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true

//ema data  -- moving average
len = input(9, minval=1, title="Length")
src = input(hl2, title="Source")
out = ema(src, len)
//plot(out, title="EMA", color=color.blue)

//histogram
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
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)

// 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


//main variables to apply conditions are going to be out(moving avg) and hist(macd)

long = haClose > out and haClose > haClose[1] and out > out[1] and hist> 0 and hist[1] < 0 and time_cond
short = haClose < out and haClose < haClose[1] and out < out[1] and hist < 0 and hist[1] > 0 and time_cond

//limit to 1 entry
var longOpeneda = false
var shortOpeneda = false
var int timeOfBuya = na



longCondition= long and not longOpeneda 

if longCondition
    longOpeneda := true
    timeOfBuya := time


longExitSignala = short
exitLongCondition = longOpeneda[1] and longExitSignala

if exitLongCondition
    longOpeneda := false
    timeOfBuya := na


plotshape(longCondition, style=shape.labelup, location=location.belowbar, color=color.green, size=size.tiny, title="BUY", text="BUY", textcolor=color.white)
plotshape(exitLongCondition, style=shape.labeldown, location=location.abovebar, color=color.red, size=size.tiny, title="SELL", text="SELL", textcolor=color.white)

//automatization

longEntry= input(true)
shortEntry=input(false)

if(longEntry)
    strategy.entry("long",strategy.long,when=longCondition)
    strategy.close("long",when=exitLongCondition)

if(shortEntry)
    strategy.entry("short",strategy.short,when=exitLongCondition)
    strategy.close("short",when=longCondition)



Plus de