La stratégie EMA Cross ADR est une stratégie de trading quantitative basée sur la plateforme TradingView. Elle combine plusieurs indicateurs techniques pour déterminer les tendances, filtrer les signaux et définir les niveaux de stop-loss et de take-profit. La stratégie utilise deux moyennes mobiles exponentielles (MAE) avec des périodes différentes pour identifier la tendance principale, utilise la plage quotidienne moyenne (ADR) comme filtre de volatilité et définit dynamiquement les niveaux de stop-loss et de take-profit en fonction d'un ratio risque-rendement. En outre, la stratégie intègre des mesures de gestion des risques telles qu'une fenêtre de temps de négociation, des arrêts de rentabilité et une limite de perte maximale quotidienne, visant à capturer les opportunités de tendance tout en contrôlant strictement le risque à la baisse.
Double EMA Crossover: La stratégie utilise deux EMA avec des périodes différentes pour déterminer la tendance. Lorsque l'EMA à court terme franchit le niveau supérieur de l'EMA à long terme, il est considéré comme une tendance haussière, générant un signal long; inversement, lorsque l'EMA à court terme franchit le niveau inférieur de l'EMA à long terme, il est considéré comme une tendance baissière, générant un signal court.
Filtre de volatilité ADR: afin d'éviter de générer des signaux de négociation dans des environnements à faible volatilité, la stratégie introduit l'indicateur ADR comme filtre de volatilité.
Fenêtre de temps de négociation: La stratégie permet aux utilisateurs de définir les heures de début et de fin pour le trading quotidien. Les transactions ne sont exécutées que dans la fenêtre de temps spécifiée, ce qui aide à éviter les périodes illiquides ou très volatiles.
L'option de prise de profit et de stop-loss dynamique: la stratégie calcule dynamiquement les prix de prise de profit et de stop-loss en fonction des prix moyens les plus élevés et les plus bas des N bougies les plus récentes, combinés à un ratio risque-rendement prédéfini.
Stop au seuil de rentabilité: lorsqu'une position atteint un certain niveau de profit (ratio risque-rendement défini par l'utilisateur), la stratégie déplace le stop-loss au seuil de rentabilité (prix d'entrée).
Limite de perte quotidienne maximale: Pour contrôler la perte maximale par jour, la stratégie fixe une limite de perte quotidienne. Une fois que la perte quotidienne atteint cette limite, la stratégie cesse de négocier jusqu'à l'ouverture du jour suivant.
Fermer toutes les positions à la fin de la journée: indépendamment du fait que les positions aient atteint les niveaux de prise de profit ou de stop-loss, la stratégie ferme toutes les positions à une heure fixe chaque jour de négociation (par exemple, à 16h00) afin d'éviter le risque du jour au lendemain.
Une forte capacité de suivi des tendances: en utilisant des croisements doubles de l'EMA pour déterminer les tendances, la stratégie peut capturer efficacement les principales tendances du marché, améliorant ainsi le taux de réussite et le potentiel de profit.
Une bonne adaptabilité à la volatilité: l'introduction de l'indicateur ADR en tant que filtre de volatilité permet d'éviter des opérations fréquentes dans des environnements à faible volatilité, réduisant les pertes causées par des signaux non valides et des fausses ruptures.
Contrôle strict des risques: la stratégie définit des mesures de contrôle des risques à partir de plusieurs dimensions, y compris des arrêts de perte et des prises de bénéfices dynamiques, des arrêts de rentabilité et des limites de perte quotidiennes maximales, contrôlant efficacement le risque à la baisse et améliorant les rendements ajustés au risque.
Paramètres flexibles: les différents paramètres de la stratégie, tels que les périodes EMA, la durée ADR, le ratio risque/rendement, la fenêtre de temps de négociation, etc., peuvent être réglés de manière flexible en fonction des préférences des utilisateurs et des caractéristiques du marché afin d'optimiser les performances de la stratégie.
Haut degré d'automatisation: la stratégie est basée sur la plateforme TradingView et la logique de trading est entièrement exécutée par le programme, ce qui réduit l'interférence des émotions humaines et des jugements subjectifs, ce qui favorise le fonctionnement stable à long terme de la stratégie.
Risque d'optimisation des paramètres: Bien que les paramètres de la stratégie puissent être ajustés de manière flexible, une optimisation excessive peut entraîner un surajustement et de mauvaises performances hors échantillon.
Risque d'événement soudain: la stratégie se négocie principalement sur la base d'indicateurs techniques et peut ne pas réagir suffisamment à certains événements fondamentaux soudains majeurs, tels que des changements de politique ou des fluctuations significatives des données économiques, entraînant des retires importants.
Risque d'inversion de tendance: au cours des périodes clés d'inversion de tendance, les signaux croisés de la double EMA peuvent être retardés, ce qui entraîne la perte du meilleur moment pour établir des positions ou des pertes au début d'un renversement de tendance.
Risque de liquidité: bien que la stratégie fixe une fenêtre de temps de négociation, si la liquidité des instruments négociés est faible, elle peut encore faire face à des risques tels que des dérapages et des retards de négociation, ce qui affecte les performances de la stratégie.
Risque d'échec des indicateurs techniques: la stratégie repose fortement sur des indicateurs techniques. Si les conditions du marché changent de manière significative, ce qui fait perdre aux indicateurs leur signification initiale, l'efficacité de la stratégie peut diminuer.
Introduction d'indicateurs plus dimensionnels: sur la base des EMA et des ADR doubles existants, envisager l'introduction d'indicateurs techniques plus efficaces, tels que le MACD et le RSI, afin d'améliorer la fiabilité et la robustesse des signaux.
Optimisation dynamique des paramètres: établir un mécanisme d'optimisation des paramètres qui ajuste dynamiquement les paramètres clés de la stratégie en fonction des différents états du marché (tels que les tendances ou les oscillations) afin de s'adapter aux changements du marché.
Incorporer des facteurs fondamentaux: Prendre en considération certains indicateurs fondamentaux importants, tels que les données économiques et les orientations des politiques, qui peuvent aider la stratégie à mieux comprendre les tendances du marché et à éviter les risques systémiques en temps opportun.
Améliorer les mécanismes d'arrêt des pertes et de prise de bénéfices: optimiser davantage la logique d'arrêt des pertes et de prise de bénéfices sur la base de l'arrêt des pertes et de prise de bénéfices dynamiques existants, tels que l'introduction d'arrêts de retard et de prises de bénéfices partielles, afin de mieux protéger les bénéfices et contrôler les risques.
Plusieurs instruments et délais: étendre la stratégie à plusieurs instruments et délais de négociation et améliorer l'adaptabilité et la stabilité de la stratégie grâce à une diversification des investissements et à l'optimisation des délais.
La stratégie EMA Cross ADR est une stratégie de trading quantitative basée sur l'analyse technique. Elle détermine les tendances par le biais de doubles croisements EMA et utilise l'indicateur ADR pour filtrer la volatilité. La stratégie définit également des mesures strictes de contrôle des risques, y compris le stop-loss dynamique et le take-profit, les break-even stops et les limites de perte quotidiennes maximales pour contrôler le risque à la baisse. Les avantages de la stratégie résident dans sa forte capacité de suivi des tendances, une bonne adaptabilité à la volatilité, un contrôle strict des risques, des paramètres flexibles et un haut degré d'automatisation. Cependant, elle comporte également certains risques, tels que le risque d'optimisation des paramètres, le risque d'événement soudain, le risque d'inversion de tendance, le risque de liquidité et le risque d'échec des indicateurs techniques.
/*backtest start: 2024-02-26 00:00:00 end: 2024-03-27 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Sameh_Hussein //@version=5 strategy('EMA Cross ADR Strategy with Stats', overlay=true) // Adjustable Parameters shortEmaLength = input(10, title='Short EMA Length') longEmaLength = input(50, title='Long EMA Length') adrLength = input(14, title='ADR Length') riskRewardRatio = input(2.0, title='Risk/Reward Ratio') lookbackCandles = input(10, title='Lookback Candles for Stop Loss') startTime = input(0900, title='Start Time') endTime = input(1600, title='End Time') minAdrValue = input(10, title='Minimum ADR Value for Entry') breakEvenProfit = input.float(1.0, title='Break-Even Profit', minval=0.0) breakEvenRR = input.float(1.0, title='Break-Even Risk-Reward Ratio', minval=0.0) dailyLossLimit = input(-2000.0, title='Daily Loss Limit') // Exponential Moving Averages shortEma = ta.ema(close, shortEmaLength) longEma = ta.ema(close, longEmaLength) // Average Daily Range adr = ta.sma(ta.tr, adrLength) // Time Filter Function timeFilter() => true // Entry Conditions with ADR filter longCondition = ta.crossover(shortEma, longEma) and timeFilter() and adr > minAdrValue shortCondition = ta.crossunder(shortEma, longEma) and timeFilter() and adr > minAdrValue // Calculate the average low and average high of the previous 'lookbackCandles' candles averageLow = ta.sma(low, lookbackCandles) averageHigh = ta.sma(high, lookbackCandles) // Risk and Reward Calculation stopLossLong = averageLow takeProfitLong = close + (close - averageLow) * riskRewardRatio stopLossShort = averageHigh takeProfitShort = close - (averageHigh - close) * riskRewardRatio // Entry Control Variables var longEntryAllowed = true var shortEntryAllowed = true // Update entry price on trade execution var float entryPriceLong = na var float entryPriceShort = na if (strategy.position_size > 0) if (strategy.position_size[1] <= 0) entryPriceLong := strategy.opentrades.entry_price(strategy.opentrades - 1) else entryPriceLong := entryPriceLong else entryPriceLong := na if (strategy.position_size < 0) if (strategy.position_size[1] >= 0) entryPriceShort := strategy.opentrades.entry_price(strategy.opentrades - 1) else entryPriceShort := entryPriceShort else entryPriceShort := na // Adjust stop loss to break-even plus the defined profit when the specified risk-reward ratio is reached breakEvenTriggerLong = entryPriceLong + (entryPriceLong - stopLossLong) * breakEvenRR breakEvenTriggerShort = entryPriceShort - (stopLossShort - entryPriceShort) * breakEvenRR if (longEntryAllowed and close >= breakEvenTriggerLong) stopLossLong := entryPriceLong + breakEvenProfit if (shortEntryAllowed and close <= breakEvenTriggerShort) stopLossShort := entryPriceShort - breakEvenProfit // Close all trades at 1600 if (hour == 15 and minute == 59) strategy.close_all(comment='Close at 1600') // Define the daily loss variable and last trade day var float[] dailyLossArray = array.new_float(1, 0.0) var int[] lastTradeDayArray = array.new_int(1, na) // Function to update the daily loss updateDailyLoss() => _dailyLoss = array.get(dailyLossArray, 0) _lastTradeDay = array.get(lastTradeDayArray, 0) if na(_lastTradeDay) or dayofmonth != _lastTradeDay _dailyLoss := 0.0 array.set(lastTradeDayArray, 0, dayofmonth) if not na(strategy.closedtrades.entry_bar_index(strategy.closedtrades - 1)) _dailyLoss += strategy.closedtrades.profit(strategy.closedtrades - 1) array.set(dailyLossArray, 0, _dailyLoss) // Call the function to update the daily loss updateDailyLoss() // Execute Strategy if longCondition and longEntryAllowed strategy.entry('Long', strategy.long) strategy.exit('Take Profit/Stop Loss', 'Long', stop=stopLossLong, limit=takeProfitLong) longEntryAllowed := false if shortCondition and shortEntryAllowed strategy.entry('Short', strategy.short) strategy.exit('Take Profit/Stop Loss', 'Short', stop=stopLossShort, limit=takeProfitShort) shortEntryAllowed := false // Reset entry control variables on position close if strategy.position_size == 0 longEntryAllowed := true shortEntryAllowed := true // // Statistics // winRate = strategy.wintrades / strategy.closedtrades * 100 // totalTrades = strategy.closedtrades // averageProfit = strategy.grossprofit / strategy.wintrades // averageLoss = strategy.grossloss / strategy.losstrades // // Plotting // plot(shortEma, color=color.new(color.red, 0), title='Short EMA') // plot(longEma, color=color.new(color.blue, 0), title='Long EMA') // // Display Table // table statsTable = table.new(position=position.top_right, columns=2, rows=4, bgcolor=color.gray, border_width=1) // table.cell(statsTable, column=0, row=0, text='Win Rate (%)', bgcolor=color.blue) // table.cell(statsTable, column=1, row=0, text=str.tostring(winRate), bgcolor=color.blue) // table.cell(statsTable, column=0, row=1, text='Total Trades', bgcolor=color.blue) // table.cell(statsTable, column=1, row=1, text=str.tostring(totalTrades), bgcolor=color.blue) // table.cell(statsTable, column=0, row=2, text='Average Profit', bgcolor=color.blue) // table.cell(statsTable, column=1, row=2, text=str.tostring(averageProfit), bgcolor=color.blue) // table.cell(statsTable, column=0, row=3, text='Average Loss', bgcolor=color.blue) // table.cell(statsTable, column=1, row=3, text=str.tostring(averageLoss), bgcolor=color.blue)