Stratégie de suivi de tendance Momentum


Date de création: 2023-11-07 16:49:49 Dernière modification: 2023-11-07 16:49:49
Copier: 0 Nombre de clics: 650
1
Suivre
1617
Abonnés

Stratégie de suivi de tendance Momentum

Aperçu

La stratégie est basée sur l’analyse des tendances des moyennes mobiles et des volumes de transactions, la définition d’indicateurs de dynamique et la conduite d’opérations d’achat et de vente en suivant les tendances.

Principe de stratégie

  1. Calculer la moyenne EMA du prix de clôture et la moyenne EMA cumulée du volume de transactions
  2. Lorsque la clôture est portée sur l’EMA, elle est jugée comme une tendance à la hausse et effectue une opération à plusieurs têtes.
  3. Lorsque la hausse se poursuit et que la clôture franchit le double de la moyenne des EMA cumulées, ajouter des positions supplémentaires
  4. La mise en place de l’indicateur RSI, qui est compensé par 13 de la position lorsque le RSI est supérieur à 90
  5. Lorsque la clôture est inférieure à l’EMA, elle est considérée comme une tendance à la baisse et toutes les positions en plus sont liquidées.
  6. Lorsque la clôture dépasse l’EMA, elle est considérée comme une tendance à la baisse, et l’opération est effectuée à vide.
  7. La ligne de stop est un pourcentage fixe du prix d’entrée.
  8. Le profit de la tête vide est le même que celui de la tête nombreuse.

Analyse des avantages

Les principaux avantages de cette stratégie sont les suivants:

  1. L’utilisation de la moyenne EMA pour déterminer la tendance est efficace pour suivre la tendance.
  2. L’EMA cumulative est utilisée pour déterminer les changements de tendance réels.
  3. L’indicateur de dynamique RSI est en hausse
  4. Le risque est maîtrisé, il y a une limite de perte
  5. Paramètres qui peuvent être ajustés de manière flexible pour s’adapter à différentes situations

Analyse des risques

Les principaux risques de cette stratégie sont les suivants:

  1. L’EMA moyenne génère un retard et risque de manquer un tournant
  2. Le chiffre d’affaires ne reflète pas forcément la tendance réelle
  3. Le pourcentage fixe de stop-loss peut être trop mécanisé
  4. Il y a trop de paramètres et il est difficile de les ajuster.
  5. Les transactions sont fréquentes et coûteuses

Les solutions au risque:

  1. Optimiser les paramètres EMA pour réduire le retard
  2. En combinaison avec d’autres indicateurs, le signal de confirmation d’achèvement
  3. Optimiser les points de rupture en fonction des conditions du marché
  4. Simplifier les paramètres, ne conservant que les paramètres principaux
  5. Une marge de manœuvre et une fréquence de négociation appropriées

Direction d’optimisation

Cette stratégie peut être optimisée dans les domaines suivants:

  1. Tester différents réglages de paramètres EMA pour trouver la combinaison optimale
  2. Augmenter le multiplicateur de VOLUME pour déterminer la force du signal d’entrée
  3. Confirmation d’admission combinée à d’autres indicateurs tels que MACD, KD
  4. Pourcentage de stop-loss optimisé en fonction des caractéristiques d’une action
  5. Optimiser la fréquence des transactions et réduire les frais de transaction

Résumer

La stratégie est une stratégie de suivi de tendance basée sur un système linéaire uniforme. L’idée centrale est d’utiliser l’EMA pour déterminer la direction de la tendance et de confirmer l’entrée en jeu avec l’indicateur de dynamique VOLUME.

Code source de la stratégie
/*backtest
start: 2023-10-30 00:00:00
end: 2023-11-06 00:00:00
period: 5m
basePeriod: 1m
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=5, default_qty_type=strategy.percent_of_equity,  default_qty_value=20, initial_capital=10000)


emaLength= input(25, 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(true, 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)

cumValue = cumulPriceVolume / cumulVolume

emaVal=ema(close, emaLength)

emaCumValue1=ema(cumValue, emaLength)
emaCumValue2=ema(cumValue, emaLength*2)

emaCumValueHistory=ema(cumValue[emaLength], emaLength)


//vwapVal1=vwap(hlc3)

rsiVal=rsi(close,5)

plotEma=plot(emaVal, title="EMA", color=color.green,  transp=25)
//plot(vwapValue, title="Cumulate Volumne", color=color.orange,  linewidth=2, transp=25)
//plot(vwapVal1, title="vwapVal1", color=color.purple,  linewidth=1, transp=25)
plotCum=plot(emaCumValue1, title="emaVwapValue", color=color.purple,  linewidth=2, transp=35)
plot(emaCumValue2, title="emaVwapValue", color=color.yellow,  linewidth=3, transp=25)
fill(plotEma,plotCum, color=emaVal>emaCumValue1 ? color.lime : color.red, transp=35, title="ema and cum area")

plot(emaCumValueHistory, title="emaCumValueHistory", color=color.black,  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)

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

//re-entry
rentryCondition1=strategy.position_size>1 and emaVal > emaCumValue1 and emaCumValue1>emaCumValue2 and crossover(close, emaCumValue2) and close>open and  (tradeDirection=="LONG")
strategy.entry(id="LE",comment="LE RE", long=true, qty=qty1, when=rentryCondition1 )

rentryCondition2=strategy.position_size>1 and emaVal > emaCumValue1 and emaCumValue1>emaCumValueHistory and crossover(close, emaCumValueHistory) and close>open and  (tradeDirection=="LONG")
//strategy.entry(id="LE",comment="LE RE", long=true, qty=qty1, when=rentryCondition2 )    


//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+(1*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="PExit Points=>"+tostring(close-strategy.position_avg_price, "###.##") , qty=strategy.position_size/3 , when = (tradeDirection=="LONG" ) and  takePartialProfits == true and close>=takeProfit and crossunder(rsiVal,90) )

profitVal=    strategy.position_size>=1 ?  (strategy.position_avg_price * (1+(1*0.01) )) : ( close[1] * 2 )

//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="Exit Points=>"+tostring(close-strategy.position_avg_price, "###.##"), when=  crossunder(emaVal, emaCumValue1) 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=crossunder(emaVal, emaCumValue1) 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  crossover(rsiVal,15) )  //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<emaCumValue1 and close>emaCumValue1 and open>emaCumValue1 and close>open )   or (crossover(emaVal,emaCumValue1))  ) 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"   ) )
strategy.close(id="SE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and  crossover(emaVal, emaCumValue1)   and (tradeDirection=="SHORT"   ) )