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.
Les éléments clés sont les suivants:
MACD: Juge des changements de dynamique des prix.
EMA: Détermine la direction de la tendance des prix.
Condition de temps: Définition de la période de stratégie valide.
Option longue/courte: le choix de la direction longue ou courte.
Les règles de négociation sont les suivantes:
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.
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.
Comparativement aux indicateurs uniques, les principaux avantages sont les suivants:
Le MACD juge la dynamique à court terme, l'EMA détermine la direction de la tendance.
Des règles simples et claires, faciles à comprendre et à mettre en œuvre.
Adaptation flexible des paramètres pour différents produits et délais.
Option de négociation longue/courte ou bidirectionnelle.
Peut définir une période de stratégie valide pour éviter les transactions inutiles.
Des performances stables depuis des années.
Risque contrôlable par transaction.
Potentiel d'optimisation supplémentaire avec l'apprentissage automatique.
Malgré les avantages, il y a des risques à considérer:
Le réglage des paramètres larges risque un surajustement.
Aucun arrêt en place, risque des pertes illimitées.
Aucun filtre de volume, risque de fausses fuites.
Le retard dans la capture des virages de tendance, ne peut pas éviter toutes les pertes.
Dégradation des performances dues à l'évolution des régimes du marché.
Basée uniquement sur des données historiques, la robustesse du modèle est essentielle.
La fréquence élevée des échanges augmente les coûts de transaction.
Besoin de surveiller les ratios bénéfice/risque et les courbes d'équité.
La stratégie peut être renforcée par:
Ajout d'un filtre de volume pour éviter les fausses éruptions.
Mise en œuvre d'arrêts pour contrôler les pertes par transaction.
Évaluation de l'efficacité des paramètres sur des périodes de temps.
Incorporer l'apprentissage automatique pour des optimisations dynamiques.
Tests de robustesse sur tous les marchés.
J'ajuste le dimensionnement de la position pour réduire la fréquence.
Optimisation des stratégies de gestion des risques.
Test des instruments de diffusion pour augmenter la fréquence.
Tests arrière continus pour éviter les surajustements.
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)