Eine auf gleitenden Durchschnitten basierende mehrjährige Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-12-26 10:13:34
Tags:

img

Übersicht

Diese Strategie kombiniert drei Indikatoren - gleitende Durchschnitte, Bollinger Bands und den Relative Strength Index (RSI) für den Multi-Perioden-Aktienhandel. Sie berücksichtigt Crossovers von schnellen und langsamen gleitenden Durchschnitten, RSI unter 50 und Schlusskurs unter BB Mittelfeld beim Kauf. Sie betrachtet RSI über 70 und Schlusskurs über BB Oberfeld beim Verkauf.

Strategie Logik

Die Strategie nutzt hauptsächlich drei Indikatoren für die Entscheidungsfindung. Erstens besteht der MACD-Indikator aus schnellen und langsamen gleitenden Durchschnitten. Crossovers der schnellen Linie über der langsamen Linie erzeugen Kaufsignale. Zweitens bilden die Bollinger-Bänder mit mittleren, oberen und unteren Bands. Preise in der Nähe des unteren Bandes bieten Kaufmöglichkeiten bei Schwingentiefen, während Preise in der Nähe des oberen Bandes Verkaufsmöglichkeiten bei Schwingenhöhen bieten. Schließlich spiegelt der RSI die Geschwindigkeit und Veränderungsrate der Preisbewegung wider und identifiziert potenzielle Schwingenhohe und Schwingentiefen.

Insbesondere erfordert die Strategie zunächst den schnellen gleitenden Durchschnitt über den langsamen gleitenden Durchschnitt, was auf eine Stärkung des Aufwärtstrends hindeutet, der einen Kauf vorschlägt. Es erfordert auch einen RSI unter 50, was zeigt, dass der Preis möglicherweise in Überverkaufsniveaus liegt und Kaufmöglichkeiten bietet. Darüber hinaus erfordert es den Schlusskurs unterhalb des BB-Mittebands, was auf den niedrigen Preisschwung und einen guten Einstiegspunkt hinweist.

Für Profit-Taking und Stop-Loss, wenn der RSI über 70 steigt, deutet er darauf hin, dass der Preis möglicherweise in Überkaufniveaus liegt und die Aufwärtstrenddynamik abnimmt, die für den Profit-Taking geeignet ist.

Vorteile

Die Strategie kombiniert die Stärken von gleitenden Durchschnitten, Bollinger Bands und RSI, um die Einstiegs- und Ausstiegspunkte genauer zu bestimmen.

  1. Bewegliche Durchschnitte bestimmen die Aufwärtstrenddynamik der Preise. Die BB-Mittelbänder bestimmen die Schwingen-Tiefpunkte für den Einstieg. Der RSI vermeidet den Kauf bei Preisspitzen. Die drei zusammen bieten während der Preistrends relativ ideale Kaufmöglichkeiten.

  2. Die Kombination von RSI und BB-Oberband erfasst Preisschwankungshöhe gut für die Gewinnnahme, um Überkaufbedingungen zu vermeiden.

  3. Mehrjährige Bewertungen ermöglichen es, Handelschancen über Zeiträume hinweg zu erfassen, um Gewinne zu maximieren.

  4. Die logischen Handelsregeln machen die Strategie für mittelfristige bis langfristige Anlagen leicht verständlich.

Risiken

Trotz der Kombination von Indikatoren zur Verbesserung der Entscheidungsgenauigkeit bestehen wesentliche Risiken:

  1. Die Parameter für die Indikatoren müssen empirisch angepasst werden, eine unzureichende Anpassung beeinträchtigt die Strategie.

  2. In Bärenmärkten kann die Geschwindigkeit des Kursfalls Stop-Losses unwirksam machen.

  3. Die einzelnen Aktienrisiken bestehen trotz des Portfolios.

  4. Potenziell übermäßige Handelsfrequenz: Eine optimale Parameter-Einstellung kann zu häufigen Geschäften führen, die zu höheren Transaktionskosten und Steuern führen.

Lösungen:

  1. Anpassung der Parameter anhand von Rückversuchen, um eine geeignete Signalfrequenz zu erreichen.

  2. Schalten Sie gleitende Durchschnittsperioden auf moderate Eintrittsfrequenz ein und minimieren Sie Verluste.

  3. Diversifizierung der Anlagen in mehr Vermögenswerten, um Risiken für einzelne Aktien zu minimieren.

  4. Die Kriterien für den Kauf und die Gewinngewinnung sollten gemäßigt gelockert werden, um die Handelsfrequenz zu reduzieren.

Möglichkeiten zur Verbesserung

