Bollinger-Wellen-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-01-15 15:16:27
Tags:

img

Übersicht

Die Bollinger-Wellen-Strategie ist eine quantitative Handelsstrategie, die Bollinger-Bänder und gleitende Durchschnitte kombiniert.

Strategie Logik

Die Strategie berechnet zunächst einen exponentiellen gleitenden Durchschnitt (EMA) über einen angegebenen Zeitraum als Basislinie. Das obere Band (EMA + n mal Standardabweichung) und das untere Band (EMA - n mal Standardabweichung) werden dann anhand dieses EMA berechnet. Ein Bruch über dem oberen Band zeigt ein überkauftes Signal an, während ein Bruch unter dem unteren Band ein überverkauftes Signal anzeigt.

Wenn die Preise zwischen den oberen und unteren Bands liegen, ist dies der normale Kursschwankungsbereich der Aktie. Darüber hinaus kombiniert die Strategie andere Indikatoren wie RSI, um Handelssignale zu filtern und die Handelsfrequenz zu reduzieren, um unnötige Verluste zu minimieren.

Insbesondere gelten folgende Regeln für Handelssignale:

  1. Langes Signal: Schließen > Oberband und RSI ((14) > 60
  2. Kurzsignal: Schließen < Unterband und RSI(14) < 40

Wenn die oben genannten Handelssignale erscheinen, nehmen Sie Positionen mit fester Menge oder Kontoprozentsatz ein. Verlassen Sie Positionen, wenn sich die Preise wieder in Bands bewegen oder gegenteilige Signale erscheinen.

Vorteile

Die Strategie kombiniert Trendbestimmung und Überkauf-/Überverkaufsbeurteilung, um falsche Trades in Bereichsgrenzmärkten zu vermeiden.

Im Vergleich zu einfachen gleitenden Durchschnittsstrategien spiegeln Bollinger-Bänder die aktuelle Marktvolatilität und Risikoniveaus besser wider. Wenn die Bandbreite klein ist, sind Handelssignale zuverlässiger. Wenn die Bandbreite groß ist, wird die Handelsfrequenz automatisch reduziert. Eine solche anpassungsfähige Anpassung kann Strategierisiken basierend auf verschiedenen Marktbedingungen kontrollieren.

Darüber hinaus hilft die doppelte Bestätigung durch den RSI und andere Indikatoren, einige falsche Signale auszufiltern und falsche Trades um Trendwendepunkte zu vermeiden.

Risikoanalyse

Die wichtigsten Risiken dieser Strategie sind:

  1. Parameteroptimierungsrisiko. Wenn gleitende Durchschnitts- oder Standardabweichungsparameter unangemessen eingestellt werden, kann dies zu lauten Trades oder fehlenden Handelsmöglichkeiten führen. Diese Parameter benötigen iteratives Testen und Optimieren.

  2. Falsches Breakout-Signalrisiko. Wenn die Preise kurzzeitig über oder unter die Bands brechen und dann schnell umkehren, kann dies falsche Signale erzeugen. Blindhandel auf diese würde Verluste erhöhen. Dies kann durch Erhöhung der gleitenden Durchschnittsperiode oder Einstellung von Stop Loss kontrolliert werden.

  3. Hohe Handelsfrequenzrisiko: Wenn die Bands sehr enge Lücken haben, kann dies die Anzahl der Trades und die gezahlten Provisionen erhöhen und somit die endgültige Rentabilität beeinträchtigen. Dies kann durch eine moderate Erhöhung des gleitenden Durchschnittszeitraums gemindert werden.

Optimierungsrichtlinien

Es besteht Raum für eine weitere Optimierung der Strategie:

  1. Die Verwendung von Trailing Stop Loss oder Time Stop Loss hilft, Verluste in der Zeit zu realisieren und die Menge eines einzelnen Handelsverlusts zu kontrollieren.

  2. Fügen Sie Positionsgrößenregeln hinzu. Zum Beispiel Pyramiden in gewinnende Trades und Verluste reduzieren. Dies kann die Strategie Rendite verbessern.

  3. Kombination mit anderen Indikatoren für die Signalfilterung. Indikatoren wie KDJ und MACD können als Hilfswerkzeuge dienen. Dies hilft, die Rentabilität der Strategie weiter zu verbessern.

  4. Optimieren Sie die Parameter-Einstellungen. Systematischere Methoden wie genetische Algorithmen können verwendet werden, um verschiedene Parameterkombinationen zu testen und bessere Einstellungen zu finden.

Schlussfolgerung

Die Bollinger Wave Strategie integriert Trendbestimmung von gleitenden Durchschnitten und Überkauf/Überverkauf. Sie passt die Handelsfrequenz basierend auf Bandbreitenänderungen an, um sich an unterschiedliche Marktbedingungen anzupassen. Mittlerweile vermeidet die Signalfilterung durch RSI und andere Indikatoren falsche Trades. Die Strategie berücksichtigt sowohl die Verfolgung von Markttrends als auch die Kontrolle von Risiken.


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














Mehr