Stratégie de négociation multi-temporelle avec bandes de Bollinger

Auteur:ChaoZhang est là., Date: 2023-09-20 15:47:46 Je vous en prie.
Les étiquettes:

Résumé

Cette stratégie utilise des bandes de Bollinger adaptatives pour concevoir deux types de stratégies de trailing stop et les tester systématiquement à travers les délais.

La logique de la stratégie

  1. Calculer les bandes supérieures et inférieures des bandes de Bollinger adaptatives, avec une largeur de canal réglable.

  2. Stratégie de suivi des écarts pour ouvrir des positions sur les écarts de bande et s'arrêter lorsque le prix revient à l'intérieur des bandes.

  3. Stratégie d'inversion pour ouvrir des positions lorsque le prix atteint des bandes et s'arrêter lorsque le prix revient dans les bandes.

  4. Utiliser l'indicateur CCI pour aider à déterminer le côté long/courte.

  5. Tests de retour sur plusieurs délais pour vérifier la viabilité des deux stratégies.

Les avantages

  1. Les bandes de Bollinger sont intuitives pour capturer les tendances des prix.

  2. Les deux stratégies s'adaptent à des conditions de marché différentes en matière de robustesse.

  3. Le CCI aide à déterminer la direction longue/courte.

  4. Le backtesting sur plusieurs périodes rend les résultats plus convaincants.

  5. Des règles de stratégie simples et claires, faciles à mettre en œuvre.

Les risques

  1. Les bandes de Bollinger peuvent échouer dans certaines situations.

  2. Risques d'arrêt prématuré ou retardé dans les deux stratégies.

  3. Le CCI peut générer des signaux incorrects.

  4. Traitez les biais des backtests avec soin.

  5. L'optimisation risque d'être trop adaptée.

Amélioration

  1. Les paramètres d'essai pour trouver les combinaisons optimales.

  2. Évaluer l'ajout de filtres avec d'autres indicateurs.

  3. Optimiser les arrêts pour réduire les risques.

  4. Rechercher des méthodes adaptatives pour la largeur du canal.

  5. Vérifiez avec plus de symboles et de délais.

  6. Utilisez l'apprentissage automatique pour optimiser dynamiquement les paramètres.

Conclusion

Cette stratégie conçoit deux stratégies de trailing stop basées sur les bandes de Bollinger et les teste à travers plusieurs délais.


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

//@version=4
strategy(title = "Underworld Hunter", overlay=true)

len = input(75, minval=1, title="Length")
src = input(close, title="Source")
basis = 0.0
basis := na(basis[1]) ? sma(src, len) : ema(ema(ema(src,len),len),len)

mult = input(1.9, minval=0.001, maxval=50, title="Deviation")
dev = mult * stdev(src, len)
upper = basis + dev
lower = basis - dev

//CCI calculation and inputs

lengthcci = input(20, minval=1, title="Period for CCI")
ma = sma(close, lengthcci)
ccivalue = (src - ma) / (0.015 * dev(src, lengthcci))

//CCI plotting

cciover0 = ccivalue >= 100 and ccivalue <= 120
cciover1 = ccivalue > 120 and ccivalue <= 140
cciover2 = ccivalue > 140 and ccivalue <= 160
cciover3 = ccivalue > 160 and ccivalue <= 180
cciover4 = ccivalue > 180

cciunder0 = ccivalue <= -100 and ccivalue >= -120
cciunder1 = ccivalue <= -120 and ccivalue > -140
cciunder2 = ccivalue <= -140 and ccivalue > -160
cciunder3 = ccivalue <= -160 and ccivalue > -180
cciunder4 = ccivalue <= -180

plotshape(cciover0, title="CCIO0", location=location.abovebar, color=#c6ff1a, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciunder0, title="CCIU0", location=location.belowbar, color=#c6ff1a, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover1, title="CCIO1", location=location.abovebar, color=#ffff00, transp=0,style=shape.circle, size=size.tiny)
plotshape(cciunder1, title="CCIU1", location=location.belowbar, color=#ffff00, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover2, title="CCIO2", location=location.abovebar, color=#ff9900, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciunder2, title="CCIU2", location=location.belowbar, color=#ff9900, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover3, title="CCIO3", location=location.abovebar, color=#ff0000, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciunder3, title="CCIU3", location=location.belowbar, color=#ff0000, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover4, title="CCIO4", location=location.abovebar, color=#cc00cc, transp=0,style=shape.circle, size=size.tiny)
plotshape(cciunder4, title="CCIU4", location=location.belowbar, color=#cc00cc, transp=0,style=shape.circle, size=size.tiny)

//plotting

plot(upper, title="Upper shadow", color=color.black, transp = 30, linewidth = 4)
plot(upper, title="Upper line", color=#FF2E00, transp = 0, linewidth = 2)
plot(lower, title="Lower shadow", color=color.black, transp = 30, linewidth = 4)
plot(lower, title="Lower line", color=#FF2E00, transp = 0, linewidth = 2)
plot(basis, title="Basic line", color=color.red, transp = 50, linewidth = 2)

mean = input(title="Test Reverse to the Mean instead", type=input.bool, defval=false)
test = input(title="Enable testing", type=input.bool, defval=true)

ordersize=floor(50000/close)

if(close>upper and strategy.opentrades==0 and not mean and test)
    strategy.entry("Hunt Up", strategy.long, ordersize)
if (close<upper and close[1]<upper and close[2]<upper)
    strategy.close("Hunt Up", qty_percent = 100, comment = "Hunt End")

if(close<lower and strategy.opentrades==0 and not mean and test)
    strategy.entry("Hunt Down", strategy.short, ordersize)
if (close>lower and close[1]>lower and close[2]>lower)
    strategy.close("Hunt Down", qty_percent = 100, comment = "Hunt End")

//bounce of bands

if(close>upper and strategy.opentrades==0 and mean and test)
    strategy.entry("Sneak Down", strategy.short, ordersize)
if (close<upper and close[1]<upper and close[2]<upper and close>high[1])
    strategy.close("Sneak Down", qty_percent = 100, comment = "SneakEnd")

if(close<lower and strategy.opentrades==0 and mean and test)
    strategy.entry("Sneak Up", strategy.long, ordersize)
if (close>lower and close[1]>lower and close[2]>lower and close<low[1])
    strategy.close("Sneak Up", qty_percent = 100, comment = "Sneak End")




Plus de