
Die Bollinger Wave Strategy ist eine quantitative Handelsstrategie, die Bollinger Wave Bands und Moving Averages kombiniert. Die Strategie erzeugt Handelssignale durch die Berechnung der Standarddifferenz der Bollinger Wave Bands und der Kreuzung des Signals des Moving Averages, um Markttrends und Überkauf-Überverkaufszonen zu ermitteln.
Die Strategie berechnet zunächst den Index-Moving-Average (EMA) innerhalb des angegebenen Zeitraums als Basislinie. Darauf basierend berechnet die Strategie dann die Oberbahnlinie (EMA + n-fache Standardabweichung) und die Unterbahnlinie (EMA - n-fache Standardabweichung).
Wenn der Preis zwischen der Oberbahnlinie und der Unterbahnlinie liegt, ist dies die normale Preisschwankungsbreite der Aktie. Darüber hinaus filtert die Strategie in Kombination mit anderen Indikatoren wie dem RSI die Handelssignale, reduziert die Handelsfrequenz und reduziert unnötige Verluste.
Die Regeln für die Beurteilung von Handelssignalen für diese Strategie lauten:
Eintritt bei den oben genannten Handelssignalen in Form von festen Mengen oder Kontoanteilen. Ausstieg aus der Position, wenn der Preis wieder in die Wellenbandbreite zurückkehrt oder ein gegenteiliges Signal auftritt.
Diese Strategie kombiniert Trendbeurteilung und Überkauf-Überverkauf-Beschluss, um Fehltrades bei der Schokkollidierung zu vermeiden. Im Vergleich zu einer Einzelimportfolio-Strategie kann unnötiges Positionseröffnen verringert und das Risiko wirksam kontrolliert werden.
Im Vergleich zu einfachen Moving-Average-Strategien ist die Boll-Band besser geeignet, um die aktuelle Marktvolatilität und das Risiko zu reflektieren. Bei einer breiten Bandbreite sind die Handelssignale zuverlässiger. Bei einer breiten Bandbreite wird die Handelsfrequenz automatisch reduziert. Diese Anpassung ermöglicht die Risikokontrolle der Strategie in Abhängigkeit von den verschiedenen Marktbedingungen.
Darüber hinaus wird die Strategie durch die doppelte Bestätigung von Indikatoren wie dem RSI geprüft, um falsche Signale zu filtern und falsche Trades an Trendwendepunkten zu vermeiden. Dies erhöht auch die Gewinnrate der Strategie.
Die Risiken der Strategie sind vor allem:
Risiken der Parameteroptimierung. Wenn die Moving Average-Parameter oder die Standarddifferenz-Modalitäten falsch eingestellt sind, entstehen mehr Noise-Trades oder verpasste Handelschancen. Diese Parameter müssen wiederholt getestet und optimiert werden.
Das Risiko, ein falsches Signal zu durchbrechen. Wenn der Preis kurz nach einem kurzen Überschreiten der Auf- und Abwärtslinie schnell zurückgreift, wird ein falsches Signal erzeugt.
Das Risiko der Handelsfrequenz. Wenn die Ab- und Auflauflinie zu klein ist, erhöht sich die Anzahl der Geschäfte und die Zahlung von Gebühren. Dies hat einen gewissen Einfluss auf die endgültigen Gewinne.
Die Strategie kann noch weiter optimiert werden:
Erhöhung der Stop-Loss-Mechanismen. Einrichtung von mobilen oder zeitlichen Stop-Losses, die dazu beitragen, die Verluste rechtzeitig zu stoppen und einzelne Verluste zu kontrollieren.
Positionsmanagement erhöhen. Zum Beispiel Regeln für die Ein- und Auslagerung von Positionen, die Gewinne und Verluste erhöhen. Dies kann die Ertragsrate der Strategie verbessern.
In Kombination mit anderen Indikatoren können Filtersignale wie KDJ, MACD und andere Indikatoren als Hilfssignale für die Beurteilung verwendet werden. Dies trägt zur weiteren Steigerung der Strategiegewinnquote bei.
Optimierung der Parameter-Einstellungen. Die Parameterkombinationen können durch systematischere Methoden wie genetische Algorithmen getestet werden, um bessere Parameter-Einstellungen zu finden.
Die Bollwellenband-Signalstrategie integriert die Trendbeurteilung der beweglichen Durchschnitte und die Überkauf-Überverkaufsbeurteilung. Sie passt die Handelsfrequenz an die Veränderung der Bandbreite an und passt sich an verschiedene Marktsituationen an. Gleichzeitig wird ein Signalfilter in Verbindung mit Indikatoren wie dem RSI durchgeführt, um falsche Geschäfte zu vermeiden. Die Strategie berücksichtigt sowohl die Notwendigkeit, Markttrends zu verfolgen, als auch die 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')