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.
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.
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.
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.
Tester l’optimisation des combinaisons de paramètres EMA pour trouver le paramètre optimal.
L’introduction d’autres indicateurs techniques pour former une stratégie de composition des indicateurs.
Appliquer l’apprentissage automatique pour prédire les tendances des prix et améliorer l’efficacité de l’EMA.
Optimiser les stratégies de stop-loss, combinées à des mécanismes tels que le suivi des stops et des stops dynamiques.
Introduction d’un module de gestion des fonds et d’une mise à jour dynamique des positions.
Adapter les paramètres en fonction des caractéristiques de la variété pour former un portefeuille de stratégies.
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.
/*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" ) )