L' EMA et la stratégie de croisement cumulé du volume pour le long court

Auteur:ChaoZhang est là., Date: 20 septembre 2023 à 11h48
Les étiquettes:

Résumé

Cette stratégie combine les indicateurs EMA et de volume cumulé, générant des signaux d'achat et de vente basés sur leurs situations croisées pour déterminer les tendances.

La logique de la stratégie

L'EMA de 50 jours et les indicateurs de volume cumulé de 100 jours sont calculés. Lorsque l'EMA dépasse le volume cumulé par le bas, un signal d'achat est généré pour aller long. Lorsque l'EMA dépasse le volume cumulé par le haut, un signal de vente est généré pour aller court.

Pendant les positions, des stratégies de stop loss et de take profit sont mises en œuvre. Le stop loss est fixé à 8% en dessous du prix d'entrée. Le take profit est fixé à 8% au-dessus du prix d'entrée, avec une fermeture partielle de la position lorsque le prix atteint le niveau de profit.

Analyse des avantages

La stratégie combine l'indicateur de tendance EMA et le volume cumulé de l'indicateur de flux de fonds, en tirant parti des informations sur les prix et le volume pour identifier efficacement les tendances à moyen et long terme.

La période EMA peut être librement ajustée pour différents produits. Les transactions longues et courtes sont mises en œuvre pour le trading linéaire.

Analyse des risques

La dépendance excessive aux moyennes mobiles peut entraîner des fléchettes lors de consolidations à plage.

L'extension des périodes de moyenne mobile pourrait réduire les faux signaux. Des indicateurs supplémentaires tels que la volatilité, le RSI peuvent également aider les jugements. Optimiser les mécanismes de prise de profit et d'arrêt de perte, via des trail stops, des sorties dynamiques, etc. pourrait être bénéfique.

Directions d'optimisation

  1. Tester et optimiser les combinaisons de paramètres EMA pour trouver les paramètres optimaux.

  2. Incorporer d'autres indicateurs techniques pour former un système d'ensemble.

  3. Appliquer l'apprentissage automatique pour prédire les tendances et améliorer les performances de l'EMA.

  4. Optimiser les stratégies de prise de profit et de stop-loss en combinant les arrêts de trail, les sorties dynamiques, etc.

  5. Mettre en place des modules de gestion du capital pour la dimensionnement dynamique des positions.

  6. Personnaliser les paramètres en fonction des caractéristiques du produit pour former un ensemble stratégique.

Résumé

L'idée de la stratégie consistant à combiner EMA et volume pour l'identification de tendance est claire. Mais la dépendance excessive aux moyennes mobiles et aux sorties fixes présente des défauts. L'ajout de plus d'indicateurs de jugement et l'optimisation des sorties peuvent améliorer la robustesse.


/*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"   ) )




Plus de