Es gibt noch weitere Optimierungsmöglichkeiten:

  1. Fügen Sie mehr Filter wie Volumen hinzu, um ein erhöhtes Volumen bei Käufen zu gewährleisten und die Entscheidungsgenauigkeit zu verbessern.

  2. Einbeziehung von Positionsgrößenmodulen in die dynamische Größenordnung von Positionen basierend auf den Marktbedingungen.

  3. Verwenden Sie Deep-Learning-Algorithmen, um Parameter automatisch durch Training über große Datensätze hinweg einzustellen.

  4. Einführung mehrer Zeitrahmen für Urteile, um die Anwendbarkeit zu erweitern.

Schlussfolgerung

Insgesamt verfügt die Strategie über eine klare, leicht verständliche Logik und synergisierende Indikatoren, um falsche Signale zu reduzieren. Weitere Parameter-Tuning und Hinzufügen von Indikatoren können die Robustheit und Entscheidungsgenauigkeit weiter verbessern. Sie eignet sich für mittelfristige bis langfristige Investitionen und quantitativen Handel. Dennoch beseitigt keine Strategie die Marktrisiken vollständig. Eine angemessene Positionsgröße und Stop-Loss-Level sind immer erforderlich.


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

//
//@author Alorse
//@version=4
strategy("MACD + BB + RSI [Alorse]", shorttitle="BB + MACD + RSI [Alorse]", overlay=true, pyramiding=0, currency=currency.USD, default_qty_type=strategy.percent_of_equity, initial_capital=1000, default_qty_value=20, commission_type=strategy.commission.percent, commission_value=0.01) 

txtVer = "1.0.1"
version = input(title="Version", type=input.string, defval=txtVer, options=[txtVer], tooltip="This is informational only, nothing will change.")
src = input(title="Source", type=input.source, defval=close)

// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=12, group="MACD")
slow_length = input(title="Slow Length", type=input.integer, defval=26, group="MACD")
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9, group="MACD")
sma_source = input(title="Oscillator MA Type", type=input.string, defval="EMA", options=["SMA", "EMA"], group="MACD")
sma_signal = input(title="Signal Line MA Type", type=input.string, defval="EMA", options=["SMA", "EMA"], group="MACD")
fast_ma = sma_source == "SMA" ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source == "SMA" ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? sma(macd, signal_length) : ema(macd, signal_length)

// Bollinger Bands
bbGroup = "Bollindger Bands"
length = input(20, title="Length", group=bbGroup)
mult = input(2.0, title="StdDev", minval=0.001, maxval=5, group=bbGroup)

basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev

// RSI
rsiGroup = "RSI"
lenRSI = input(14, title="Length", minval=1, group=rsiGroup)
// lessThan = input(50, title="Less than", minval=1 , maxval=100, group=rsiGroup)
RSI = rsi(src, lenRSI)

// Strategy Conditions
buy = crossover(macd, signal) and RSI < 50 and close < basis
sell = RSI > 70 and close > upper


// Stop Loss
slGroup = "Stop Loss"
useSL = input(false, title="╔══════   Enable   ══════╗", group=slGroup, tooltip="If you are using this strategy for Scalping or Futures market, we do not recommend using Stop Loss.")
SLbased = input(title="Based on", type=input.string, defval="Percent", options=["ATR", "Percent"], group=slGroup, tooltip="ATR: Average True Range\nPercent: eg. 5%.")
multiATR = input(10.0, title="ATR   Mult", type=input.float, group=slGroup, inline="atr")
lengthATR = input(14, title="Length", type=input.integer, group=slGroup, inline="atr")
SLPercent = input(10, title="Percent", type=input.float, group=slGroup) * 0.01

longStop = 0.0
shortStop = 0.0

if SLbased == "ATR"
    longStop := valuewhen(buy, low, 0) - (valuewhen(buy, rma(tr(true), lengthATR), 0) * multiATR)
    longStopPrev = nz(longStop[1], longStop)
    longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

    shortStop := (valuewhen(sell, rma(tr(true), lengthATR), 0) * multiATR) + valuewhen(sell, high, 0)
    shortStopPrev = nz(shortStop[1], shortStop)
    shortStop := close[1] > shortStopPrev ? max(shortStop, shortStopPrev) : shortStop
if SLbased == "Percent"
    longStop  := strategy.position_avg_price * (1 - SLPercent)
    shortStop := strategy.position_avg_price * (1 + SLPercent)

strategy.entry("Long", true, when=buy)
strategy.close("Long", when=sell, comment="Exit")

if useSL
    strategy.exit("Stop Loss", "Long", stop=longStop)


Mehr