Stratégie de suivi de tendance basée sur la moyenne mobile EMA


Date de création: 2024-02-05 14:21:18 Dernière modification: 2024-02-05 14:21:18
Copier: 0 Nombre de clics: 629
1
Suivre
1617
Abonnés

Stratégie de suivi de tendance basée sur la moyenne mobile EMA

Aperçu

La stratégie est basée sur les moyennes des EMA de 3 périodes différentes et détermine la direction de la tendance actuelle en déterminant si le prix est au-dessus de la moyenne des EMA. Elle génère un signal d’achat lorsque la courte ligne EMA traverse la longue ligne EMA et un signal de vente lorsque la courte ligne EMA traverse la longue ligne EMA.

Principe de stratégie

Cette stratégie utilise trois moyennes EMA, respectivement la ligne 10, la ligne 20 et la ligne 50. Ses règles de jugement sont:

  1. la tendance à la hausse est définie lorsque les lignes 10 et 20 sont simultanément au-dessus de la ligne 50;

  2. une tendance à la baisse lorsque les lignes 10 et 20 sont à la fois en dessous de la ligne 50;

  3. Un signal d’achat est généré lorsque la ligne EMA courte (ligne 10 et 20 jours) est traversée par la ligne EMA longue (ligne 50 jours);

  4. un signal de vente est généré lorsque la ligne EMA courte (ligne 10 et 20 jours) est traversée par la ligne EMA longue (ligne 50 jours);

  5. la détention d’une position de plus en plus importante dans une tendance à la hausse et d’une position vide dans une tendance à la baisse;

  6. Lorsque la tendance se déplace, les positions de la direction du signal actuel sont compensées par les lignes courtes et longues de l’EMA.

La stratégie consiste à effectuer des opérations de multi-volets par capture profit, en localisant les bénéfices en plaçant les positions en position libre à temps.

Analyse des avantages

Cette stratégie présente les avantages suivants:

  1. Les règles sont simples, claires, faciles à comprendre et à mettre en œuvre.
  2. L’utilisation de la moyenne EMA pour déterminer la direction de la tendance et éviter d’être perturbé par les fluctuations à court terme du marché;
  3. Il est important d’éliminer les positions en temps opportun, de suivre la tendance et d’éviter l’expansion des pertes.
  4. Il n’est pas nécessaire de prédire la direction des événements, il faut suivre la tendance, le taux de réussite est élevé.

Analyse des risques

Cette stratégie comporte aussi des risques:

  1. En cas de liquidation, les EMA sont sujettes à de multiples pénétrations entre les moyennes, ce qui peut entraîner un coût de transaction pour les prises de positions fréquentes.
  2. L’effet de la tendance de l’EMA après le saut de la transaction peut être affecté, ce qui peut entraîner la perte d’une bonne opportunité d’ouverture de position.

Les risques ci-dessus peuvent être optimisés de la manière suivante:

  1. Les règles d’ouverture des positions peuvent être assouplies de manière appropriée pour éviter des transactions trop fréquentes lorsque les intervalles des EMAs sont plus petits;
  2. En combinaison avec d’autres indicateurs pour déterminer la tendance et éviter que l’EMA ne juge inefficace.

Direction d’optimisation

Cette stratégie peut être optimisée dans les directions suivantes:

  1. Optimisation des paramètres. Il est possible de tester des combinaisons de paramètres de différents cycles EMA pour trouver le paramètre optimal.

  2. Optimisation des coûts de transaction. Optimisation appropriée des règles d’ouverture des positions afin de réduire la fréquence des transactions inutiles.

  3. Optimisation de la stratégie de stop-loss. Définition d’un niveau de stop-loss raisonnable pour contrôler les pertes individuelles.

  4. En combinaison avec d’autres indicateurs, l’utilisation d’autres indicateurs tels que le MACD, le KDJ et d’autres indicateurs d’aide au jugement pour optimiser le moment d’entrée.

Résumer

Cette stratégie est généralement simple et pratique. Elle utilise l’EMA pour déterminer la direction de la tendance, accompagnée d’une stratégie d’arrêt appropriée, permettant de contrôler efficacement le risque. Il existe également un espace d’optimisation, si l’efficacité de cette stratégie est combinée à l’optimisation des paramètres, à la stratégie d’arrêt et à d’autres indicateurs.

