Cette stratégie est basée sur 3 lignes EMA de différentes périodes. Elle juge la direction de la tendance actuelle en fonction du fait que le prix est au-dessus des lignes EMA. Lorsque la ligne EMA à court terme traverse au-dessus de la ligne EMA à long terme, un signal d'achat est généré. Lorsque la ligne EMA à court terme traverse au-dessous de la ligne EMA à long terme, un signal de vente est généré. Cette stratégie suit la tendance et ferme les positions à temps lorsque la tendance s'inverse.
La stratégie utilise 3 lignes EMA, qui sont respectivement de 10 jours, 20 jours et 50 jours.
Lorsque l'EMA à 10 jours et l'EMA à 20 jours sont à la fois supérieurs à l'EMA à 50 jours, elle est définie comme une tendance haussière;
Lorsque l'EMA à 10 jours et l'EMA à 20 jours sont inférieurs à l'EMA à 50 jours, elle est définie comme une tendance à la baisse;
Lorsque les lignes EMA à court terme (10 jours et 20 jours) franchissent la ligne EMA à long terme (50 jours), un signal d' achat est généré;
Lorsque les lignes EMA à court terme (10 et 20 jours) passent sous la ligne EMA à long terme (50 jours), un signal de vente est généré;
Détenir une position longue pendant une tendance haussière et une position courte pendant une tendance baissière;
Fermer la position directionnelle en cours lorsque la tendance est inversée (EMA à court terme croise EMA à long terme).
La stratégie permet de réaliser des bénéfices en clôturant les positions en temps opportun afin d'obtenir des gains et en alternant les positions longues et courtes.
Les avantages de cette stratégie sont les suivants:
Cette stratégie comporte également certains risques:
Lors des marchés à plage, les lignes EMA peuvent se croiser fréquemment, ce qui entraîne des coûts de négociation élevés dus à l'ouverture et à la fermeture fréquentes de positions;
La détermination de la tendance par l'EMA peut échouer après un écart de prix, manquant de bonnes opportunités d'entrée.
Pour optimiser les risques, certaines méthodes peuvent être utilisées:
Les règles relatives aux positions ouvertes peuvent être correctement assouplies lorsque les EMA sont proches pour éviter une suréchange;
Déterminer la tendance en combinant d'autres indicateurs afin d'éviter une défaillance de l'EMA.
La stratégie peut être optimisée par les aspects suivants:
Optimisation des paramètres. Tester différentes combinaisons de périodes EMA pour trouver les paramètres optimaux;
Optimisation des coûts de négociation. Optimiser correctement les règles de position ouverte pour réduire les transactions fréquentes inutiles;
Optimisation de la stratégie de stop-loss. Définir un niveau de stop-loss raisonnable pour contrôler une seule perte;
Utilisez le MACD, le KDJ et d'autres indicateurs pour aider à déterminer le moment optimal d'entrée.
En général, cette stratégie est assez simple et pratique. Elle utilise l'EMA pour déterminer la direction de la tendance avec une stratégie de stop loss appropriée pour contrôler efficacement les risques. Il existe également des possibilités d'optimisation. En combinant l'optimisation des paramètres, la stratégie de stop loss et d'autres indicateurs, la performance de cette stratégie peut être encore améliorée.
/*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") //-------------------------------------------------- //-------------------------------------------------- //--------------------------------------------------