Trading Momentum : stratégie de croisement de moyennes mobiles doubles


Date de création: 2024-04-01 11:53:14 Dernière modification: 2024-04-01 11:53:14
Copier: 4 Nombre de clics: 597
1
Suivre
1617
Abonnés

Trading Momentum : stratégie de croisement de moyennes mobiles doubles

Aperçu

La stratégie utilise les moyennes mobiles indicielles de 8 cycles et de 21 cycles (EMA) pour identifier les changements de tendance du marché. Elle génère un signal d’achat lorsque l’EMA de plus courte durée traverse l’EMA de plus longue durée en bas; et inversement, elle génère un signal de vente lorsque l’EMA de plus courte durée traverse l’EMA de plus longue durée en haut. La stratégie combine également trois basses plus élevées (HLL) et trois hautes plus basses (LLH) consécutives comme signal de confirmation d’un renversement de tendance.

Principe de stratégie

  1. Les EMA de 8 cycles et de 21 cycles sont calculés pour identifier les principales tendances.
  2. Identifier trois bas plus élevés (HLL) et trois hauts plus bas (LLH) consécutifs, comme signal précoce d’un renversement de tendance.
  3. Un signal d’achat est généré lorsque l’EMA de cycle 8 traverse l’EMA de cycle 21 en bas et une rupture de HLL; un signal de vente est généré lorsque l’EMA de cycle 8 traverse l’EMA de cycle 21 en haut et une rupture de LLH.
  4. Le niveau de stop loss est fixé à 5% du prix d’entrée, et le niveau de stop stop est fixé à 16% du prix d’entrée pour contrôler le risque et bloquer les bénéfices.
  5. Lorsque le signal de reprise est donné, la position est clôturée et la reprise de la position est effectuée.

Avantages stratégiques

  1. La combinaison des EMA et des modèles de comportement des prix (HLL et LLH) permet de confirmer les tendances et d’améliorer la fiabilité du signal.
  2. Les niveaux de stop-loss et de stop-loss définis permettent de contrôler les risques et de bloquer les bénéfices.
  3. Il est adapté à plusieurs périodes et marchés, avec une certaine universalité.
  4. La logique est claire, facile à comprendre et à mettre en œuvre.

Risque stratégique

  1. Dans un marché en crise, des croisements fréquents peuvent entraîner de multiples faux signaux et entraîner des pertes.
  2. Les niveaux fixes de stop-loss et de stop-loss peuvent ne pas s’adapter à différents environnements de marché, entraînant des coûts d’opportunité potentiels ou des pertes plus importantes.
  3. Les stratégies reposent sur des données historiques et peuvent être moins adaptées aux événements soudains ou aux changements fondamentaux.

Orientation de l’optimisation de la stratégie

  1. L’introduction de mécanismes d’arrêt et d’arrêt adaptatifs, basés sur la volatilité (comme l’ATR) pour ajuster les niveaux d’arrêt et d’arrêt afin de mieux s’adapter aux différentes conditions du marché.
  2. Il peut être combiné avec d’autres indicateurs ou facteurs, tels que le volume de transactions, l’indice de force relative (RSI) pour filtrer davantage les signaux et améliorer la fiabilité.
  3. Optimiser les paramètres (par exemple, les cycles EMA, le taux de stop loss, etc.) pour trouver la combinaison de paramètres qui fonctionne le mieux sur un marché ou un indice particulier.
  4. Envisagez d’introduire des mesures de gestion des risques, telles que le dimensionnement des positions, afin de contrôler les marges de risque pour les transactions ponctuelles.

Résumer

La stratégie utilise le croisement des EMA de 8 cycles et de 21 cycles, en combinaison avec les modèles de prix HLL et LLH, pour identifier un renversement de tendance et générer un signal de négociation. Des règles claires de stop-loss aident à contrôler les risques et à bloquer les bénéfices. Cependant, la stratégie peut générer de faux signaux dans des marchés instables et des niveaux de stop-loss fixes peuvent ne pas s’adapter aux différents environnements de marché.

