Stratégie de trading Momentum Moving Average


Date de création: 2024-01-24 11:09:58 Dernière modification: 2024-01-24 11:09:58
Copier: 0 Nombre de clics: 614
1
Suivre
1617
Abonnés

Stratégie de trading Momentum Moving Average

Aperçu

La stratégie est basée sur la croisée des moyennes mobiles rapides et lentes pour déterminer les tendances du marché et les points d’achat et de vente. Lorsqu’une EMA rapide traverse une EMA lente, le marché est jugé en hausse et génère un signal d’achat. Lorsqu’une EMA rapide traverse une EMA lente, le marché est jugé en baisse et génère un signal de vente.

Principe de stratégie

La stratégie utilise un croisement entre une EMA rapide (ligne de 8 jours) et une EMA lente (ligne de 21 jours) pour juger de la tendance du marché. La logique est la suivante:

  1. Les EMA du 8e et du 21e jours sont calculés
  2. Lorsque l’EMA du 8 est passée à l’EMA du 21, la tendance haussière a commencé, jugée comme une reprise du marché.
  3. Lorsque l’EMA du 8 est passée à travers l’EMA du 21, il a été jugé que le marché était en train de changer et la tendance à la baisse a commencé.
  4. Il génère un signal d’achat dans une tendance à la hausse et un signal de vente dans une tendance à la baisse.
  5. Configurer des prix stop-loss et stop-loss pour gérer le risque de chaque commande

Cette stratégie, combinée à des indicateurs de dynamique et à l’analyse de tendances, permet de capturer efficacement la direction et les revers du marché. Les croisements EMA rapides et lisses combinés à des moyennes mobiles lisses permettent de filtrer certains signaux de négociation bruyants.

Analyse des avantages

La stratégie présente les principaux avantages suivants:

  1. Les EMA rapides et les EMA lentes permettent de déterminer efficacement les tendances et les points d’achat et de vente du marché.
  2. Les paramètres de la stratégie peuvent être optimisés et les cycles EMA peuvent être ajustés davantage.
  3. Combiné à un indicateur de puissance, il permet de filtrer efficacement les signaux de bruit
  4. Logique d’arrêt de dommages et de freinage, permettant de contrôler activement les risques

Dans l’ensemble, la stratégie, qui combine tendances et indicateurs de dynamique, s’adapte à différents environnements de marché grâce à un ajustement des paramètres, et constitue une stratégie de négociation de courte ligne relativement flexible.

Analyse des risques

Cette stratégie comporte aussi des risques:

  1. En cas de choc, les signaux croisés des EMA sont fréquents et génèrent plus de transactions erronées.
  2. Insuffisance à gérer efficacement les situations de failles de saut
  3. Il n’y a pas de tendances à long terme à grande échelle.

Nous pouvons optimiser ces risques de plusieurs façons:

  1. Ajout de filtres sur d’autres indicateurs, tels que les bandes de Brin, KDJ, etc., pour réduire la probabilité de faux signaux
  2. Déterminer les tendances à long terme en combinant des indicateurs cycliques à un niveau plus large
  3. Optimiser les paramètres et ajuster la longueur des EMA pour s’adapter aux différentes conditions du marché
  4. Intervention humaine pour éviter que les écarts de taux ne causent des pertes énormes dépassant les limites de la perte

Direction d’optimisation

Il y a encore beaucoup à optimiser dans cette stratégie, principalement dans les directions suivantes:

  1. Optimiser les paramètres de cycle EMA pour tester les rendements de différents paramètres sur des données historiques
  2. Ajout de filtres sur d’autres indicateurs techniques, tels que KDJ, MACD, etc., pour améliorer l’exactitude de la stratégie
  3. Optimisation du réglage du stop-loss pour le rendre plus adapté aux caractéristiques de la situation
  4. Optimisation automatique des paramètres par une méthode d’apprentissage automatique

Ces mesures d’optimisation peuvent considérablement améliorer la stabilité, l’adaptabilité et la rentabilité des stratégies.

Résumer

Cette stratégie est une stratégie de négociation de courte ligne typique basée sur le suivi de la tendance et le croisement des indicateurs de la dynamique. Elle combine les croisements de lignes rapides et lentes EMA et la logique de stop-loss pour capturer rapidement les opportunités de direction du marché.

Code source de la stratégie
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TradersPostInc

//@version=5
strategy('TradersPost Example MOMO Strategy', overlay=true)

