Stratégie de suivi de tendance adaptative de Bollinger

Auteur:ChaoZhang est là., Date: le 16 novembre 2023 à 16h35
Les étiquettes:

img

Résumé

Cette stratégie est basée sur l'indicateur Bollinger Bands, combiné à une moyenne mobile adaptative, pour juger et suivre avec précision les tendances.

La logique de la stratégie

La stratégie se compose principalement des éléments suivants:

  1. Calculer la moyenne mobile adaptative Utiliser l'indicateur de régression linéaire pour calculer la courbe de régression linéaire sur une certaine période comme moyenne mobile.

  2. Utilisez l'indicateur ATR adaptatif pour calculer les bandes, combiné au paramètre ratio2 spécifié par l'utilisateur, pour obtenir les bandes supérieures et inférieures.

  3. Déterminez les entrées et les sorties. Jugez la direction de la tendance et les entrées/sorties en fonction de la rupture des prix à travers les bandes de Bollinger.

  4. Utilisez des points fixes de stop loss pour contrôler les risques et de trailing stop profit pour maximiser les profits de tendance.

  5. Combinez avec la fenêtre de temps de backtesting pour l'optimisation et la vérification de la stratégie.

Les avantages

  1. Paramètres adaptatifs: les moyennes mobiles et les bandes sont adaptées aux changements du marché.

  2. Les signaux de rupture sont clairs, les bandes de Bollinger offrent des signaux de renversement de tendance.

  3. Le stop-loss fixe maîtrise les risques et le stop-profit de trailing vise à maximiser les profits de tendance.

  4. Validée par backtesting, la fenêtre de backtesting vérifie l'efficacité de la stratégie.

  5. La logique est claire et le code est concis pour une compréhension facile.

Les risques

  1. Les bandes de Bollinger nécessitent un réglage des paramètres. La largeur et la période de la bande peuvent nécessiter une optimisation pour différents produits. Des paramètres incorrects entraînent des signaux manquants ou de faux déclencheurs.

  2. Période de backtest limitée: la plage de backtest récente peut être insuffisante pour vérifier pleinement la stabilité des données historiques complètes.

  3. Risque de suradaptation: les paramètres actuels optimisés peuvent surpasser les conditions spécifiques du marché récentes.

  4. Le niveau de stop loss doit être évalué. Les petits stop loss peuvent être trop sensibles et être arrêtés par de petites fluctuations. Les besoins de stop loss appropriés doivent être évalués.

  5. Manque de validation quantifiable. Actuellement, utilisez uniquement la ventilation graphique pour les signaux commerciaux sans validation de métriques quantifiables.

Directions d'amélioration

  1. Introduire des indicateurs plus adaptatifs, tester des combinaisons de différentes moyennes mobiles adaptatives et de différents canaux pour créer un système de suivi des tendances robuste.

  2. Utilisez des méthodes plus systématiques comme des algorithmes génétiques pour trouver une combinaison optimale de paramètres.

  3. Élargir la période de backtest. Tester sur des données historiques plus larges pour examiner la stabilité des paramètres. Incorporer des coûts de transaction pour un backtest plus réaliste.

  4. Mettez en place des filtres quantitatifs, des filtres comme le volume de rupture, l'écart de l'histogramme MACD pour éviter les fausses ruptures.

  5. Optimiser les arrêts. Évaluer les différents niveaux de stop-loss fixes et les méthodes d'arrêt de trail pour trouver des arrêts optimaux.

  6. Exécutez une stratégie optimisée en direct pour enregistrer les performances pour d'autres améliorations.

Conclusion

La stratégie a une logique claire en utilisant les bandes de Bollinger pour déterminer la direction de la tendance et capturer les signaux de rupture, la moyenne mobile définissant la tendance globale. Avec des optimisations appropriées, elle peut devenir une tendance stable et fiable suivant la stratégie. Mais les considérations clés incluent la représentativité des backtests, les filtres quantitatifs et le réglage des stops. Si ces aspects sont bien gérés, la stratégie peut réaliser des profits stables et considérables dans le trading en direct.


