Dynamische Stop Loss Bollinger Bands-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-02-01 10:48:52
Tags:

img

Übersicht

Diese Strategie nutzt die oberen und unteren Schienen der Bollinger Bands, um dynamischen Stop-Loss zu implementieren. Sie geht kurz, wenn der Preis durch die oberen Schienen bricht und lang, wenn der Preis durch die unteren Schienen bricht. Und sie setzt dynamischen Stop-Loss, um die Preisbewegung zu verfolgen.

Grundsätze

Der Kern dieser Strategie liegt in den oberen und unteren Schienen der Bollinger Bands. Die mittlere Schiene ist der gleitende Durchschnitt für n Tage. Die obere Schiene ist die mittlere Schiene + kn-Tage Standardabweichung. Die untere Schiene ist die mittlere Schiene − kn-Tage Standardabweichung. Wenn der Preis von der unteren Schiene aufspringt, gehen Sie lang. Wenn der Preis von der oberen Schiene zurückfällt, gehen Sie kurz. Gleichzeitig setzt die Strategie einen Stop-Loss-Punkt und passt ihn während der Preisbewegung dynamisch an, um einen Gewinnpunkt zu setzen, um eine umsichtige Risikokontrolle zu implementieren.

Vorteile

  1. Bollinger-Bänder mit starker Regression auf die mittlere Schiene nutzen, um mittelfristige und langfristige Trends zu erfassen;
  2. Klarer langer und kurzer Signal, einfach zu bedienen;
  3. Einrichtung dynamischer Schiebe-Stop-Loss, um die Gewinnabsperrung zu maximieren und Risiken zu kontrollieren;
  4. Anpassungsfähige Parameter an unterschiedliche Marktbedingungen.

Risiken und Lösungen

  1. Bollinger-Bänder können mehrere lange und kurze Signale während von Range-gebundenen Märkten erzeugen, was dazu führt, dass Benutzer in Whipsaws gefangen werden.
  2. Die Lösung besteht darin, die Parameter für verschiedene Produkte angemessen zu optimieren.

Optimierungsrichtlinien

  1. Optimierung der gleitenden Durchschnittsparameter, um sie den Merkmalen des Produkts anzupassen;
  2. Hinzufügen einer Trendfilterung, um einen Bereichsgebundenen Markt zu vermeiden;
  3. Kombination mit anderen Indikatoren als Filterbedingungen zur Verbesserung der Strategie-Stabilität.

Schlussfolgerung

Diese Strategie nutzt Bollinger Bands Regressions-Attribute zusammen mit dynamischem gleitendem Stop-Loss, um mittelfristige und langfristige Trendgewinne zu erzielen und gleichzeitig Risiken zu kontrollieren.


/*backtest
start: 2024-01-24 00:00:00
end: 2024-01-31 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(shorttitle="BB Strategy", title="Bollinger Bands Strategy", overlay=true)
length = input.int(20, minval=1, group = "Bollinger Bands")
maType = input.string("SMA", "Basis MA Type", options = ["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group = "Bollinger Bands")
src = input(close, title="Source", group = "Bollinger Bands")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev", group = "Bollinger Bands")

ma(source, length, _type) =>
    switch _type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

basis = ma(src, length, maType)
dev = mult * ta.stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input.int(0, "Offset", minval = -500, maxval = 500, group = "Bollinger Bands")
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))

lo = input.bool(true, "Long", group = "Strategy")
sh = input.bool(true, "Short", group = "Strategy")
x = input.float(3.0, "Target Multiplier (X)", group = "Strategy", minval = 1.0, step = 0.1)
token = input.string(defval = "", title = "Token", group = "AUTOMATION")
Buy_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(1) + '"}'
Buy_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(2) + '"}'
Exit_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(-1) + '"}'
Exit_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(-2) + '"}'
Exit_PE_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(2.5) + '"}'
Exit_CE_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(1.5) + '"}'
long = high < lower
short = low > upper
var sl_b = 0.0
var tar_b = 0.0
var sl_s = 0.0
var tar_s = 0.0
var static_sl = 0.0
entry = strategy.opentrades.entry_price(strategy.opentrades - 1)
if long and lo and strategy.position_size == 0
    strategy.entry("Long", strategy.long, alert_message = Buy_CE, stop = high)
    strategy.exit("LX", "Long", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = low, alert_message = Exit_CE)
    sl_b := low
    tar_b := high + (math.abs(high - low) * x)
    static_sl := math.abs(low - high)
if short and sh and strategy.position_size == 0
    strategy.entry("Short", strategy.short, alert_message = Buy_PE, stop = low)
    strategy.exit("SX", "Short", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = high, alert_message = Exit_PE)
    sl_s := high
    tar_s := low - (math.abs(high - low) * x)
    static_sl := math.abs(high - low)
// if long and strategy.position_size < 0
//     strategy.entry("Long", strategy.long, alert_message = Exit_PE_CE, stop = high)
//     strategy.exit("LX", "Long", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = low, alert_message = Exit_CE)
//     sl_b := low
//     tar_b := high + (math.abs(high - low) * x)
// if short and strategy.position_size > 0
//     strategy.entry("Short", strategy.short, alert_message = Exit_CE_PE, stop = low)
//     strategy.exit("SX", "Short", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = high, alert_message = Exit_PE)
//     sl_s := math.max(high[1], high)
//     tar_s := low - (math.abs(high - low) * x)
if ta.change(dayofmonth) or (long[1] and not long[2])
    strategy.cancel("Long")
if ta.change(dayofmonth) or (short[1] and not short[2])
    strategy.cancel("Short")
var count = 1
if strategy.position_size != 0
    if strategy.position_size > 0
        if close > (entry + (static_sl * count))
            strategy.exit("LX", "Long", limit = tar_b, stop = sl_b, alert_message = Exit_CE)
            sl_b := entry + (static_sl * (count - 1))
            count += 1
            
    else
        if close < (entry - (static_sl * count))
            strategy.exit("SX", "Short", limit = tar_s, stop = sl_s, alert_message = Exit_PE)
            sl_s := entry - (static_sl * (count - 1))
            count += 1
// label.new(bar_index, high, str.tostring(static_sl))
if strategy.position_size == 0
    count := 1
plot(strategy.position_size > 0 ? sl_b : na, "", color.red, style = plot.style_linebr)
plot(strategy.position_size < 0 ? sl_s : na, "", color.red, style = plot.style_linebr)
plot(strategy.position_size > 0 ? tar_b : na, "", color.green, style = plot.style_linebr)
plot(strategy.position_size < 0 ? tar_s : na, "", color.green, style = plot.style_linebr)

Mehr