Code source de la stratégie
/*backtest
start: 2024-01-28 00:00:00
end: 2024-01-31 04:00:00
period: 45m
basePeriod: 5m
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/
// © mattehalen

//@version=4
//study("EMA 10,20 59",overlay=true)
strategy("EMA 10,20 59",overlay=true)
infoBox     = input(true, title="infoBox", type=input.bool)
infoBox2    = input(false, title="infoBox2", type=input.bool)
BuySellSignal_Bool = input(false, title="Buy & SellSignal", type=input.bool)
infoBoxSize = input(title="infoBoxSize", defval=size.large, options=[size.auto, size.tiny, size.small, size.normal, size.large, size.huge])
ema1Value   = input(10)
ema2Value   = input(20)
ema3Value   = input(59)
maxLoss = input(3000)
ema1        = ema(close,ema1Value)
ema2        = ema(close,ema2Value)
ema3        = ema(close,ema3Value)
objcnt      = 0
buyTitle    = tostring(close[1])
myProfit    = float(0)

plot(ema1,title="ema1",color=color.red,linewidth=2)
plot(ema2,title="ema2",color=color.green,linewidth=2)
plot(ema3,title="ema3",color=color.black,linewidth=2)

Buytrend = (ema1 and ema2 > ema3) and (ema1[1] and ema2[1] > ema3[1])
BarssinceBuyTrend = barssince(Buytrend)
BarssinceSellTrend = barssince(not Buytrend)
closeAtBuyTrend = close[1]
bgcolor(Buytrend ? color.green : color.red,transp=70)

BuySignal = Buytrend and not Buytrend[1] and BuySellSignal_Bool

BuySignalOut = Buytrend and (crossunder(ema1,ema2)) and BuySellSignal_Bool
BarssinceBuy = barssince(BuySignal)
bgcolor(BuySignal ? color.green : na , transp=30)
bgcolor(BuySignalOut ? color.black : na , transp=30)
plot(BarssinceBuy,title="BarssinceBuy",display=display.none)


SellSignal = not Buytrend and Buytrend[1] and BuySellSignal_Bool
SellSignalOut = not Buytrend and (crossover(ema1,ema2)) and BuySellSignal_Bool
BarssinceSell = barssince(SellSignal)
bgcolor(SellSignal ? color.red : na , transp=30)
bgcolor(SellSignalOut ? color.black : na , transp=30)
plot(BarssinceSell,title="BarssinceSell",display=display.none)


buyProfit   = float(0)
cntBuy      =0
sellProfit  = float(0)
cntSell     =0
buyProfit   := Buytrend and not Buytrend[1]? nz(buyProfit[1]) + (close[BarssinceBuyTrend[1]]-close) : nz(buyProfit[1])
cntBuy      := Buytrend and not Buytrend[1]? nz(cntBuy[1]) + 1: nz(cntBuy[1])
sellProfit  := not Buytrend and Buytrend[1]? nz(sellProfit[1]) + (close-close[BarssinceSellTrend[1]]) : nz(sellProfit[1])
cntSell     := not Buytrend and Buytrend[1]? nz(cntSell[1]) + 1 : nz(cntSell[1])
totalProfit = buyProfit + sellProfit

// if (Buytrend and not Buytrend[1] and infoBox==true)
//     l = label.new(bar_index - (BarssinceBuyTrend[1]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceBuyTrend[1]]) + "\n" + "Profit = "+tostring(close[BarssinceBuyTrend[1]]-close) ,style=label.style_labelup, yloc=yloc.belowbar,color=color.red,size=infoBoxSize)
// if (not Buytrend and Buytrend[1] and infoBox==true)
//     l = label.new(bar_index - (BarssinceSellTrend[1]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceSellTrend[1]]) + "\n" + "Profit = "+tostring(close-close[BarssinceSellTrend[1]]) ,style=label.style_labeldown, yloc=yloc.abovebar,color=color.green,size=infoBoxSize)

// if (BuySignalOut and not BuySignalOut[1] and infoBox2==true)
// //    l = label.new(bar_index - (BarssinceBuy[0]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceBuy[0]]) + "\n" + "Profit = "+tostring(close-close[BarssinceBuy[0]]) ,style=label.style_labelup, yloc=yloc.belowbar,color=color.purple,size=infoBoxSize
//     l = label.new(bar_index, na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceBuy[0]]) + "\n" + "Profit = "+tostring(close-close[BarssinceBuy[0]]) ,style=label.style_labelup, yloc=yloc.belowbar,color=color.lime,size=infoBoxSize)
// if (SellSignalOut and not SellSignalOut[1] and infoBox2==true)
// //    l = label.new(bar_index - (BarssinceSell[0]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceSell[0]]) + "\n" + "Profit = "+tostring(close[BarssinceSell[0]]-close) ,style=label.style_labeldown, yloc=yloc.abovebar,color=color.purple,size=infoBoxSize)
//     l = label.new(bar_index, na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceSell[0]]) + "\n" + "Profit = "+tostring(close[BarssinceSell[0]]-close) ,style=label.style_labeldown, yloc=yloc.abovebar,color=color.fuchsia,size=infoBoxSize)


// l2 = label.new(bar_index, na, 'buyProfit in pip = '+tostring(buyProfit)+"\n"+  'cntBuy = '+tostring(cntBuy) +"\n"+  'sellProfit in pip = '+tostring(sellProfit)+"\n"+  'cntSell = '+tostring(cntSell) +"\n"+  'totalProfit in pip = '+tostring(totalProfit)     , 
//   color=totalProfit>0 ? color.green : color.red, 
//   textcolor=color.white,
//   style=label.style_labeldown, yloc=yloc.abovebar,
//   size=size.large)

// label.delete(l2[1])



//--------------------------------------------------
//--------------------------------------------------
if (Buytrend)
    strategy.close("short", comment = "Exit short")
    strategy.entry("long", true)
    strategy.exit("Max Loss", "long", loss = maxLoss)

//if BuySignalOut
   // strategy.close("long", comment = "Exit Long")
if (not Buytrend)
    // Enter trade and issue exit order on max loss.
    strategy.close("long", comment = "Exit Long")
    strategy.entry("short", false)
    strategy.exit("Max Loss", "short", loss = maxLoss)
//if SellSignalOut
    // Force trade exit.
    //strategy.close("short", comment = "Exit short")
    
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------