startTime = input(defval = timestamp('01 Jan 2021 00:00 +0000'), title = 'Start Time', group = 'Date Range')
endTime = input(defval = timestamp('31 Dec 2023 23:59 +0000'), title = 'End Time', group = 'Date Range')
timeCondition = true
timeConditionEnd = timeCondition[1] and not timeCondition

fastEmaLength = input.int(defval = 8, title = 'Fast EMA Length')
slowEmaLength = input.int(defval = 21, title = 'Slow EMA Length')
sides = input.string(defval = 'Both', title = 'Sides', options = ['Long', 'Short', 'Both', 'None'])

fastEma = ta.ema(close, fastEmaLength)
slowEma = ta.ema(close, slowEmaLength)

isUptrend = fastEma >= slowEma
isDowntrend = fastEma <= slowEma
trendChanging = ta.cross(fastEma, slowEma)

ema105 = request.security(syminfo.tickerid, '30', ta.ema(close, 105)[1], barmerge.gaps_off, barmerge.lookahead_on)
ema205 = request.security(syminfo.tickerid, '30', ta.ema(close, 20)[1], barmerge.gaps_off, barmerge.lookahead_on)
plot(ema105, linewidth=4, color=color.new(color.purple, 0), editable=true)
plot(ema205, linewidth=2, color=color.new(color.purple, 0), editable=true)

aa = plot(fastEma, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(slowEma, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.green : color.red, transp=90)

tradersPostBuy = trendChanging and isUptrend and timeCondition
tradersPostSell = trendChanging and isDowntrend and timeCondition

pips = syminfo.pointvalue / syminfo.mintick

percentOrPipsInput = input.string('Percent', title='Percent or Pips', options=['Percent', 'Pips'])

stopLossLongInput = input.float(defval=0, step=0.01, title='Stop Loss Long', minval=0)
stopLossShortInput = input.float(defval=0, step=0.01, title='Stop Loss Short', minval=0)

takeProfitLongInput = input.float(defval=0, step=0.01, title='Target Profit Long', minval=0)
takeProfitShortInput = input.float(defval=0, step=0.01, title='Target Profit Short', minval=0)

stopLossPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (stopLossLongInput / 100) * pips
stopLossPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (stopLossShortInput / 100) * pips

takeProfitPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (takeProfitLongInput / 100) * pips
takeProfitPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (takeProfitShortInput / 100) * pips

takeProfitALong = takeProfitLongInput > 0 ? takeProfitLongInput : na
takeProfitBLong = takeProfitPriceLong > 0 ? takeProfitPriceLong : na

takeProfitAShort = takeProfitShortInput > 0 ? takeProfitShortInput : na
takeProfitBShort = takeProfitPriceShort > 0 ? takeProfitPriceShort : na

stopLossALong = stopLossLongInput > 0 ? stopLossLongInput : na
stopLossBLong = stopLossPriceLong > 0 ? stopLossPriceLong : na

stopLossAShort = stopLossShortInput > 0 ? stopLossShortInput : na
stopLossBShort = stopLossPriceShort > 0 ? stopLossPriceShort : na

takeProfitLong = percentOrPipsInput == 'Pips' ? takeProfitALong : takeProfitBLong
stopLossLong = percentOrPipsInput == 'Pips' ? stopLossALong : stopLossBLong
takeProfitShort = percentOrPipsInput == 'Pips' ? takeProfitAShort : takeProfitBShort
stopLossShort = percentOrPipsInput == 'Pips' ? stopLossAShort : stopLossBShort

buyAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "buy", "price": ' + str.tostring(close) + '}'
sellAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "sell", "price": ' + str.tostring(close) + '}'

exitLongAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'
exitShortAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'

if (sides != "None")
    if tradersPostBuy
        strategy.entry('Long', strategy.long, when = sides != 'Short', alert_message = buyAlertMessage)
        strategy.close('Short', when = sides == "Short" and timeCondition, alert_message = exitShortAlertMessage)

    if tradersPostSell
        strategy.entry('Short', strategy.short, when = sides != 'Long', alert_message = sellAlertMessage)
        strategy.close('Long', when = sides == 'Long', alert_message = exitLongAlertMessage)

exitAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit"}'

strategy.exit('Exit Long', from_entry = "Long", profit = takeProfitLong, loss = stopLossLong, alert_message = exitAlertMessage)
strategy.exit('Exit Short', from_entry = "Short", profit = takeProfitShort, loss = stopLossShort, alert_message = exitAlertMessage)

strategy.close_all(when = timeConditionEnd)