Bollinger-Bänder Umkehrungsschwingungstrendstrategie

Schriftsteller:ChaoZhang, Datum: 31.10.2023
Tags:

img

Übersicht

Dies ist eine umgekehrte Schwingungstrendstrategie, die auf dem Bollinger Bands-Kanal basiert.

Strategie Logik

Die Strategie verwendet Bollinger Bands als Haupttechnischen Indikator. Bollinger Bands bestehen aus einem n-Perioden gleitenden Durchschnitt und der Abweichung der oberen/unteren Bands. Oberer Band = n-Perioden MA + m * n-Perioden Standardabweichung, Unterer Band = n-Perioden MA - m * n-Perioden Standardabweichung. n und m sind Parameter.

Wenn der Preis sich dem oberen Band nähert, zeigt er einen Aufwärtstrend an, kann sich aber an seinem Höchststand umkehren.

Die spezifischen Handelsregeln sind:

  1. Lang gehen, wenn Sie > oberen Bereich schließen, kurz gehen, wenn Sie < unteren Bereich schließen.

  2. Verwenden Sie den gleitenden Durchschnitt für n Perioden als Gewinn- und Stop-Loss-Signal.

  3. Verwenden Sie für jeden Handel eine feste Menge.

  4. Verwenden Sie eine feste, fractionelle Positionsgröße. Erhöhen Sie die Positionsgröße um einen festen Betrag, wenn Sie eine feste Gewinnquote erreichen, verringern Sie die Größe, wenn Sie einen Verlust erleiden.

Analyse der Vorteile

Die Vorteile dieser Strategie:

  1. Die Verwendung des Bollinger Bands Kanals zur Bestimmung der Trendrichtung und der Umkehrung des Handels vermeidet die meisten Whipsaws und verbessert die Gewinnrate.

  2. Der gleitende Durchschnitt ist ein zuverlässiges Profit-Take/Stop-Loss-Signal, das die meisten Gewinne sichert.

  3. Eine feste Menge ist einfach und einfach umzusetzen, keine komplexe Berechnung ist erforderlich.

  4. Eine feste Positionsaufteilung erweitert die Gewinne und kontrolliert das Risiko durch Positionsanpassung.

Risikoanalyse

Die Risiken dieser Strategie:

  1. Bollinger Bands können falsche Signale erzeugen, was zu Verlusten im Trendhandel führt.

  2. Eine Verzögerung des gleitenden Durchschnitts kann zu einer unzureichenden Gewinnentnahme führen.

  3. Die Festmenge kann sich nicht an die Marktbedingungen anpassen, es besteht die Gefahr einer Über-/Unterposition.

  4. Eine aggressive Anpassung der Positionsgröße in der festen Bruchteilmethode kann die Verluste vergrößern.

Lösungen: Optimieren Sie die Bollinger Bands-Parameter, um die Signalgenauigkeit zu verbessern. Fügen Sie andere Indikatoren hinzu, um den Trend zu bestimmen. Reduzieren Sie die feste Quantitätsgröße. Senken Sie die Anpassungsquote der Positionsgröße in der fractionalen Positionsgrößenmethode.

Verbesserungsrichtlinien

Die Strategie kann in folgenden Aspekten verbessert werden:

  1. Optimieren Sie Bollinger Bands Parameter wie n und m, um die Genauigkeit zu erhöhen.

  2. Fügen Sie andere Indikatoren wie MACD, KD hinzu, um falsche Signale zu vermeiden.

  3. Änderung der festen Menge auf dynamische Positionierung basierend auf den Marktbedingungen.

  4. Niedrigere Anpassungsquote der Positionsgröße bei der fractionalen Positionsgröße zu einer glatten Eigenkapitalkurve.

  5. Fügen Sie Stop-Loss-Strategien hinzu, wie bewegender Stop-Loss, Ausbruch Stop-Loss, um das Risiko zu kontrollieren.

  6. Parameteroptimierung zur Suche nach optimalen Parameterkombinationen.

Zusammenfassung

Zusammenfassend ist dies eine typische Bollinger Bands-Umkehrstrategie. Sie identifiziert Umkehrpunkte durch Bollinger Bands, setzt Gewinnübernahme/Stop-Loss durch gleitenden Durchschnitt, kontrolliert das Risiko durch feste Quantität und Bruchteilpositionsgröße. Als Umkehrstrategie vermeidet sie theoretisch einige Whipsaws und verbessert die Rentabilität im Vergleich zu traditionellen Bollinger Bands-Strategien. Allerdings erfordern Mängel in Bollinger Bands, gleitende Durchschnitte weitere Optimierung und Risikomanagement für eine robuste praktische Anwendung.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © gsanson66


//This strategy uses the well-known Bollinger Bands Indicator
//@version=5
strategy("BOLLINGER BANDS BACKTESTING", shorttitle="BB BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18)


//----------------------------------------FUNCTIONS---------------------------------------//

//@function Displays text passed to `txt` when called.
debugLabel(txt, color) =>
    label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//---------------------------------------USER INPUTS--------------------------------------//

//Technical parameters
bbLength = input.int(defval=20, minval=1, title="BB Length", group="Technical Parameters")
mult = input.float(defval=2, minval=0.1, title="Standard Deviation Multipler", group="Technical Parameters")
smaLength = input.int(defval=20, minval=1, title="SMA Exit Signal Length", group="Technical Parameters")
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2020 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")


//----------------------------------VARIABLES INITIALISATION-----------------------------//
strategy.initial_capital = 50000
//Exit SMA
smaExit = ta.sma(close, smaLength)
//BB Calculation
basis = ta.sma(close, bbLength)
dev = mult * ta.stdev(close, bbLength)
upperBB = basis + dev
lowerBB = basis - dev
//Money management
equity = strategy.equity - strategy.openprofit
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95
//Backtesting period
bool inRange = na


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    strategy.close_all()
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116))


//-----------------------------------EXIT SIGNAL------------------------------//

if strategy.position_size > 0 and close < smaExit
    strategy.close("Long")
if strategy.position_size < 0 and close > smaExit
    strategy.close("Short")


//----------------------------------LONG/SHORT CONDITION---------------------------//

//Long Condition
if close > upperBB and inRange
    qty = cashOrder/close
    strategy.entry("Long", strategy.long, qty)
//Short Condition
if close < lowerBB and inRange
    qty = cashOrder/close
    strategy.entry("Short", strategy.short, qty)


//---------------------------------PLOTTING ELEMENT----------------------------------//

plot(smaExit, color=color.orange)
upperBBPlot = plot(upperBB, color=color.blue)
lowerBBPlot = plot(lowerBB, color=color.blue)
fill(upperBBPlot, lowerBBPlot, title = "Background", color=strategy.position_size>0 ? color.rgb(0, 255, 0, 90) : strategy.position_size<0 ? color.rgb(255, 0, 0, 90) : color.rgb(33, 150, 243, 95))


Mehr