Bollinger Band Moving Average Pair Trading-Strategie


Erstellungsdatum: 2023-11-24 15:32:57 zuletzt geändert: 2023-11-24 15:32:57
Kopie: 0 Klicks: 706
1
konzentrieren Sie sich auf
1617
Anhänger

Bollinger Band Moving Average Pair Trading-Strategie

Überblick

Die Brin-Band-Even-Line-Paar-Trading-Strategie ist eine Trendverfolgungsstrategie, die mit dem Marktpreis arbeitet. Sie nutzt die Kreuzung von Brin-Bands und Moving Averages als Handelssignale, um eine quantitative Strategie zu realisieren, die automatisch Markttrends identifiziert und mit Stop-Loss-Regeln gehandelt wird.

Strategieprinzip

Die Strategie basiert hauptsächlich auf dem Kreuzungssignal der Bollinger Bands und der Moving Average Indicators. Konkret verwendet sie gleichzeitig die Bollinger Bands-Mittelbahn, die Bollinger Bands-Oberbahn und sieben Moving Averages mit einer Länge von 5 bis 200 Tagen. Ein Kaufsignal wird erzeugt, wenn der Preis die Bollinger Bands-Mittelbahn und die Unterbahn von unten nach oben durchbricht; ein Verkaufsignal wird erzeugt, wenn der Preis die Bollinger Bands-Oberbahn von oben nach unten durchbricht.

Zusätzlich wurde die Multi-Bohr-Beurteilung von moveToFract eingeführt, die den aktuellen Marktumlauf nach oben oder nach unten berechnet, indem sie kurz- und langfristige Moving Averages berechnet, um falsche Signale in schwankenden Situationen zu vermeiden. Schließlich bildet die Kombination von konfigurierbaren Stop-Loss-Regeln eine vollständige Trend-Tracking-Handelsstrategie.

Analyse der Stärken

  1. Flexibilität in der Konfiguration, Anpassung der Parameterkombinationen an unterschiedliche Marktumgebungen
  2. Die Kombination zweier verschiedener Indikatoren als Filter reduziert Fehlsignale
  3. Trends zu beurteilen hilft, einen schwankenden Markt zu vermeiden.
  4. Tracking-Stopp-Einstellungen für maximale Gewinne

Risikoanalyse

  1. Die Parameter müssen entsprechend den unterschiedlichen Perioden angepasst werden, um übermäßige Transaktionen zu vermeiden
  2. Tracking-Stopps können Verluste bei schnellen Rückgängen ausweiten
  3. Sicherstellen, dass die finanziellen Mittel ausreichend sind, um die Gefahr von Verlusten nicht zu überwinden

Optimierungsrichtung

  1. Die Einführung von Gold-Kreuz- und Todesvorhängen kann weiter optimiert werden.
  2. Die besten Parameter für das Training von Maschinellen Lernen sind unterschiedliche Parameter
  3. Der Index der Volatilität und der Trendschwankungen zeigen, dass die Windkontrolle verstärkt wurde.

Zusammenfassen

Diese Strategie ist insgesamt eine sehr praktische Trendverfolgungsstrategie. Sie nutzt Kennzahlen für die Entscheidungsfindung und enthält ein Modul zur Trendentscheidung, mit dem falsche Signale effektiv ausgeschaltet werden können. Nach der Konfiguration von Stop-Loss-Stopps kann der Trend vollständig verfolgt und gehandelt werden, um bessere Gewinne zu erzielen. Durch die Anpassung der Parameterpalette und die Hinzufügung von mehr Filtern kann die Strategie weiter optimiert werden, um sich an mehr Marktumgebungen anzupassen.

Strategiequellcode
/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("BuyTheDip", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
exitType = input(title="Exit Strategy", defval="Signal", options=["Signal", "TrailingStop", "Both"])
LookbackPeriod = input(30, minval=10,step=10)

BBStdDev = input(2, minval=1, maxval=10, step=0.5)
BBLength = input(60, minval=5, step=5)

atrLength = input(22)
atrMult = input(6)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
backtestYears = input(10, minval=1, step=1)
includePartiallyAligned = true
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getTrailingStop(atr, atrMult)=>
    stop = close - atrMult*atr
    stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop
    stop

f_getMaAlignment(MAType, includePartiallyAligned)=>
    ma5 = f_getMovingAverage(close,MAType,5)
    ma10 = f_getMovingAverage(close,MAType,10)
    ma20 = f_getMovingAverage(close,MAType,20)
    ma30 = f_getMovingAverage(close,MAType,30)
    ma50 = f_getMovingAverage(close,MAType,50)
    ma100 = f_getMovingAverage(close,MAType,100)
    ma200 = f_getMovingAverage(close,MAType,200)

    upwardScore = 0
    upwardScore := close > ma5? upwardScore+1:upwardScore
    upwardScore := ma5 > ma10? upwardScore+1:upwardScore
    upwardScore := ma10 > ma20? upwardScore+1:upwardScore
    upwardScore := ma20 > ma30? upwardScore+1:upwardScore
    upwardScore := ma30 > ma50? upwardScore+1:upwardScore
    upwardScore := ma50 > ma100? upwardScore+1:upwardScore
    upwardScore := ma100 > ma200? upwardScore+1:upwardScore
    
    upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
    downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
    upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0
    
inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0)

exitBySignal = exitType == "Signal" or exitType == "Both"
exitByTrailingStop = exitType == "TrailingStop" or exitType == "Both"
maAlignment = f_getMaAlignment(MAType,includePartiallyAligned)
atr = atr(atrLength)

trailingStop = f_getTrailingStop(atr, atrMult)
maAligned = highest(maAlignment,LookbackPeriod)
[middle, upper, lower] = bb(close, BBLength, BBStdDev)

buyCondition = maAligned == 1 and (crossover(close, lower) or crossover(close, middle))
buyExitCondition = crossunder(close, upper)

strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=buyExitCondition and exitBySignal)
strategy.exit("ExitBuy", "Buy", stop = trailingStop, when=exitByTrailingStop )