
La stratégie de rupture de momentum est une stratégie de suivi de la tendance qui génère un signal de transaction en détectant la rupture du support de résistance critique. La stratégie utilise la dynamique de l’indicateur de la chaîne de Donchian pour déterminer le support de résistance critique et, en combinaison avec l’indicateur de la moyenne mobile, filtre davantage le signal pour éviter de produire de mauvaises transactions.
Le canal Donchian est constitué de prix les plus élevés, les plus bas et les prix de la ligne médiane. Les lignes de haut et de bas de la chaîne relient respectivement les plus hauts et les plus bas de la période. Le prix génère un signal d’achat lorsque le prix franchit le haut de la chaîne et un signal de vente lorsque le prix franchit le bas de la chaîne.
Les moyennes mobiles sont utilisées pour déterminer la direction de la tendance des prix. Les signaux d’achat de rupture du canal sont pris en compte uniquement lorsque les prix sont au-dessus des moyennes mobiles, ce qui évite d’acheter dans la zone de couverture.
Plus précisément, la condition d’entrée de la stratégie est que le prix franchisse la trajectoire ascendante du canal Donchian et que le prix de clôture soit supérieur à la moyenne mobile. La condition d’exit est que le prix franchisse la trajectoire descendante du canal Donchian.
Le stop loss est utilisé pour suivre la descente du Donchian Channel, ce qui garantit que le stop loss monte au fur et à mesure de la tendance.
La stratégie combine deux indicateurs pour déterminer la direction et la force d’une tendance, permettant d’identifier efficacement les signaux de rupture et d’éviter les mauvaises transactions. En même temps, la méthode de stop-loss est rationnelle, ce qui permet à la stratégie de suivre pleinement la tendance à la rentabilité.
Plus précisément, cette stratégie présente les avantages suivants:
L’indicateur Donchian Channel permet de déterminer de manière dynamique les points de résistance et de soutien clés et d’identifier les points de retournement clés de la tendance.
L’indicateur de moyenne mobile sert de filtre pour éviter les achats dans les zones de compensation et réduire les transactions inefficaces.
La méthode de stop loss consiste à suivre la trajectoire descendante du canal Donchian pour maximiser le profit de la tendance.
Les paramètres de la stratégie sont configurés avec une flexibilité raisonnable, ce qui permet d’adapter et d’optimiser pour différents environnements de marché.
Les principaux risques de cette stratégie sont les suivants:
Risque d’échec de la rupture. Le prix peut être rapidement rétracté après la rupture du canal et ne peut pas être stocké efficacement.
Risque de renversement de tendance. La tendance peut être inversée avant le point d’arrêt, ce qui entraîne une sortie à perte.
Risque d’optimisation des paramètres. Une mauvaise configuration des paramètres peut entraîner des transactions fréquentes ou un manque de signal.
Ces risques peuvent être optimisés en ajustant le cycle des moyennes mobiles, en augmentant le filtrage de la quantité de transaction, etc., afin d’assurer une fiabilité accrue du signal généré. Des paramètres de Stop Loss Loose appropriés doivent également être configurés pour faire face aux risques d’ajustement à court terme.
Cette stratégie peut être optimisée dans les domaines suivants:
Le filtrage des signaux est effectué à l’aide d’indicateurs de trafic pour s’assurer qu’une percée est réussie.
Optimiser les paramètres de la moyenne mobile pour les rendre plus adaptés aux différentes variétés.
Adapter le mécanisme de stop-loss pour que la distance de stop-loss soit adaptée aux fluctuations de la situation.
L’ajout d’un mécanisme de ré-entrée permettant de ré-capturer les opportunités de tendance après la fermeture des sorties.
Récupération multivariée, vérification de la robustesse des paramètres. Paramètres ajustés en fonction des caractéristiques des différentes variétés.
La stratégie de rupture dynamique intégre plusieurs indicateurs pour déterminer la direction et la force de la tendance, résolvant le problème de la construction aveugle d’un système de tendance courant. La configuration des paramètres de la stratégie est flexible et peut être adaptée de manière optimale à différents environnements et types de transactions.
/*backtest
start: 2022-12-12 00:00:00
end: 2023-12-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// Revision: 1
// Author: @millerrh
// Strategy:
// Entry: Buy when Donchian Channel breaks out
// Exit: Trail a stop with the lower Donchian Channel band
// Conditions/Variables:
// 1. Can add a filter to only take setups that are above a user-defined moving average (helps avoid trading counter trend)
// 2. Manually configure which dates to back test
// 3. User-Configurable DC Channel length
// === CALL STRATEGY/STUDY, PROGRAMATICALLY ENTER STRATEGY PARAMETERS HERE SO YOU DON'T HAVE TO CHANGE THEM EVERY TIME YOU RUN A TEST ===
// (STRATEGY ONLY) - Comment out srategy() when in a study()
strategy("Donchian Breakout", overlay=true, initial_capital=10000, currency='USD',
default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
// (STUDY ONLY) - Comment out study() when in a strategy()
//study("Donchian Breakout", overlay=true)
// === BACKTEST RANGE ===
From_Year = input(defval = 2019, title = "From Year")
From_Month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
From_Day = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
To_Year = input(defval = 9999, title = "To Year")
To_Month = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
To_Day = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
Start = timestamp(From_Year, From_Month, From_Day, 00, 00) // backtest start window
Finish = timestamp(To_Year, To_Month, To_Day, 23, 59) // backtest finish window
// == INPUTS ==
trigInput = input(title = "Execute Trades On...", defval = "Wick", options=["Wick","Close"]) // Useful for comparing standing stop orders vs. waiting for candle closes prior to action
stopTrail = input(title = "Trail Stops On...", defval = "ATR", options = ["ATR","Bottom of DC Channel","Midline of DC Channel","Tightest of ATR/Bot DC Channel"])
dcPeriod = input(title="DC period", type=input.integer, defval=20)
// === PLOT THE DONCHIAN CHANNEL ===
// Logic
dcUpper = highest(high, dcPeriod)
dcLower = lowest(low, dcPeriod)
dcMid = avg(dcUpper, dcLower)
// Plotting
dcUplot = plot(dcUpper, color=color.blue, linewidth=1, title="Upper Channel Line")
dcLplot = plot(dcLower, color=color.blue, linewidth=1, title="Lower Channel Line")
dcMidPlot = plot(dcMid, color=color.gray, linewidth=1, title="Mid-Line Average")
fill(dcUplot, dcLplot, color=color.gray, transp=90)
// == FILTERING ==
// Inputs
useMaFilter = input(title = "Use MA for Filtering?", type = input.bool, defval = true)
maType = input(defval="SMA", options=["EMA", "SMA"], title = "MA Type For Filtering")
maLength = input(defval = 100, title = "MA Period for Filtering", minval = 1)
// Declare function to be able to swap out EMA/SMA
ma(maType, src, length) =>
maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = ma(maType, close, maLength)
plot(maFilter, title = "Trend Filter MA", color = color.green, linewidth = 3, style = plot.style_line, transp = 50)
// Check to see if the useMaFilter check box is checked, this then inputs this conditional "maFilterCheck" variable into the strategy entry
maFilterCheck = if useMaFilter == true
maFilter
else
0
// == ENTRY AND EXIT CRITERIA ==
// Trigger stop based on candle close or High/Low (i.e. Wick) - If doing daily timeframe, can do candle close. Intraday should use wick.
trigResistance = trigInput == "Close" ? close : trigInput == "Wick" ? high : na
trigSupport = trigInput == "Close" ? close : trigInput == "Wick" ? low : na
buySignal = trigResistance >= dcUpper[1] // The [1] looks at the previous bar's value as it didn't seem to be triggering correctly without it (likely) DC moves with each bar
sellSignal = trigSupport <= dcLower[1]
buy = buySignal and dcUpper[1] > maFilterCheck // All these conditions need to be met to buy
// (STRATEGY ONLY) Comment out for Study
// This string of code enters and exits at the close
if (trigInput == "Close")
strategy.entry("Long", strategy.long, when = buy)
strategy.close("Long", when = sellSignal)
// This string of code enters and exits at the wick (i.e. with pre-set stops)
if (trigInput == "Wick")
strategy.entry("Long", strategy.long, stop = dcUpper[1], when = time > Start and time < Finish and dcUpper[1] > maFilterCheck)
strategy.exit("Exit Long", from_entry = "Long", stop = dcLower[1])