Die Ressourcen sind geladen. Beförderung...

Handelsstrategie für mehrere Zeitrahmen mit Bollinger-Bändern

Schriftsteller:ChaoZhang, Datum: 2023-09-20 15:47:46
Tags:

Übersicht

Diese Strategie verwendet adaptive Bollinger Bands, um zwei Arten von Trailing Stop-Strategien zu entwerfen und sie systematisch über Zeitrahmen hinweg zu testen.

Strategie Logik

  1. Berechnen Sie die oberen und unteren Bands von adaptiven Bollinger Bands mit verstellbarer Kanalbreite.

  2. Breakout-Tracking-Strategie, um Positionen bei Bandbreakouts zu eröffnen und zu stoppen, wenn der Preis innerhalb von Bands umkehrt.

  3. Umkehrung Umkehrungsstrategie, um Positionen zu eröffnen, wenn der Preis Bands erreicht und zu stoppen, wenn der Preis innerhalb der Bands zurückkehrt.

  4. Verwenden Sie den CCI-Indikator, um die Long/Short-Seite zu bestimmen.

  5. Backtest über mehrere Zeitrahmen hinweg zur Überprüfung der Tragfähigkeit beider Strategien.

Vorteile

  1. Bollinger-Bänder sind intuitiv bei der Erfassung von Kurstrends.

  2. Die beiden Strategien entsprechen unterschiedlichen Marktbedingungen für die Robustheit.

  3. CCI hilft bei der Bestimmung der langen/kurzen Richtung.

  4. Mehrfach-Zeitrahmen-Backtesting macht die Ergebnisse überzeugender.

  5. Einfache und klare Strategieregeln, die leicht umzusetzen sind.

Risiken

  1. Bollinger-Bänder können in bestimmten Situationen scheitern.

  2. Risiken eines vorzeitigen oder verzögerten Stopps in beiden Strategien.

  3. CCI kann falsche Signale erzeugen.

  4. Behandle Backtest-Vorurteile vorsichtig.

  5. Die Optimierung birgt die Gefahr einer Überanpassung.

Erweiterung

  1. Testparameter, um optimale Kombinationen zu finden.

  2. Beurteilen Sie, ob Sie Filter mit anderen Indikatoren hinzufügen.

  3. Optimieren Sie Stopps, um Risiken zu reduzieren.

  4. Erforschung von Adaptivmethoden für die Kanalbreite.

  5. Überprüfen Sie mit mehr Symbolen und Zeitrahmen.

  6. Verwenden Sie maschinelles Lernen, um Parameter dynamisch zu optimieren.

Schlussfolgerung

Diese Strategie entwirft zwei Trailing-Stop-Strategien, die auf Bollinger-Bändern basieren, und testet sie über mehrere Zeitrahmen hinweg.


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




Mehr