Deuxièmement exponentielle moyenne mobile tendance suivant la stratégie

Auteur:ChaoZhang est là., Date: 2024-02-02 17:11:29 Je suis désolé
Les étiquettes:

img

Résumé

La stratégie de suivi de la tendance de la moyenne mobile exponentielle double est une stratégie de suivi de la tendance basée sur les croisements de la moyenne mobile exponentielle (EMA). Elle juge la direction de la tendance actuelle en calculant la ligne EMA rapide et la ligne EMA lente et agit sur leurs croisements. Lorsque la ligne EMA rapide traverse au-dessus de la ligne EMA lente, elle est déterminée comme un signal haussier. Lorsque la ligne EMA rapide traverse au-dessous de la ligne EMA lente, elle est déterminée comme un signal baissier.

La logique de la stratégie

La logique de base de cette stratégie consiste à calculer deux lignes EMA de différentes périodes - l'une agit comme la ligne baissière et l'autre comme la ligne haussière. Plus précisément, la stratégie calcule une ligne EMA rapide de 8 périodes en utilisant l'indicateur talib comme la ligne haussière. Et elle calcule une ligne EMA lente de 21 périodes comme la ligne baissière. Elle juge ensuite les relations de croisement entre la ligne EMA rapide et la ligne EMA lente. Lorsque la ligne rapide traverse au-dessus de la ligne lente, elle détermine un signal haussier pour aller long. Lorsque la ligne rapide traverse en dessous de la ligne lente, elle détermine un signal baissier pour aller court.

En termes d'exécution commerciale réelle, cette stratégie peut aller long seulement, aller court seulement, ou aller dans les deux sens lorsque le croisement se produit entre les lignes rapides et lentes. En outre, les prix de stop loss et take profit sont configurés dans la stratégie. Après l'ouverture des positions, si le prix va dans une direction défavorable, le stop loss sera déclenché pour les positions de sortie. Si le prix atteint le niveau cible attendu, le profit sera réalisé et les positions fermées.

Analyse des avantages

Le plus grand avantage de la stratégie de suivi de tendance double EMA réside dans la puissante capacité d'identification de tendance des croisements de moyennes mobiles.

En outre, les réglages flexibles sur les directions commerciales rendent la stratégie adaptable à la fois aux tendances unidirectionnelles et aux oscillations bidirectionnelles, améliorant ainsi l'applicabilité de la stratégie.

Analyse des risques

Le risque le plus important de cette stratégie est les faux signaux déclenchés par les petits croisements fréquents sur les marchés à plage. Cela conduirait à une ouverture et à des pertes excessives de positions. Pour y remédier, nous pouvons augmenter les périodes EMA afin de réduire les temps de croisement et les probabilités de faux signaux.

D'autre part, un paramètre de stop loss trop serré augmente également les chances d'être arrêté.

Directions d'optimisation

Cette stratégie peut être encore optimisée dans les domaines suivants:

  1. Ajustement adaptatif sur les périodes EMA basé sur la volatilité du marché et les résultats des tests antérieurs, en évitant le surajustement sur des périodes fixes.

  2. Ajouter des conditions de filtrage pour filtrer les faux signaux, par exemple combiner avec les volumes de négociation pour filtrer les croisements insignifiants; ou combiner d'autres indicateurs comme le MACD et le KDJ pour éviter les signaux d'incertitude.

  3. Optimiser les stratégies de stop loss et de take profit, par exemple en combinant l'ATR pour réaliser un suivi dynamique sur SL/TP, en évitant un SL trop serré et un TP prématuré.

  4. Test de différentes périodes de détention. Des périodes de détention trop longues peuvent être affectées par des incidents, tandis que des périodes trop courtes entraînent des coûts de négociation élevés et des coûts de glissement. Trouver les jours de détention optimaux peut améliorer la rentabilité de la stratégie.

Résumé

En général, la stratégie de suivi de tendance double EMA est un système de trading de tendance robuste et pratique. Elle capte efficacement les directions de tendance grâce au système de croisement EMA. Pendant ce temps, les paramètres flexibles sur les directions de trading la rendent adaptable; le stop loss configuré et les risques de contrôle des bénéfices. Avec d'autres optimisations et améliorations, cette stratégie peut devenir un outil puissant pour le trading quantitatif.


/*backtest
start: 2024-01-02 00:00:00
end: 2024-02-01 00:00:00
period: 2h
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, default_qty_value=100, initial_capital=100000, default_qty_type=strategy.percent_of_equity, pyramiding=0)

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)

Plus de