
La stratégie de rupture de dynamique est une stratégie de négociation quantitative qui suit les tendances du marché. Elle permet de déterminer la tendance et l’intensité du mouvement des prix du marché en calculant des indicateurs de dynamique des prix historiques, afin de capturer la tendance de la ligne médiane du marché.
La stratégie est basée principalement sur l’indicateur de dynamique. L’indicateur de dynamique est le prix de clôture du cycle actuel moins le prix de clôture avant le cycle N. Lorsque le prix de clôture de la dernière ligne K est supérieur au prix de clôture avant le cycle N, la dynamique est positive, indiquant une dynamique haussière; lorsque le prix de clôture de la dernière ligne K est inférieur au prix de clôture avant le cycle N, la dynamique est négative, indiquant une dynamique descendante.
La stratégie commence par calculer la dynamique d’une période de 18 cycles, c’est-à-dire le prix de clôture actuel moins le prix de clôture précédant la période de 18 cycles, obtenant mom0 ⋅ puis calcule la dynamique d’une période de mom0 obtenant mom1 ⋅
Un signal de plus est généré lorsque mom0>0 et mom1>0, ce qui indique une forte tendance à la hausse; un signal de moins est généré lorsque mom0 et mom1, ce qui indique une forte tendance à la baisse.
La stratégie enregistre les derniers signaux de plus et de moins, et détient une position de plus quand la période de plus est supérieure à celle de moins.
Cette stratégie présente les avantages suivants:
La stratégie est claire, simple et facile à comprendre, adaptée aux débutants en trading quantitatif.
L’indicateur de dynamique est capable de capturer la tendance et l’intensité du marché et de suivre les tendances à long terme avec un taux de réussite élevé.
Le filtre à double dynamique permet de filtrer une partie des dommages causés par une fausse percée.
Les signaux de trading sont ensuite mis en place pour créer des positions de tendance, ce qui permet d’obtenir des gains supplémentaires sur la tendance.
Le retrait en temps opportun permet de contrôler les pertes individuelles et d’éviter des pertes excessives en cas de renversement.
Cette stratégie comporte également des risques à prendre en compte:
Les ajustements de courte durée dans le cas d’une tendance à plusieurs têtes entraînent une sortie de stop-loss, ce qui ne permet pas de capturer la tendance à cycle complet. La marge de stop-loss peut être assouplie de manière appropriée.
Il existe une fréquence élevée d’ouverture et de clôture de positions dans des conditions de choc, ce qui peut augmenter les frais de transaction et les pertes de points de glissement. Les conditions de filtrage peuvent être assouplies de manière appropriée, ce qui réduit la fréquence des transactions.
Une fois que la tendance est inversée, la position de la direction initiale est maintenue, ce qui entraîne une expansion des pertes. Le retour de tendance peut être déterminé en combinant les indicateurs de tendance.
Une mauvaise configuration des paramètres peut entraîner des signaux de trading erronés ou générer des signaux erronés. Il est nécessaire d’ajuster les paramètres pour différents marchés.
Cette stratégie peut être optimisée dans les domaines suivants:
Optimiser les paramètres de dynamique, calculer la longueur de la dynamique pour différents cycles et ajustements du marché, améliorer la qualité du signal.
Ajouter des filtres sur d’autres indicateurs comme le MACD, le KD, etc. pour éviter que la tendance se retourne et cause des pertes.
Optimiser les stratégies de stop loss, en assouplissant de manière appropriée le stop loss dans les tendances de négociation; les marchés hors tendance resserrent de manière appropriée le stop loss.
Augmentation de la stratégie de gestion des positions, diminution des positions en cas d’absence de tendance; augmentation des positions en cas de tendance pour obtenir plus de bénéfices.
Optimiser les paramètres pour les différentes variétés afin d’améliorer leur adaptabilité.
Ajout d’algorithmes d’apprentissage automatique pour optimiser dynamiquement les paramètres de la stratégie.
La stratégie de rupture de dynamique est une stratégie de suivi de tendance simple et intuitive. Elle permet de capturer efficacement les tendances à long terme sur le marché et de tirer le meilleur parti de la tendance. Elle nécessite également une attention particulière au contrôle des risques, à l’optimisation des stratégies de stop-loss et à l’aide d’autres indicateurs pour juger de la tendance.
/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Momentum BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
/////////////// Time Frame ///////////////
_0 = input(false, "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
///////////// Momentum /////////////
_1 = input(false, "═══════ Momentum ══════")
length = input(18)
price = close
momentum(seria, length) =>
mom = seria - seria[length]
mom
mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)
/////////////// Strategy ///////////////
long = mom0 > 0 and mom1 > 0
short = mom0 < 0 and mom1 < 0
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
/////////////// Stop Losses Long ///////////////
_5 = input(false, "═══════ Stop Loss L ══════")
SL_typel = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inpl = input(8.0, title='Fixed Stop Loss %') / 100
atrLkbl = input(20, minval=1, title='ATR Stop Period')
atrMultl = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1l = atr(atrLkbl)
longStop1l = 0.0
longStop1l := short_signal ? na : long_signal ? close - (atr1l * atrMultl) : longStop1l[1]
slLongl = in_long_signal ? strategy.position_avg_price * (1 - sl_inpl) : na
long_sll = in_long_signal ? slLongl : na
/////////////// Stop Losses Short ///////////////
_6 = input(false, "═══════ Stop Loss S ══════")
SL_types = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inps = input(7.0, title='Fixed Stop Loss %') / 100
atrLkbs = input(20, minval=1, title='ATR Stop Period')
atrMults = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1s = atr(atrLkbs)
shortStop1s = 0.0
shortStop1s := long_signal ? na : short_signal ? close + (atr1s * atrMults) : shortStop1s[1]
slShorts = strategy.position_avg_price * (1 + sl_inps)
short_sls = in_short_signal ? slShorts : na
_7 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")
/////////////// Execution ///////////////
if testPeriod()
if useLongs
strategy.entry("L", strategy.long, when=long)
strategy.exit("L SL", "L", stop = SL_typel == "Fixed" ? long_sll : longStop1l, when=since_longEntry > 0)
if useShorts
strategy.exit("S SL", "S", stop = SL_types == "Fixed" ? short_sls : shortStop1s, when=since_shortEntry > 0)
strategy.entry("S", strategy.short, when=short)
if not useShorts
strategy.close("L", when=short)
if not useLongs
strategy.close("S", when=long)
/////////////// Plotting ///////////////
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=40)
p0 = plot(close)
p1 = plot(strategy.position_size <= 0 ? na : SL_typel == "Fixed" ? long_sll : longStop1l, title="Long Stop Loss", color=color.yellow, style=plot.style_linebr, linewidth=2)
p2 = plot(strategy.position_size >= 0 ? na : SL_types == "Fixed" ? short_sls : shortStop1s, title="Short Stop Loss", color=color.orange, style=plot.style_linebr, linewidth=2)
p3 = plot(strategy.position_size <= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Long Entry", color=color.green, linewidth=2)
p4 = plot(strategy.position_size >= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Short Entry", color=color.red, linewidth=2)
fill(p0, p3, color = color.lime, transp=60)
fill(p0, p4, color = color.red, transp=60)