Dynamische Stop-Loss-Bollinger-Band-Strategie


Erstellungsdatum: 2024-02-01 10:48:52 zuletzt geändert: 2024-02-01 10:48:52
Kopie: 0 Klicks: 682
1
konzentrieren Sie sich auf
1617
Anhänger

Dynamische Stop-Loss-Bollinger-Band-Strategie

Überblick

Die Strategie nutzt die Auf- und Abfahrt der Brin-Band, um einen dynamischen Stop-Loss zu erzielen. Wenn der Preis die Brin-Band überschreitet, wird er leer gemacht, wenn er die Bahn überschreitet, wird er überschritten, und es wird ein dynamischer Stop-Loss eingerichtet, um den Kurs zu verfolgen.

Grundsätze

Das Herzstück der Strategie liegt in den oberen und unteren Bahnen des Brin-Bandes. Die mittlere Bahn des Brin-Bandes ist der n-Tage-Bewegungsmittelwert, die obere Bahn ist die mittlere Bahn + k*n Tage Standardverschiebung, Unterbahn als Mittelbahn-k*n-Tage-Standard-Verschiebung. Wenn der Preis von der unteren Bahn nach oben rückt, machen Sie mehr; wenn der Preis von der oberen Bahn nach unten zurückgeht, machen Sie frei. Gleichzeitig setzen Sie die Strategie für die Stop-Loss-Position, ändern Sie die Stop-Loss-Position dynamisch während der Preisentwicklung und setzen Sie die Stop-Loss-Position ein, um eine vorsichtige Risikokontrolle zu erreichen.

Vorteile

  1. Die Brin-Band nutzt die starke Regressionsneutralität, um mittlere und längere Trends zu erfassen.
  2. Das ist eine sehr gute Idee, aber es ist nicht so einfach.
  3. Einrichtung eines dynamischen Schlupfpunkts, um Gewinne zu maximieren und Risiken zu kontrollieren;
  4. Die Parameter können je nach Marktbedingungen angepasst werden.

Risiken und Lösungen

  1. Die Brin-Band kann in einem Erschütterungsfall mehrmals mehr als ein Auslöser sein. Die Lösung besteht darin, einen vernünftigen Stop-Loss-Bereich einzurichten, um den Einzelschaden zu kontrollieren.
  2. Eine falsche Einstellung der Parameter kann zu einer Abnahme der Gewinnrate führen. Die Lösung ist eine vernünftige Optimierung der Parameter für verschiedene Sorten.

Optimierungsrichtung

  1. Optimierung der Moving Average-Parameter für die Anpassung an die Eigenschaften der Sorte;
  2. Es ist wichtig, dass sich die Trends an einem Trendfilter beteiligen, um Schwankungen vorzubeugen.
  3. In Kombination mit anderen Indikatoren als Filterbedingungen zur Steigerung der Strategiestabilität.

Zusammenfassen

Die Strategie nutzt die Regressionseigenschaft des Brin-Bands, kombiniert mit dynamischen Slip-Stops, um unter der Voraussetzung, dass das Risiko kontrolliert wird, einen Gewinn aus dem mittleren und langen Trend zu erzielen. Sie ist eine anpassungsfähige, stabile und quantitative Strategie. Durch die Optimierung der Parameter und der Regeln können mehr Sorten angepasst werden, um stabile Gewinne im realen Markt zu erzielen.

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