Cette stratégie de croisement des moyennes mobiles d'indices multi-cycles est un système de négociation automatisé basé sur des signaux de croisement de l'EMA. Elle utilise des EMA de différents cycles de temps pour générer des signaux de négociation et combine un mécanisme de blocage des pertes et des gains pour gérer les risques. La stratégie repose principalement sur le croisement entre l'EMA rapide et l'EMA lente et l'EMA à plus long terme pour identifier les opportunités de négociation potentielles.
Le principe de base de cette stratégie est d'utiliser des moyennes mobiles indicielles (EMA) sur plusieurs cycles de temps pour identifier les tendances du marché et générer des signaux de trading; plus précisément:
Utiliser une EMA de 9 cycles comme ligne rapide, une EMA de 50 cycles comme ligne lente, et une EMA de 100 cycles sur une période de 15 minutes comme ligne de référence pour une période de temps plus longue.
Les conditions d'achat du signal:
Conditions de vente du signal:
Gestion des transactions:
Le temps de négociation est contrôlé:
L'analyse multi-cycles: la combinaison d'EMAs de différentes cycles peut aider à réduire les faux signaux et à améliorer la qualité des transactions.
Suivi des tendances: Capture efficace des tendances du marché grâce à l'intersection des EMA et des relations de position.
Gestion des risques: l'utilisation d'une stratégie fixe de cessation des pertes et de progression des bénéfices limite les pertes potentielles tout en permettant aux bénéfices de continuer à augmenter.
Flexibilité: les paramètres EMA, les niveaux de stop-loss et de profit peuvent être ajustés en fonction des différents marchés et styles de trading.
Automatisation: les stratégies permettent de réaliser des transactions entièrement automatisées via la plateforme TradingView et PineConnector.
Gestion du temps: il est possible de définir des heures et des jours de négociation spécifiques pour éviter de négocier dans un environnement de marché défavorable.
La latence: L'EMA est par nature un indicateur retardé qui peut ne pas réagir en temps opportun dans un marché fortement volatile.
Faux signaux: Dans les marchés à travers, le croisement de l'EMA peut générer des faux signaux fréquents, ce qui entraîne une survente.
Stop-loss fixe: les stop-loss utilisant un nombre de points fixe peuvent ne pas être adaptés à toutes les conditions du marché et peuvent parfois être trop grands ou trop petits.
Dépendance des données historiques: l'efficacité de la stratégie dépend fortement de l'évolution du marché au cours de la période de révision, qui peut éventuellement évoluer différemment dans le futur.
Adaptabilité au marché: la stratégie fonctionne bien sur certaines paires de devises, mais peut mal fonctionner sur d'autres.
Ajustement des paramètres dynamiques: considérer l'ajustement des cycles EMA, des niveaux de stop-loss et de profit en fonction de la dynamique de la volatilité du marché.
Augmentation des conditions de filtrage: l'introduction d'indicateurs techniques supplémentaires ou d'indicateurs de l'humeur du marché pour filtrer les signaux de transaction et réduire les faux signaux.
Amélioration des stratégies de stop-loss: réaliser des stops de suivi ou des stops dynamiques basés sur l'ATR pour mieux s'adapter aux fluctuations du marché.
Optimiser les horaires de négociation: effectuer une analyse de temps plus détaillée pour trouver les meilleures heures et dates de négociation.
Augmentation de la gestion des volumes de négociation: ajustement de la taille des positions en fonction de la volatilité du marché et du risque du compte.
L'analyse de la corrélation entre les deux devises: considérer la corrélation entre plusieurs paires de devises afin d'éviter une exposition excessive à des risques de marché similaires.
Intégration de l'apprentissage automatique: utilisation d'algorithmes d'apprentissage automatique pour optimiser la sélection de paramètres et le processus de génération de signaux.
La stratégie de croisement des moyennes mobiles des indices multi-périodes est un système de trading automatisé qui combine le suivi des tendances et la gestion des risques. La stratégie vise à capturer les tendances du marché et à effectuer des transactions au moment opportun en utilisant des signaux de croisement EMA de différentes périodes. Bien que la stratégie fonctionne bien dans certaines conditions du marché, elle présente des risques et des limitations inhérents.
/*backtest start: 2023-07-30 00:00:00 end: 2024-07-29 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Miles Multi TF EMA Strategy v 1", overlay=true) Fast = input.int(9, "Fast EMA") Xslow = input.int(50, "Slow EMA") var bool inTrade = false // Ensure inTrade is declared and initialized var int tradeDirection = 0 var float buy_slPrice = na var float buy_tp1Price = na var float buy_tp2Price = na var float sell_slPrice = na var float sell_tp1Price = na var float sell_tp2Price = na var bool tp1Hit = false var bool buytp1Hit = false var bool selltp1Hit = false var float entryPrice = na var float lastSignalBar = na fastEMA = ta.ema(close, Fast) XslowEMA = ta.ema(close, Xslow) var int step = 0 // Example SL and TP settings (adjust according to your strategy) slPips = input.int(150, "Stop Loss") tp1Pips = input.int(75, "Take Profit 1") tp2Pips = input.int(150, "Take Profit 2") beoff = input.int(25, "Breakeven Offset") // Define the higher time frame higherTimeFrame = input.timeframe("15", "Higher Timeframe EMA") // Fetch the EMA from the higher time frame higherTimeFrameEMA = request.security(syminfo.tickerid, higherTimeFrame, ta.ema(close, 100)) // Input for trading start and end times, allowing end time to extend beyond midnight startHour = input.int(1, "Start Hour", minval=0, maxval=23) endHour = input.int(25, "End Hour", minval=0, maxval=47) // Extend maxval to 47 to allow specifying times into the next day // Adjust endHour to be within 24-hour format using modulo operation adjustedEndHour = endHour % 24 // Function to determine if the current time is within the trading hours isTradingTime(currentHour) => if startHour < adjustedEndHour currentHour >= startHour and currentHour < adjustedEndHour else currentHour >= startHour or currentHour < adjustedEndHour // Get the current hour in the exchange's timezone currentHour = hour(time, "Australia/Sydney") // Check if the current time is within the trading hours trading = isTradingTime(currentHour) // Plot background color if within trading hours bgcolor(trading ? color.new(color.blue, 90) : na) // Inputs for trading days tradeOnMonday = input.bool(true, "Trade on Monday") tradeOnTuesday = input.bool(true, "Trade on Tuesday") tradeOnWednesday = input.bool(true, "Trade on Wednesday") tradeOnThursday = input.bool(true, "Trade on Thursday") tradeOnFriday = input.bool(true, "Trade on Friday") // Current time checks currentDayOfWeek = dayofweek(time, "Australia/Sydney") // Check if current time is within trading hours isTradingHour = (currentHour >= startHour and currentHour < endHour) // Check if trading is enabled for the current day of the week isTradingDay = (currentDayOfWeek == dayofweek.monday and tradeOnMonday) or (currentDayOfWeek == dayofweek.tuesday and tradeOnTuesday) or (currentDayOfWeek == dayofweek.wednesday and tradeOnWednesday) or (currentDayOfWeek == dayofweek.thursday and tradeOnThursday) or (currentDayOfWeek == dayofweek.friday and tradeOnFriday) // Combined check for trading time and day isTradingTime = isTradingHour and isTradingDay buySignal = false sellSignal = false // Conditions if (step == 0 or step == 4) and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA step := 1 if (step == 0 or step == 4) and ta.crossover(fastEMA, higherTimeFrameEMA) step := 1 if step == 3 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA step := 3 if step == 2 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA step := 1 if (step == 0 or step == 3) and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA step := 2 if (step == 0 or step == 3) and ta.crossunder(fastEMA, higherTimeFrameEMA) step := 2 if step == 4 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA step := 4 if step == 1 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA step := 2 // For buy signals if step == 1 and isTradingTime and fastEMA > ta.ema(close, Xslow) and fastEMA > higherTimeFrameEMA buySignal := true inTrade := true entryPrice := close tradeDirection := 1 buytp1Hit := false lastSignalBar := bar_index buy_slPrice := entryPrice - slPips * syminfo.mintick buy_tp1Price := entryPrice + tp1Pips * syminfo.mintick // Set TP1 buy_tp2Price := entryPrice + tp2Pips * syminfo.mintick // Set TP2 tp1Hit := false step := 3 strategy.entry("Buy", strategy.long, stop=buy_slPrice, limit=buy_tp1Price) if step == 2 and isTradingTime and fastEMA < ta.ema(close, Xslow) and fastEMA < higherTimeFrameEMA sellSignal := true inTrade := true entryPrice := close tradeDirection := -1 lastSignalBar := bar_index selltp1Hit := false sell_slPrice := entryPrice + slPips * syminfo.mintick sell_tp1Price := entryPrice - tp1Pips * syminfo.mintick // Set TP1 sell_tp2Price := entryPrice - tp2Pips * syminfo.mintick // Set TP2 tp1Hit := false step := 4 strategy.entry("Sell", strategy.short, stop=sell_slPrice, limit=sell_tp1Price) // Move SL to breakeven once TP1 is hit and close 25% of the trade if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) > 0) if high >= buy_tp1Price and not tp1Hit tp1Hit := true buy_slPrice := entryPrice + beoff * syminfo.mintick strategy.close("Buy", qty_percent = 25, comment = "TP1 Hit") strategy.exit("Close", from_entry="Buy", stop=buy_slPrice, limit=buy_tp2Price) if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) < 0) if low <= sell_tp1Price and not tp1Hit tp1Hit := true sell_slPrice := entryPrice - beoff * syminfo.mintick strategy.close("Sell", qty_percent = 25, comment = "TP1 Hit") strategy.exit("Close", from_entry="Sell", stop=sell_slPrice, limit=sell_tp2Price) // Managing the trade after it's initiated if inTrade and tradeDirection == 1 and sellSignal inTrade := false tradeDirection := 0 buy_slPrice := na buy_tp1Price := na buy_tp2Price := na tp1Hit := false step := 2 if inTrade and tradeDirection == -1 and buySignal inTrade := false tradeDirection := 0 sell_slPrice := na sell_slPrice := na sell_tp2Price := na tp1Hit := false step := 1 if inTrade and tradeDirection == 1 and step == 1 step := 0 if inTrade and tradeDirection == -1 and step == 2 step := 0 if inTrade and tradeDirection == 1 and (bar_index - lastSignalBar) >= 1 if high >= buy_tp1Price and not tp1Hit tp1Hit := true buytp1Hit := true lastSignalBar := bar_index buy_slPrice := entryPrice + beoff * syminfo.mintick step := 3 if low <= buy_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1 strategy.close("Buy", qty_percent = 100, comment = "SL Hit") inTrade := false tradeDirection := 0 buy_slPrice := na buy_tp1Price := na buy_tp2Price := na tp1Hit := false buytp1Hit := false step := 0 if inTrade and tradeDirection == 1 and tp1Hit and (bar_index - lastSignalBar) >= 1 if low <= buy_slPrice inTrade := false tradeDirection := 0 buy_slPrice := na buy_tp1Price := na buy_tp2Price := na tp1Hit := false buytp1Hit := false step := 0 if high >= buy_tp2Price and (bar_index - lastSignalBar) >= 1 inTrade := false tradeDirection := 0 buy_slPrice := na buy_tp1Price := na buy_tp2Price := na tp1Hit := false buytp1Hit := false step := 0 if inTrade and tradeDirection == -1 and (bar_index - lastSignalBar) >= 1 if low <= sell_tp1Price and not tp1Hit tp1Hit := true lastSignalBar := bar_index selltp1Hit := true sell_slPrice := entryPrice - beoff * syminfo.mintick step := 4 if high >= sell_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1 strategy.close("Sell", qty_percent = 100, comment = "SL Hit") inTrade := false tradeDirection := 0 sell_slPrice := na sell_tp1Price := na sell_tp2Price := na tp1Hit := false selltp1Hit := false step := 0 if inTrade and tradeDirection == -1 and tp1Hit and (bar_index - lastSignalBar) >= 1 if high >= sell_slPrice inTrade := false tradeDirection := 0 sell_slPrice := na sell_tp1Price := na sell_tp2Price := na tp1Hit := false selltp1Hit := false step := 0 if low <= sell_tp2Price inTrade := false tradeDirection := 0 sell_slPrice := na sell_tp1Price := na sell_tp2Price := na tp1Hit := false selltp1Hit := false step := 0