
La stratégie de suivi de la tendance basée sur le croisement des lignes de la même valeur est une stratégie de suivi de la tendance basée sur le croisement des lignes de la même valeur. La stratégie consiste à calculer les EMA rapides et les EMA lentes et à déterminer la direction de la tendance actuelle en fonction de leur croisement.
La logique centrale de la stratégie est de calculer deux moyennes EMA de différentes périodes, l’une en tant que ligne vide et l’autre en tant que ligne multiple. Plus précisément, la stratégie utilise l’indicateur talib pour calculer une moyenne EMA rapide de 8 cycles, en tant que ligne multiple; un autre moyen EMA lent de 21 cycles, en tant que ligne vide.
Lors de l’exécution d’opérations de négociation concrètes, la stratégie peut être à la fois en plus ou en moins; il est également possible de négocier dans les deux sens lorsque des lignes rapides et lentes se croisent. En outre, la stratégie définit également un prix de stop-loss et de stop-loss. Après l’ouverture d’une position, si le cours se déplace dans une direction défavorable, le stop-loss sera retiré; si le cours atteint l’objectif attendu, le stop-loss sera terminé.
Le plus grand avantage de la double stratégie de suivi de la ligne de parité EMA réside dans l’utilisation de la forte capacité de jugement de la tendance de la ligne de parité. La ligne de parité EMA est un outil de jugement de la tendance couramment utilisé, qui permet d’identifier les tendances de changement de prix et les moments de revirement grâce à la ligne de parité.
En outre, la stratégie a un réglage de direction de négociation flexible, qui permet à la fois de s’adapter à une tendance unidirectionnelle et de capturer des opportunités bidirectionnelles dans les zones de choc des prix, ce qui augmente la praticité de la stratégie. En même temps, un stop-loss est mis en place pour contrôler efficacement les risques et bloquer une partie des bénéfices.
Le plus grand risque de la double stratégie de suivi de la moyenne des EMAs réside dans le fait que le croisement de plusieurs petites magnitudes dans des conditions de choc entraîne des signaux de croisement fréquents et de faux signaux. Cela entraînera des ouvertures et des pertes fréquentes de la stratégie. Dans ce cas, il est possible d’augmenter de manière appropriée le cycle des EMAs pour réduire le nombre de croisements et la probabilité de faux signaux.
D’un autre côté, un paramètre de stop-loss trop petit augmente également la probabilité que la stratégie soit frappée. Dans ce cas, il est possible d’élargir le stop-loss de manière appropriée, mais il faut également prendre en compte le risque d’être arbitragé.
Cette stratégie peut être optimisée dans les domaines suivants:
Adaptation dynamique des cycles de l’EMA. Les cycles d’EMA peuvent être modifiés en fonction de la volatilité du marché et des résultats de la revue des paramètres optimaux, afin d’éviter les problèmes de suradaptation dans les cycles fixes.
Ajout de conditions de filtrage pour filtrer les faux signaux. Par exemple, il est possible de combiner le volume des transactions, de filtrer les faux croisements générés lors de petites oscillations. Il est également possible de combiner d’autres indicateurs, tels que le MACD, le KDJ, etc., pour éviter de générer des signaux à des moments incertains.
L’optimisation des stratégies d’arrêt des pertes, combinée à des indicateurs tels que l’ATR, permet de suivre le suivi dynamique des pertes d’arrêt des pertes.
Tester les différentes durées de position. Les durées de position trop longues sont susceptibles d’être affectées par des événements soudains. Les durées de position trop courtes entraînent des coûts de transaction et des coûts de dérapage plus élevés. Trouver le nombre optimal de jours de position peut améliorer la rentabilité de la stratégie.
La stratégie de suivi de l’équilibre de la double EMA est une stratégie de suivi de tendance solide et pratique dans son ensemble. Elle utilise l’équilibre de l’EMA pour juger de la tendance des prix, ce qui permet de saisir efficacement la direction de la tendance.
/*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)