Code source de la stratégie
/*backtest
start: 2023-03-26 00:00:00
end: 2024-03-31 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Trend Following 8&21EMA with strategy tester [ukiuro7]', overlay=true, process_orders_on_close=true, calc_on_every_tick=true, initial_capital = 10000)

//INPUTS
lh3On = true
hl3On = true
emaOn = input(title='105ema / 30min', defval=true) 
assistantOn = input(title='Assistant', defval=true)
textOn = input(title='Text', defval=true)

showRiskReward = input.bool(true, title='Show Risk/Reward Area', group="TP/SL")
stopPerc = input.float(5.0, step=0.1, minval=0.1, title='Stop-Loss %:',group="TP/SL") / 100
tpPerc = input.float(16.0, step=0.1, minval=0.1, title='Take-Profit %:',group="TP/SL") / 100

backtestFilter = input(false, title='Backtest Entries to Date Range',group="Backtest Date Range")
i_startTime = input(defval=timestamp('01 Jan 2022 00:00'), inline="b_1", title='Start',group="Backtest Date Range")
i_endTime = input(defval=timestamp('01 Jan 2029 00:00'), inline="b_1", title='End',group="Backtest Date Range")
inDateRange = true

message_long_entry = input.string(title='Alert Msg: LONG Entry', defval ='', group='Alert Message')
message_short_entry = input.string(title='Alert Msg: SHORT Entry', defval='', group='Alert Message')
message_long_exit = input.string(title='Alert Msg: LONG SL/TP', defval='', group='Alert Message')
message_short_exit = input.string(title='Alert Msg: SHORT SL/TP', defval='', group='Alert Message')  

//CALCS
threeHigherLows() =>
    low[0] >= low[1] and low[1] >= low[2]

threeLowerHighs() =>
    high[2] >= high[1] and high[1] >= high[0]

breakHigher() =>
    padding = timeframe.isintraday ? .02 : .1
    high >= high[1] + padding

breakLower() =>
    padding = timeframe.isintraday ? .02 : .1
    low <= low[1] - padding

lh3 = threeLowerHighs() and lh3On
lh3bh = lh3[1] and breakHigher() and lh3On

hl3 = threeHigherLows() and hl3On
hl3bl = hl3[1] and breakLower() and hl3On

ema8 = ta.ema(close, 8)
ema21 = ta.ema(close, 21)

//VARS
var float longStop = na, var float longTp = na
var float shortStop = na, var float shortTp = na

//CONDS
isUptrend = ema8 >= ema21
isDowntrend = ema8 <= ema21
trendChanging = ta.cross(ema8, ema21)

buySignal = lh3bh and lh3[2] and lh3[3] and isUptrend and timeframe.isintraday
sellSignal = hl3bl and hl3[2] and hl3[3] and isDowntrend and timeframe.isintraday

goingDown = hl3 and isDowntrend and timeframe.isintraday
goingUp = lh3 and isUptrend and timeframe.isintraday

projectXBuy = trendChanging and isUptrend
projectXSell = trendChanging and isDowntrend

longCond = trendChanging and isUptrend and assistantOn
shortCond = trendChanging and isDowntrend and assistantOn

//STRATEGY
if shortCond and strategy.position_size > 0 and barstate.isconfirmed
    strategy.close('Long', comment='CLOSE LONG', alert_message=message_long_exit)

if longCond and strategy.position_size < 0 and barstate.isconfirmed
    strategy.close('Short', comment='CLOSE SHORT', alert_message=message_short_exit) 

if longCond and strategy.position_size <= 0 and barstate.isconfirmed and inDateRange
    longStop := close * (1 - stopPerc)
    longTp := close * (1 + tpPerc)
    strategy.entry('Long', strategy.long, comment='LONG', alert_message=message_long_entry)
    strategy.exit('Long Exit', 'Long', comment_loss="SL LONG", comment_profit = "TP LONG", stop=longStop, limit=longTp, alert_message=message_long_exit)

if shortCond and strategy.position_size >= 0 and barstate.isconfirmed and inDateRange
    shortStop := close * (1 + stopPerc)
    shortTp := close * (1 - tpPerc)
    strategy.entry('Short', strategy.short, comment='SHORT', alert_message=message_short_entry)
    strategy.exit('Short Exit', 'Short', comment_loss="SL SHORT", comment_profit="TP SHORT", stop=shortStop, limit=shortTp, alert_message=message_short_exit)

//PLOTS
plotshape(longCond, style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.small, text='Buy')
plotshape(shortCond, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.small, text='Sell')
plotchar(trendChanging and isUptrend and close < open and assistantOn, char='!', location=location.abovebar, color=color.new(color.green, 0), size=size.small)

aa = plot(ema8, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(ema21, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.new(color.green,90) : color.new(color.red,90))
buyZone = isUptrend and lh3 and high < ema21 and timeframe.isintraday
sellZone = isDowntrend and hl3 and low > ema21 and timeframe.isintraday

L1 = plot(showRiskReward and strategy.position_size > 0 ? strategy.position_avg_price : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long Entry Price')
L2 = plot(showRiskReward and strategy.position_size > 0 ? longTp : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long TP Price')
L3 = plot(showRiskReward and strategy.position_size > 0 ? longStop : na, color=color.new(color.red, 0), linewidth=1, style=plot.style_linebr, title='Long Stop Price')

S1 = plot(showRiskReward and strategy.position_size < 0 ? strategy.position_avg_price : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short Entry Price')
S2 = plot(showRiskReward and strategy.position_size < 0 ? shortTp : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short TP Price')
S3 = plot(showRiskReward and strategy.position_size < 0 ? shortStop : na, color=color.new(color.maroon, 0), linewidth=1, style=plot.style_linebr, title='Short Stop Price')

fill(L1, L2, color=color.new(color.green, 90))
fill(L1, L3, color=color.new(color.red, 90))
fill(S1, S2, color=color.new(color.teal, 90))
fill(S1, S3, color=color.new(color.maroon, 90))

bgcolor(inDateRange == false ? color.new(color.red,90) : na, title="Backtest Off-Range")