La stratégie ADR est une stratégie de trading quantitative basée sur la plate-forme TradingView, qui combine plusieurs indicateurs techniques pour déterminer la tendance, filtrer les signaux et définir des arrêts de perte. La stratégie utilise deux moyennes mobiles indicielles de différentes périodes (EMA) pour identifier les principales tendances, en utilisant l’amplitude réelle moyenne (ATR) comme filtre de volatilité et en définissant des arrêts de perte en fonction de la dynamique des rendements par rapport au risque. En outre, la stratégie introduit des mesures de contrôle des risques telles que la fenêtre de temps de négociation, l’équilibre des pertes et des pertes maximales, tout en essayant de saisir les opportunités de tendance et de contrôler strictement les risques de baisse.
La stratégie utilise deux lignes EMA de différentes périodes pour juger de la tendance. Lorsque l’EMA à court terme est traversée par l’EMA à long terme, la tendance est considérée comme étant à la hausse, générant un signal de multiplication; inversement, lorsque l’EMA à court terme est traversée par l’EMA à long terme, la tendance est considérée comme étant à la baisse, générant un signal de blanchiment.
Filtrage de la volatilité ADR: Afin d’éviter de générer des signaux de transaction dans un environnement à faible volatilité, la stratégie a introduit l’indicateur ADR comme filtre de volatilité. La position est autorisée à être ouverte uniquement lorsque la valeur ADR est supérieure à la valeur minimale prédéfinie.
Fenêtres de temps de transaction: Cette stratégie permet aux utilisateurs de définir des heures de début et de fin de transactions quotidiennes. Les transactions ne sont exécutées que dans les fenêtres de temps spécifiées. Cela aide à éviter les périodes de faible liquidité ou de grande volatilité.
Stop Loss Dynamique: la stratégie est basée sur la moyenne des prix les plus élevés et les plus bas de la ligne N-K la plus récente, et le rapport de risque-rendement est calculé dynamiquement, en combinant le prix d’arrêt et le prix d’arrêt. Cela garantit que le risque-rendement de chaque transaction est contrôlable.
L’équilibre des pertes et des pertes: lorsque la position atteint un certain niveau de rentabilité (les utilisateurs peuvent définir un rapport de retour sur risque), la stratégie déplace le stop loss au prix d’ouverture de la position, soit l’équilibre des pertes et des pertes. Cela aide à protéger les bénéfices déjà réalisés.
Limite de perte maximale quotidienne: Pour contrôler la perte maximale quotidienne, la stratégie définit une limite de perte quotidienne. Une fois que la perte atteint cette limite, la stratégie arrête la négociation jusqu’à l’ouverture du jour suivant.
La stratégie consiste à liquider toutes les positions à une heure fixe de chaque jour de négociation (par exemple 16h00) afin d’éviter le risque d’une nuit.
La capacité de suivre les tendances est forte: les tendances peuvent être jugées par le croisement de deux lignes égales, permettant de capturer efficacement les principales tendances du marché, ce qui améliore la victoire de la stratégie et le potentiel de profit.
Adaptabilité à la volatilité: l’introduction de l’indicateur ADR comme filtre de volatilité permet d’éviter les transactions fréquentes dans des environnements à faible volatilité et réduit les pertes causées par les signaux inefficaces et les fausses percées.
Contrôle des risques rigoureux: la stratégie a mis en place des mesures de contrôle des risques à partir de plusieurs dimensions, y compris l’arrêt dynamique, l’arrêt des pertes, l’équilibre des pertes et la limite de perte maximale quotidienne, ce qui a permis de contrôler efficacement le risque de baisse de la stratégie et d’améliorer les rendements après ajustement des risques.
La flexibilité des paramètres: les paramètres de la stratégie, tels que le cycle de la moyenne, la longueur de l’ADR, le ratio de retour sur risque et la fenêtre de temps de négociation, 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 la performance de la stratégie.
Haute automatisation: La stratégie est basée sur la plateforme TradingView, la logique de négociation est exécutée entièrement par le programme automatiquement, ce qui réduit les interférences avec les émotions humaines et les jugements subjectifs, favorisant 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 avec souplesse, une optimisation excessive peut entraîner une suradaptation et une mauvaise performance à l’extérieur de l’échantillon. Par conséquent, un retour d’expérience et une analyse adéquats sont nécessaires lors de la configuration des paramètres pour assurer la solidité de la stratégie.
Risque d’urgence: La stratégie est basée sur la négociation d’indicateurs techniques et peut être insuffisamment réactive à certains événements fondamentaux majeurs, tels que des changements de politique, des fluctuations importantes des données économiques, etc., ce qui entraîne des retraits plus importants.
Risque de renversement de tendance: les signaux de croisement bi-homogène peuvent être retardés pendant les périodes critiques de renversement de tendance, ce qui peut conduire la stratégie à manquer le meilleur moment pour prendre position ou à subir des pertes au début du renversement de tendance.
Risque de liquidité: malgré le fait que la stratégie a mis en place une fenêtre de temps de négociation, si la liquidité des titres de négociation est médiocre, il est possible de faire face à des risques tels que des points de glissement, des retards de négociation et autres, ce qui affecte la performance de la stratégie.
Risque d’échec des indicateurs techniques: la stratégie est fortement tributaire des indicateurs techniques, et l’efficacité de la stratégie pourrait diminuer si un changement majeur de l’environnement du marché entraînait la perte de la signification indicative des indicateurs.
Introduction d’indicateurs à plus de dimensions: sur la base de l’existant bi-médian et de l’ADR, il est possible d’envisager l’introduction d’indicateurs techniques plus efficaces, tels que le MACD, le RSI, etc., afin d’améliorer la fiabilité et la robustesse du signal.
Paramètres d’optimisation dynamique: un mécanisme d’optimisation des paramètres peut être mis en place, en fonction des différentes conditions du marché (tels que le type de tendance, le type de choc, etc.), en ajustant dynamiquement les paramètres clés de la stratégie pour s’adapter aux changements du marché.
Ajout de facteurs fondamentaux: la prise en compte d’indicateurs fondamentaux importants, tels que les données économiques et les tendances politiques, peut aider la stratégie à mieux saisir les tendances du marché et à éviter les risques systémiques en temps opportun.
Amélioration des mécanismes de stop-loss: sur la base des stops-loss dynamiques existants, il est possible d’optimiser davantage la logique de stop-loss, par exemple en introduisant des méthodes de suivi des pertes, de stop-loss partiel, etc., afin de mieux protéger les bénéfices et de mieux contrôler les risques.
Multi-objectifs, multi-périodes: étendre la stratégie à plusieurs objectifs de négociation et à plusieurs périodes de temps, améliorer l’adaptabilité et la stabilité de la stratégie en diversifiant les investissements et en optimisant les périodes de temps.
L’ADR est une stratégie de trading quantitative basée sur l’analyse technique, qui permet de juger des tendances à travers des doubles croisements et de filtrer les fluctuations à l’aide d’indicateurs ADR. La stratégie met en place des mesures de contrôle des risques rigoureuses, y compris des stop-loss dynamiques, des compensations de pertes et des limites de pertes maximales au jour, pour contrôler les risques à la baisse. Les avantages de la stratégie résident dans sa capacité à suivre les tendances, sa bonne adaptabilité aux fluctuations, son contrôle des risques rigoureux, sa flexibilité et son degré élevé d’automatisation.
/*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)