Stratégie des vagues de Bollinger

Auteur:ChaoZhang est là., Date: 15 janvier 2024
Les étiquettes:

img

Résumé

La stratégie des vagues de Bollinger est une stratégie de trading quantitative qui combine les bandes de Bollinger et les moyennes mobiles.

La logique de la stratégie

La stratégie calcule d'abord une moyenne mobile exponentielle (EMA) sur une période spécifiée comme la ligne de base. La bande supérieure (EMA + n fois l'écart type) et la bande inférieure (EMA - n fois l'écart type) sont ensuite calculées sur la base de cette EMA. Une rupture au-dessus de la bande supérieure indique un signal de surachat, tandis qu'une rupture au-dessous de la bande inférieure indique un signal de survente.

Lorsque les prix se situent entre les bandes supérieure et inférieure, c'est la fourchette normale de fluctuation des prix de l'action.

Plus précisément, les règles relatives aux signaux de négociation sont les suivantes:

  1. Signal long: proche > bande supérieure et RSI ((14) > 60
  2. Signal court: proche < bande inférieure et RSI ((14) < 40

Lorsque les signaux de trading ci-dessus apparaissent, prenez des positions avec une quantité fixe ou un pourcentage de compte.

Les avantages

La stratégie combine la détermination de la tendance et le jugement de surachat/survente afin d'éviter des transactions incorrectes sur les marchés à fourchette.

Les bandes de Bollinger reflètent mieux la volatilité actuelle du marché et les niveaux de risque que les stratégies simples de moyenne mobile.

En outre, la double confirmation du RSI et d'autres indicateurs aide à filtrer certains faux signaux et à éviter les transactions incorrectes autour des points tournants de la tendance.

Analyse des risques

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

  1. Risque d'optimisation des paramètres. Si les paramètres de moyenne mobile ou d'écart type sont définis de manière inappropriée, cela peut générer des transactions plus bruyantes ou manquer des opportunités commerciales. Ces paramètres nécessitent des tests et une optimisation itératifs.

  2. Le risque de faux signaux de rupture. Lorsque les prix dépassent brièvement les bandes puis s'inversent rapidement, cela peut générer des signaux incorrects. Le trading aveugle sur ceux-ci augmenterait les pertes. Cela peut être contrôlé en augmentant la période moyenne mobile ou en définissant un stop loss.

  3. Si les bandes ont des écarts très étroits, cela peut augmenter le nombre de transactions et les commissions payées, ce qui affecte la rentabilité finale.

Directions d'optimisation

La stratégie peut être encore optimisée:

  1. Ajouter un mécanisme de stop-loss. Utiliser un stop-loss de trailing ou un stop-loss de temps aide à réaliser des pertes dans le temps et à contrôler le montant de la perte d'un seul trade.

  2. Ajouter des règles de dimensionnement des positions. Par exemple, pyramider dans les transactions gagnantes et réduire les perdants. Cela peut améliorer le rendement de la stratégie.

  3. Combinez avec d'autres indicateurs pour le filtrage des signaux. Des indicateurs tels que KDJ et MACD peuvent servir d'outils de jugement auxiliaires. Cela aide à améliorer encore la rentabilité de la stratégie.

  4. Optimiser les paramètres. Des méthodes plus systématiques comme les algorithmes génétiques peuvent être utilisées pour tester différentes combinaisons de paramètres et trouver de meilleurs paramètres.

Conclusion

La stratégie de vague de Bollinger intègre la détermination de tendance des moyennes mobiles et le jugement de surachat / survente. Elle ajuste la fréquence des transactions en fonction des changements de largeur de bande pour s'adapter aux différentes conditions du marché. Pendant ce temps, le filtrage des signaux par RSI et d'autres indicateurs évite les transactions incorrectes. La stratégie prend en compte à la fois le suivi des tendances du marché et le contrôle des risques. Avec une optimisation continue, elle peut devenir une stratégie de trading quantitative rentable.


/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@FiboBuLL

strategy(shorttitle='FB Wave', title='FiboBuLL Wave', overlay=true, pyramiding=1, currency=currency.NONE, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

src = input(close, title='Source')
length = input.int(55, minval=1, title='EMA length')  // 20 for classis Bollinger Bands SMA line (basis)


mult = input.float(1., minval=0.236, maxval=2, title='Standard Deviation')  //2 for Classic Bollinger Bands //Maxval = 2 as higher the deviation, higher the risk
basis = ta.sma(src, length)
dev = mult * ta.stdev(src, length)

Show = input.string('Both', options=['Longs Only', 'Shorts Only', 'Both'], title='Trade Type')
CC = input(true, 'Color Bars')

upper = basis + dev
lower = basis - dev

//Conditions for Long and Short - Extra filter condition can be used such as RSI or CCI etc.

short = src < lower  // and rsi(close,14)<40
long = src > upper  // and rsi(close,14)>60

L1 = ta.barssince(long)
S1 = ta.barssince(short)

longSignal = L1 < S1 and not (L1 < S1)[1]
shortSignal = S1 < L1 and not (S1 < L1)[1]

//Plots and Fills


////Long/Short shapes with text
// plotshape(S1<L1 and not (S1<L1)[1]?close:na, text = "sᴇʟʟ", textcolor=#ff0100, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "SELL", editable = true)
// plotshape(L1<S1 and not (L1<S1)[1]?close:na, text = "ʙᴜʏ", textcolor = #008000, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "BUY", editable = true)  

// plotshape(shortSignal?close:na, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "Short Signal", editable = true)
// plotshape(longSignal?close:na, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "Long Signal", editable = true)  


p1 = plot(upper, color=color.new(#ff0000, 75), display=display.all, title='Upper Band')
p2 = plot(lower, color=color.new(#008000, 75), display=display.all, title='Lower Band')

p = plot(basis, color=L1 < S1 ? #008000 : S1 < L1 ? #ff0000 : na, linewidth=2, editable=false, title='Basis')

fill(p, p1, color=color.new(color.teal, 85), title='Top Fill')  //fill for basis-upper
fill(p, p2, color=color.rgb(217, 161, 161), title='Bottom Fill', transp=85)  //fill for basis-lower

//Barcolor

bcol = src > upper ? color.new(#8ceb07, 0) : src < lower ? color.new(#ff0000, 0) : src > basis ? color.green : src < basis ? color.red : na

barcolor(CC ? bcol : na, editable=false, title='Color Bars')


// //Alerts ----  // Use 'Once per bar close'

// alertcondition(condition=longSignal, title="Long - BB Filter", message='BB Filter Long @ {{close}}') // Use 'Once per bar close'
// alertcondition(condition=shortSignal, title="Short - BB Filter", message='BB Filter Short @ {{close}}')  // Use 'Once per bar close'

Notestart1 = input(true, '╔═══ Time Range to BackTest ═══╗')

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

// === FUNCTION EXAMPLE === 
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

if window() and (Show == 'Longs Only' or Show == 'Both')
    strategy.entry('AL', direction=strategy.long, when=longSignal)
    strategy.close('LongAL', when=shortSignal, comment='AL KAPA')

if window() and (Show == 'Shorts Only' or Show == 'Both')
    strategy.entry('SAT', direction=strategy.short, when=shortSignal)
    strategy.close('SAT', when=longSignal, comment='SAT KAPA')














Plus de