Stratégie de trading long et short basée sur l'EMA et le volume cumulé


Date de création: 2023-09-20 11:48:34 Dernière modification: 2023-09-20 11:48:34
Copier: 0 Nombre de clics: 793
1
Suivre
1617
Abonnés

Aperçu

Cette stratégie, combinée à l’EMA et à l’indicateur de volume de transaction cumulé, permet de juger de la tendance du marché en fonction du croisement des deux, générant des signaux d’achat et de vente. Il s’agit d’une stratégie typique de suivi des tendances, qui suit la direction du marché au niveau des lignes plus longues.

Principe de stratégie

Calculer la moyenne de l’EMA sur 50 jours et l’indicateur de la masse cumulée sur 100 jours. Lorsque l’EMA dépasse la masse cumulée de bas en haut, un signal d’achat est généré.

Lors de la tenue d’une position, définissez des stratégies de stop-loss et de stop-exiting. Le stop-loss est défini à 8% en dessous du prix d’entrée; le stop-stop est défini à 8% au-dessus du prix d’entrée et la partie de la position est libérée lorsque le prix atteint le point d’arrêt.

Analyse des avantages

Cette stratégie, combinée à l’indicateur de tendance EMA et à l’indicateur de flux de trésorerie pour accumuler le volume de transactions, exploite pleinement les informations sur les prix et le volume de transactions, permettant d’identifier efficacement les tendances de la ligne médiane et longue. La stratégie de stop loss fixe est directement efficace et utile pour bloquer une partie des bénéfices et contrôler les risques.

Il est possible d’ajuster librement les paramètres de la période EMA pour s’adapter à différentes variétés. Il est possible de faire plus de blanchiment et de réaliser des transactions linéaires. Les données de retracement montrent que la stratégie fonctionne bien dans des conditions de tendance.

Analyse des risques

La stratégie est trop dépendante de l’indicateur de la moyenne et est encadrée par des signaux erronés dans des situations de zone de choc. Les arrêts fixes peuvent également entraîner des arrêts prématurés ou des arrêts excessifs. Seuls les prix et les informations sur le volume de transactions sont pris en compte, sans tenir compte d’autres facteurs.

Les paramètres de la moyenne peuvent être étendus de manière appropriée pour réduire les faux signaux. Des indicateurs tels que le taux de volatilité et le RSI peuvent également être introduits pour aider à juger. Optimiser les mécanismes d’arrêt et de perte, par exemple en introduisant des méthodes de suivi des pertes et des arrêts dynamiques.

Direction d’optimisation

  1. Tester l’optimisation des combinaisons de paramètres EMA pour trouver le paramètre optimal.

  2. L’introduction d’autres indicateurs techniques pour former une stratégie de composition des indicateurs.

  3. Appliquer l’apprentissage automatique pour prédire les tendances des prix et améliorer l’efficacité de l’EMA.

  4. Optimiser les stratégies de stop-loss, combinées à des mécanismes tels que le suivi des stops et des stops dynamiques.

  5. Introduction d’un module de gestion des fonds et d’une mise à jour dynamique des positions.

  6. Adapter les paramètres en fonction des caractéristiques de la variété pour former un portefeuille de stratégies.

Résumer

La stratégie intègre les EMA et les indicateurs de volume de transaction pour déterminer clairement les tendances des lignes moyennes et longues. Cependant, il y a un problème avec une dépendance excessive à la ligne moyenne et aux arrêts fixes. L’ajout de plus d’indicateurs pour déterminer et optimiser les stratégies de stop-loss peut améliorer la stabilité de la stratégie et l’espace de profit.

Code source de la stratégie
/*backtest
start: 2023-08-20 00:00:00
end: 2023-09-19 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/
// © mohanee

//@version=4
strategy("EMA_cumulativeVolume_crossover[Strategy]", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity,  default_qty_value=20, initial_capital=10000)


emaLength= input(50, title="EMA Length", minval=1, maxval=200)
cumulativePeriod = input(100,  title="cumulative volume Period", minval=1, maxval=200)


riskCapital = input(title="Risk % of capital", defval=10, minval=1)
stopLoss=input(8,title="Stop Loss",minval=1)
takePartialProfits=input(false, title="take partial profits  (percentage same as stop loss)")

tradeDirection=input(title="Trade Direction", defval="LONG", options=["LONG", "SHORT"])

avgPrice = (high + low + close) / 3
avgPriceVolume = avgPrice * volume

cumulPriceVolume = sum(avgPriceVolume, cumulativePeriod)
cumulVolume = sum(volume, cumulativePeriod)

vwapValue = cumulPriceVolume / cumulVolume

emaVal=ema(close, emaLength)

plot(emaVal, title="EMA", color=color.green,  transp=25)
plot(vwapValue, title="Cumulate Volumne / VWAP", color=color.orange,  linewidth=2, transp=25)

bgcolor(emaVal>vwapValue?color.blue:color.purple)    

//Entry--
//Echeck how many units can be purchased based on risk manage ment and stop loss
qty1 = (strategy.equity  * riskCapital / 100 ) /  (close*stopLoss/100)  

//check if cash is sufficient  to buy qty1  , if capital not available use the available capital only
qty1:= (qty1 * close >= strategy.equity ) ? (strategy.equity / close) : qty1

strategy.entry(id="LE",comment="LE", long=true, qty=qty1, when=crossover(emaVal, vwapValue)  and (tradeDirection=="LONG") )    //emaVal>vwapValue and crossover(close , emaVal)

//stoploss
stopLossVal=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00

//draw initil stop loss
plot(strategy.position_size>=1 ? stopLossVal : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
takeProfit=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1+(stopLoss*0.01) )) : ( close[1] * 2 )
if(takePartialProfits==true)
    strategy.close(id="LE", comment="Partial"+tostring(close-strategy.position_avg_price, "###.##") , qty=strategy.position_size/3 , when = (tradeDirection=="LONG" ) and close>takeProfit and crossunder(close, emaVal) )    //close<close[1] and close[1]<close[2] and close[2]<close[3])
    
strategy.close(id="LE" , comment="LE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossunder(emaVal, vwapValue) and (tradeDirection=="LONG") )

strategy.close(id="LE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= close < stopLossVal   and (tradeDirection=="LONG") )


//for short  you dont have to wait crossodown of ema, falling is speed , so just check if close crossing down vwapVal
strategy.entry(id="SE",comment="SE", long=false, qty=qty1, when=(close<vwapValue and close<open  and close[1] < vwapValue  and close[1]<open[1] and close<close[1])  and emaVal>=vwapValue and (tradeDirection=="SHORT") )    //emaVal>vwapValue and crossover(close , emaVal)

//stoploss
stopLossValUpside=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1+(stopLoss*0.01) )) : 0.00

//draw initil stop loss
plot(abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ? stopLossValUpside : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
shortTakeProfit=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00
if(takePartialProfits==true)
    strategy.close(id="SE", comment="Partial" , qty=strategy.position_size/3 , when = (tradeDirection=="SHORT"   ) and  close<shortTakeProfit )  //close<takeProfit and (emaVal - close)>8 )
  
//strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossover(emaVal, vwapValue) and (tradeDirection=="SHORT") )
strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and ( (emaVal<vwapValue and close>vwapValue and open>vwapValue and close>open )   or (crossover(emaVal,vwapValue))  ) and (tradeDirection=="SHORT") )

strategy.close(id="SE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and  close > stopLossValUpside   and (tradeDirection=="SHORT"   ) )