Stratégie de suivi des tendances de dynamique

Auteur:ChaoZhang est là., Date: 2023-11-07 16:49:49 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie est basée sur l'analyse des tendances des moyennes mobiles et du volume, établit des indicateurs de dynamique et effectue des opérations d'achat et de vente en suivant les tendances.

Principes de stratégie

  1. Calculer l'EMA du prix de clôture et l'EMA cumulée du volume
  2. Lorsque la clôture dépasse la EMA, elle est jugée comme une tendance à la hausse et une position longue est prise.
  3. Lorsque la tendance à la hausse se poursuit, la clôture dépasse 2 fois la moyenne moyenne cumulée, ajoutée à la position longue
  4. Définition de l'indicateur RSI, lorsque l'indicateur RSI dépasse 90, clôture de la position 1/3 pour la prise de profit
  5. Lorsque la clôture est inférieure à la EMA, elle est jugée comme une tendance à la baisse, clôture de toutes les positions longues
  6. Lorsque la clôture est inférieure à la EMA, elle est considérée comme une tendance à la baisse.
  7. Définition de la ligne stop-loss à un pourcentage fixe du prix d'entrée
  8. La prise de profit d'une position courte est la même que celle d'une position longue

Analyse des avantages

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

  1. L'utilisation de l'EMA pour juger des tendances peut suivre efficacement les tendances
  2. Utilisation de l'EMA cumulée du volume pour juger des changements réels de tendance
  3. Indicateur de dynamique de suivi RSI pour la prise de profit
  4. Bon contrôle des risques avec stop loss
  5. Peut s'adapter aux différentes conditions du marché, les paramètres peuvent être ajustés de manière flexible

Analyse des risques

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

  1. L'EMA est en retard, peut manquer des points tournants
  2. Le volume ne reflète pas toujours la tendance réelle
  3. Le pourcentage fixe de stop loss peut être trop mécanique
  4. Trop de paramètres rendent le réglage des paramètres difficile
  5. Une fréquence de négociation élevée entraîne des coûts de négociation élevés

Solution au risque:

  1. Optimiser les paramètres de l'EMA pour réduire le retard
  2. Combiner avec d'autres indicateurs pour confirmer les signaux de volume
  3. Optimiser les points d'arrêt des pertes en fonction des conditions du marché
  4. Simplifiez les paramètres, gardez uniquement les paramètres principaux
  5. Réduire la fréquence des arrêts de perte et des opérations de manière appropriée

Directions d'optimisation

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

  1. Testez différents paramètres EMA pour trouver la combinaison optimale
  2. Ajouter des multiples de volume comme jugement de la force du signal pour l'entrée
  3. Combiner avec le MACD, le KD et d'autres indicateurs pour confirmer l'entrée
  4. Optimiser le pourcentage de stop loss en fonction des caractéristiques des stocks spécifiques
  5. Optimiser la fréquence des transactions afin de réduire les coûts de négociation

Résumé

En résumé, il s'agit d'une stratégie de suivi de tendance basée sur un système de moyenne mobile. L'idée principale est d'utiliser l'EMA pour déterminer la direction de la tendance et confirmer l'entrée avec l'indicateur de momentum VOLUME. Il peut être continuellement optimisé grâce à l'ajustement des paramètres et assisté par d'autres indicateurs pour une confirmation ultérieure. Dans l'ensemble, il s'agit d'une stratégie de suivi de tendance flexible, qui peut générer de bons rendements après une utilisation compétente.


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



Plus de