/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-09 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Linear Regression (Backtest / Trailing Stop)",overlay=true)
close_price = close[0]

len = input(40)
linear_reg = linreg(close_price, len, 0)

calculationToPlotAverageMeanLine=linear_reg
useUpperDeviation = input(true, "Upper Deviation", bool)
useLowerDeviation = input(true, "Lower Deviation", bool)
ratio2=input(defval=2,title=" Ratio 2")
avg=atr(len)
r2=avg*ratio2
top=linear_reg+r2
bott=linear_reg-r2

calculationToPlotUpperLine=top
calculationToPlotLowerLine=bott

plotUpperDeviationLine = plot(not useUpperDeviation ? na : calculationToPlotUpperLine, color=color(blue,0))
plotAverageMeanLine = plot(calculationToPlotAverageMeanLine, color=color(olive,0))
plotLowererDeviationLine = plot(not useLowerDeviation ? na : calculationToPlotLowerLine, color=color(red,0))
fill(plotUpperDeviationLine, plotAverageMeanLine, color=color(blue,85))
fill(plotLowererDeviationLine, plotAverageMeanLine, color=color(red,85))


//
length = input(title="linear Length",  defval=40, minval=1)
multiplier = input(title="linear Deviation", type=float, defval=2, minval=1)
overbought = input(title="Overbought",  defval=1, minval=1)
oversold = input(title="Oversold",  defval=0, minval=1)
custom_timeframe = input(title="Use another Timeframe?", type=bool, defval=false)
highTimeFrame = input(title="Select The Timeframe",  defval="60")
res1 = custom_timeframe ? highTimeFrame : timeframe.period

fixedSL = input(title="SL Activation", defval=70)
trailSL = input(title="SL Trigger", defval=10)
fixedTP = input(title="TP Activation", defval=50)
trailTP = input(title="TP Trigger", defval=10)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2015)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2015)

start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

smabasis = linreg(close_price, length, 0)
stdev = stdev(close, length)
cierre = request.security(syminfo.tickerid, res1, close, false)
alta = request.security(syminfo.tickerid, res1, high, false)
baja = request.security(syminfo.tickerid, res1, low, false)
basis1 = request.security(syminfo.tickerid, res1, smabasis, false)
stdevb = request.security(syminfo.tickerid, res1, stdev, false)
dev = multiplier * stdevb // stdev(cierre, length)
upper = basis1 + dev
lower = basis1 - dev

bbr = (cierre - lower)/(upper - lower)

// plot(bbr)

// // MARCA LAS RESISTENCIAS
pintarojo = 0.0
pintarojo := nz(pintarojo[1])
pintarojo := bbr[1] > overbought and bbr < overbought ? alta[1] :  nz(pintarojo[1])
p = plot(pintarojo, color = red, style=circles, linewidth=2)

// // MARCA LOS SOPORTES
pintaverde = 0.0
pintaverde := nz(pintaverde[1])
pintaverde := bbr[1] < oversold and bbr > oversold ? baja[1] :  nz(pintaverde[1])
g = plot(pintaverde, color = black, style=circles, linewidth=2)
zz= crossover(pintaverde,pintaverde[1]) or crossunder(pintaverde,pintaverde[1])
kp= crossover(pintarojo,pintarojo[1]) or crossunder(pintarojo,pintarojo[1]) 
plotshape(zz,  title="buy", style=shape.triangleup,location=location.belowbar, color=green, transp=0, size=size.small)
plotshape(kp, title="sell", style=shape.triangledown,location=location.abovebar, color=red, transp=0, size=size.small)


strategy.entry("BUY", strategy.long, qty=10, oca_name="BUY",  when=zz and window())
strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)

strategy.entry("SELL", strategy.short, qty=10, oca_name="SELL",  when=kp and window())
strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=trailSL, trail_points=fixedTP)


Plus de