Bollinger Band Limit Market Maker-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-01-24 11:05:56
Tags:

img

Übersicht

Dies ist eine Market Maker-Strategie, die Bollinger Bands als Einträge, gleitenden Durchschnitt als Schließung und einfachen Prozentsatz Stop-Loss verwendet.

Strategie Logik

Die Strategie verwendet die oberen und unteren Bande der Bollinger Bands als Gelegenheitsbereiche, um Positionen einzugehen.

Darüber hinaus verwendet die Strategie auch gleitende Durchschnittswerte als Benchmark für den Schlusspositionen. Bei der Halte von Long-Positionen, wenn der Preis über dem gleitenden Durchschnitt liegt, wird sie sich dafür entscheiden, Longs zu schließen; ähnlich wählt sie bei der Halte von Short-Positionen, wenn der Preis unter dem gleitenden Durchschnitt liegt, auch die Schließung von Shorts.

Für den Stop-Loss verwendet es einen einfachen Prozentsatz des Trailing-Stop-Loss basierend auf dem Einstiegspreis.

Analyse der Vorteile

Die wichtigsten Vorteile dieser Strategie sind:

  1. Die Verwendung von Bollinger-Bändern kann die Preisvolatilität effektiv erfassen und mehr Handelsmöglichkeiten schaffen, wenn die Volatilität steigt.
  2. Marktmacher-Strategien können durch den Handel auf beiden Seiten von dem Bid-Ask-Spread profitieren.
  3. Durch einen prozentualen Stop-Loss können Risiken proaktiv kontrolliert und riesige Verluste in Trendmärkten vermieden werden.

Risikoanalyse

Diese Strategie birgt auch einige Risiken:

  1. Bollinger-Bänder sind nicht immer zuverlässige Einstiegssignale und können manchmal falsche Signale geben.
  2. Marktmacherstrategien sind in unterschiedlichen Märkten anfällig für Schläge.
  3. Der Prozentsatz des Stop-Loss kann zu stark sein und sich nicht an komplexe Marktsituationen anpassen können.

Um diese Risiken zu mindern, können wir andere Filter hinzufügen, Stop-Loss-Einstellungen optimieren oder die Positionsgrößen angemessen begrenzen.

Optimierungsrichtlinien

Es gibt Raum für weitere Optimierungen:

  1. Wir können verschiedene Parameterkombinationen testen, um die optimalen Parameter zu finden.
  2. Wir können mehr Filter für die Mehrfaktorüberprüfung hinzufügen.
  3. Wir können maschinelle Lernmethoden verwenden, um Parameter automatisch zu optimieren.
  4. Wir können anspruchsvollere Stop-Loss-Methoden wie parabolische SAR in Betracht ziehen.

Schlussfolgerung

Insgesamt ist dies eine sehr profitable Hochfrequenz-Marktstrategie. Sie nutzt Bollinger-Bänder für Handelssignale und steuert das Risiko. Aber wir müssen uns auch ihrer Mängel bewusst sein und sie sorgfältig im Live-Handel überprüfen. Mit weiteren Optimierungen hat diese Strategie das Potenzial, noch stabilere und übergroße Renditen zu generieren.


/*backtest
start: 2023-12-24 00:00:00
end: 2024-01-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(shorttitle="BBL", title="BB limit", overlay = true)


length = input(200, minval=1)
src = input(hlc3, title="Source")
xmult = input(44, minval=0.001, maxval=5000, title = "bb mult (0.1%)")
s = input(title="Trend source", defval = "sma", options = ["ema", "sma", "rma", "wma"])
basis = s == "ema" ? ema(src, length) : s == "sma" ? sma(src, length) : s =="rma" ? rma(src, length) : wma(src, length)
sd = input(title="Dev source", defval = "stdev", options = ["stdev", "dev"])
mult = xmult / 10  
dev = sd == "stdev" ? mult * stdev(src, length) : mult * dev(src, length)
diff = input(0.5, title = "Spread")
LongPrice(p) =>
    LongPrice = diff == 0 ? p : floor(p / diff) * diff

ShortPrice(p) =>
    ShortPrice = diff == 0 ? p : ceil(p / diff) * diff

pyr = input(1, title = "Pyramiding")
useStopLoss = input(true)
stoploss_xmult = input(15, minval=0.001, maxval=5000, title = "StopLoss 0.1%")
stopLoss_mult = sd == "simple" ? 1 + stoploss_xmult / 10 / 100 : stoploss_xmult / 10  
dev2 = sd == "stdev" ? stopLoss_mult * stdev(src, length) : sd == "dev" ? stopLoss_mult * dev(src, length) : (stopLoss_mult - 1) * basis
upper = basis + (1*dev)
lower = basis - (1*dev)
plot(basis, color=fuchsia, linewidth=2)
plot(upper, color=green, linewidth=2)
plot(lower, color=green, linewidth=2)


strategy.cancel_all()

if strategy.position_size > 0 and close <= basis + diff * 2
    strategy.order("Close long", strategy.short, strategy.position_size, limit = ShortPrice(basis))
else 
    if strategy.position_size < 0 and close >= basis - diff * 2
        strategy.order("Close short", strategy.long, -strategy.position_size, limit = LongPrice(basis))
            
stopLossPrice1 = na
stopLossPrice2 = na
add = na
openOrderCondition = close > lower - 2 * diff and (strategy.opentrades < pyr or (strategy.position_size < 0 and strategy.position_avg_price > lower * (1 + stopLoss_mult / 100)))
if openOrderCondition
    add := strategy.position_size > 0 ? -strategy.position_size : close >= basis - diff * 2 ? 0 : -strategy.position_size
    strategy.order("Open long", strategy.long, strategy.equity / pyr / lower + add, limit = LongPrice(lower))
if useStopLoss and (strategy.position_size > 0 or openOrderCondition)
    add = openOrderCondition ? strategy.equity / pyr / lower : 0
    posPrice = strategy.position_size <= 0 ? lower : strategy.position_avg_price
    posSize = strategy.position_size <= 0 ? 0 : strategy.position_size
    stopLossPrice1 := posPrice * (1 - stopLoss_mult / 100)
    strategy.order("StopLoss open short ", strategy.short, posSize + add + strategy.equity / pyr / stopLossPrice1, stop = ShortPrice(stopLossPrice1))


openOrderCondition := close < upper + 2 * diff and (strategy.opentrades < pyr or (strategy.position_size > 0 and strategy.position_avg_price * (1 + stopLoss_mult / 100) < upper))
if openOrderCondition
    add := strategy.position_size < 0 ? strategy.position_size : close <= basis + diff * 2 ? 0 : strategy.position_size
    strategy.order("Open short", strategy.short, strategy.equity / pyr / upper + add, limit = ShortPrice(upper))
if useStopLoss and (strategy.position_size < 0 or openOrderCondition)
    add = openOrderCondition ? strategy.equity / pyr / upper : 0
    posPrice = strategy.position_size >= 0 ? upper : strategy.position_avg_price
    posSize = strategy.position_size >= 0 ? 0 : -strategy.position_size
    stopLossPrice2 := posPrice * (1 + stopLoss_mult / 100)
    strategy.order("StopLoss open long", strategy.long, posSize + add + strategy.equity / pyr / stopLossPrice2, stop = LongPrice(stopLossPrice2))

plot(not useStopLoss ? na : stopLossPrice1, color=red, linewidth=2)
plot(not useStopLoss ? na : stopLossPrice2, color=red, linewidth=2)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

Mehr