Stratégie de suivi des tendances en bandes de Bollinger à double moyenne mobile

Auteur:ChaoZhang est là., Date: 2023-12-11 15:10:02 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie détermine la direction générale de la tendance du marché en calculant deux moyennes mobiles exponentielles (EMA) sur différentes périodes et identifie les opportunités de surachat et de survente le long de la direction de la tendance en utilisant des bandes de Bollinger adaptatives pour mettre en œuvre le trading de tendance.

La logique de la stratégie

  1. L'EMA à 200 périodes et l'EMA à 30 périodes sont calculées. Si l'EMA à 200 périodes est supérieure à l'EMA à 30 périodes, la tendance à long terme est déterminée à la hausse. Sinon, elle est déterminée à la baisse.

  2. Une fois la direction de la tendance déterminée, la ligne de base, la bande supérieure et la bande inférieure des bandes de Bollinger sont calculées. La ligne de base adopte la SMA sur une période de temps configurable (par exemple 8 périodes). La largeur de bande est un multiplicateur configurable (par exemple 1,3 et 1.1) de l'amplitude des prix les plus élevés et les plus bas sur la même période que la ligne de base.

  3. Lorsque la tendance à long terme est à la hausse, la rupture de la bande inférieure indique une entrée longue; lorsque la tendance à long terme est à la baisse, la rupture de la bande supérieure indique une entrée courte.

  4. Pour filtrer les fausses ruptures, le taux de variation sur la dernière bougie avant la rupture est vérifié pour être inférieur à un seuil configurable (par exemple 3%), et la largeur de bande est vérifiée pour être supérieure à un niveau configurable (par exemple 2,2% du prix de clôture).

  5. Après l'ouverture des positions, des positions de stop loss (par exemple -3%) et de take profit (par exemple 10%) configurables sont définies pour verrouiller les bénéfices.

Points forts de la stratégie

  1. Les doubles EMA définissent la tendance majeure et évitent l'ouverture désordonnée de positions lorsque la tendance majeure n'est pas claire.

  2. Les bandes de Bollinger adaptatives fixent des points d'entrée le long de la tendance.

  3. Le taux de variation et les exigences de largeur minimale filtrent efficacement les fausses éruptions.

  4. Les paramètres de stop loss et de prise de bénéfices bloquent raisonnablement les bénéfices tout en maîtrisant les risques.

Risques stratégiques

  1. Les EMA doubles ne parviennent pas à localiser avec précision les points d'inversion de tendance, en manquant les opportunités aux points tournants de la tendance.

  2. Les paramètres BB incorrects peuvent provoquer de faux signaux.

  3. Le stop loss et le take profit fixes ne sont pas adaptés aux fluctuations du marché.

Directions d'optimisation

  1. Incorporer d'autres indicateurs pour déterminer les renversements de tendance majeurs et secondaires.

  2. Adopter un réglage dynamique des paramètres BB.

  3. Définir des ordres conditionnels de stop-loss et de prise de bénéfices selon des critères spécifiques.

Conclusion

Cette stratégie met en œuvre le trading de tendance en jugeant la tendance majeure en utilisant des EMA doubles et en identifiant les opportunités avec des bandes de Bollinger. Sa force réside dans le fait de définir raisonnablement les conditions d'entrée, de stop loss et de prise de profit pour verrouiller les profits de tendance. Il existe également certains risques, comme le fait de ne pas capter les points tournants de la tendance et les paramètres de BB inappropriés.


/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//////////////////////////////////////////////////////////////////////
// Component Code Start
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2039, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
// Component Code Stop

strategy("Custom Band Strategy", overlay=true)
source = close //종가 기준

//추세 조건 설정
emaLong = ema(source, input(200, minval=0))
emaShort = ema(source, input(30, minval=0))
trend = if emaShort>=emaLong
    1
else
    -1
    
plot(emaLong, color=red, transp=0)
plot(emaShort, color=blue, transp=0)


//BB 계산(default 14/3.2)
length = input(8, minval=1)

basis = sma(source, length)
plot(basis, color=green, transp=0)
max=highest(abs(source-basis), length)

factor1 = input(1.3, minval=0.5)
factor2 = input(1.1, minval=0.5)

upper = if trend==1
    basis + max*factor1
else
    basis + max*factor2
lower = if trend==-1
    basis - max*factor1
else
    basis - max*factor2

plot1 = plot(upper)
plot2 = plot(lower)
fill(plot1, plot2, transp=80, color=green)

//밴드 이탈 후 재진입 조건 설정
cross_over = (low<=lower and close>=lower) or crossover(close,lower)
cross_under = (high>=upper and close<=upper) or crossunder(close,upper)

//변동율 계산
maxCandle=highest(abs(open-close), length)
    
roc = abs(open-close)/open*100
changerate = input(3, minval=0.0)

//수익률 계산
value = abs(strategy.position_size)*strategy.position_avg_price
roe = strategy.openprofit/value * 100
expRoeL = (upper-lower)/lower*100
expRoeS = (upper-lower)/upper*100
exp = input(2.2, minval=0.0)

target = input(10, minval=0.0)
stop = input(-3, minval=-10.0)

strategy.close_all(when=roc>=changerate and testPeriod())
strategy.close_all(when=roe>=target and testPeriod())
strategy.close_all(when=roe<=stop and testPeriod())

plotchar(crossover(close,lower) and crossunder(close,upper),color=blue, transp=0, text="cross")
plotchar(roc>=changerate,color=red, transp=0, text="roc")
plotchar(roe>=target,color=blue, transp=0, text="target")
plotchar(roe<=stop,color=green, transp=0, text="stop")

minroe = input(2, minval=0.0)

strategy.close_all(when=cross_under and roe>minroe and testPeriod())
strategy.entry("BBandLE", strategy.long, stop=source, oca_name="BollingerBands",  comment="BBandLE", when=(cross_over) and trend==1 and roc<changerate and expRoeL>exp and source>emaLong and strategy.position_size==0 and testPeriod()) //trend==1 and 
//else
strategy.close_all(when=cross_over and roe>minroe and testPeriod())
strategy.entry("BBandSE", strategy.short, stop=source, oca_name="BollingerBands",  comment="BBandSE", when=(cross_under) and trend==-1 and roc<changerate and expRoeS>exp and source<emaLong and strategy.position_size==0 and testPeriod()) //trend==-1 and 

Plus de