Die Ressourcen sind geladen. Beförderung...

Bei der Bewertung der Risikopositionen werden die Risikopositionen gemäß Artikel 42 Absatz 1 Buchstabe b der CRR berücksichtigt.

Schriftsteller:ChaoZhang, Datum: 2023-11-24 15:32:57
Tags:

img

Übersicht

Die doppelte gleitende Durchschnitts-Matching-Strategie basierend auf Bollinger Bands ist eine Trend-folgende Strategie, die mit Preis und Volumen auf dem Markt abläuft.

Strategieprinzip

Diese Strategie basiert hauptsächlich auf den Crossover-Signalen des Bollinger Bands-Indikators und dem gleitenden Durchschnittsindikator für den Handel. Insbesondere verwendet sie die mittlere Schiene, die obere Schiene der Bollinger Bands und 7 gleitende Durchschnitte mit Längen von 5 bis 200 Tagen gleichzeitig. Sie erzeugt ein Kaufsignal, wenn der Preis von unten nach oben durch die mittleren und unteren Schienen der Bollinger Bands bricht; sie erzeugt ein Verkaufssignal, wenn der Preis von oben nach unten durch die obere Schiene der Bollinger Bands bricht, um den folgenden Trend zu erreichen.

Darüber hinaus führt die Strategie auch den MoveToFract-Indikator zur Beurteilung von Long- und Short-Positionen ein. Dieser Indikator bestimmt, ob der aktuelle Markttrend nach oben oder unten ist, indem er die Reihenfolge der Anordnung von kurzfristigen und langfristigen gleitenden Durchschnitten berechnet und so vermeidet, dass falsche Signale in Bereichsmärkten generiert werden. Schließlich bildet er in Kombination mit konfigurierbaren Stop-Profit- und Stop-Loss-Regeln einen vollständigeren Trend nach der Handelsstrategie.

Analyse der Vorteile

  1. Flexible Konfiguration, mit der die Parameterkombinationen an unterschiedliche Marktumgebungen angepasst werden können
  2. Die Kombination von zwei verschiedenen Indikatoren als Filter kann fehlerhafte Signale reduzieren
  3. Der Trendbeurteilungsindikator kann umgekehrte Operationen auf volatilen Märkten vermeiden
  4. Die Stop-Loss-Einstellung maximiert die Gewinne

Risikoanalyse

  1. Die Parameter sollten angemessen an Zyklen unterschiedlicher Zeitrahmen angepasst werden, um zu hohen Handelszahlen zu vermeiden.
  2. Der Stop-Loss-Tracking kann die Verluste in einem schnellen Rückgang ausweiten
  3. - ausreichende Mittel zu sichern, ansonsten nicht in der Lage zu sein, dem Risiko kontinuierlicher Verluste standzuhalten;

Optimierungsrichtlinien

  1. Hinzufügen goldene Kreuz und Todeskreuz Urteile weiter zu optimieren
  2. Verschiedene Sorten haben unterschiedliche Parameter, berücksichtigen Sie maschinelles Lernen für optimale Parameter
  3. Kombination mit dem Volatilitätsindex zur Bestimmung der Trendvolatilität und zur Stärkung der Risikokontrolle

Schlussfolgerung

Im Allgemeinen ist dies eine sehr praktische Trendfolgestrategie. Es verwendet Indikator-Crossover für die Entscheidungsfindung und enthält auch ein Trendbeurteilungsmodul, um falsche Signale effektiv auszufiltern. Nach der Konfiguration von Stop-Profit und Stop-Loss kann es Trends für den Handel vollständig folgen und gute Renditen erzielen. Durch Anpassung von Parameterkombinationen und Hinzufügen von mehr Filtern kann diese Strategie weiter optimiert werden, um sich an mehr Marktumgebungen anzupassen, und hat großen Raum für Verbesserungen und Anwendungsperspektiven.


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




Mehr