Strategie für die Kombination dynamischer gleitender Durchschnittswerte

Schriftsteller:ChaoZhang, Datum: 2024-02-05 10:23:10
Tags:

img

Übersicht

Die Dynamic Moving Average Crossover Combo Strategy ist eine kombinierte Handelsstrategie, die mehrere technische Indikatoren und Marktsituationserkennung integriert. Sie berechnet dynamisch die Marktvolatilität und bestimmt drei Marktphasen basierend auf der Preisdistanz zum langfristigen gleitenden Durchschnitt und der Volatilität: Volatilität, Trend und Konsolidierung. Unter verschiedenen Marktbedingungen setzt die Strategie unterschiedliche Ein- und Ausstiegsregeln ein und erzeugt Kauf- und Verkaufssignale mit einer Kombination von Indikatoren wie EMA/SMA Crossover, MACD und Bollinger Bands.

Strategie Logik

Berechnung der Marktvolatilität

Verwenden Sie den ATR-Indikator, um die Marktvolatilität der letzten 14 Tage zu messen, und wenden Sie dann einen 100-Tage-SMA-Filter an, um die durchschnittliche Volatilität zu erhalten.

Bestimmung der Marktphasen

Berechnen Sie die Distanz zwischen Preis und 200-Tage-SMA. Wenn die absolute Distanz 1,5 Mal der durchschnittlichen Volatilität mit einer klaren Richtung übersteigt, wird sie als Trendmarkt bestimmt. Wenn die aktuelle Volatilität 1,5 Mal des Durchschnitts übersteigt, ist es ein volatiler Markt.

EMA/SMA-Übergang

Eine schnelle EMA beträgt 10 Tage, eine langsame SMA beträgt 30 Tage.

MACD

Berechnen des MACD mit 12, 26, 9 Parametern. Ein positives MACD-Histogramm gibt ein Kaufsignal.

Bollinger-Bänder

Berechnen Sie den 20-tägigen Standardabweichungskanal. Wenn die Kanalbreite kleiner als die 20-tägige SMA selbst ist, konsolidiert sie.

Eintrittsregeln

Volatile: Geben Sie bei einem Crossover oder MACD-Positiv mit einem Preis innerhalb von Bands Long ein.

Trending: Geben Sie Long ein, wenn Crossover oder MACD positiv ist.

Konsolidierung: Bei Crossover und Preis über dem unteren Band wird Long eingegeben.

Ausgangsregeln

Allgemein: Ausgang, wenn der MACD 2 Tage lang negativ ist und der Preis 2 Tage sinkt.

Volatile: Plus Ausgang, wenn der StockRSI überkauft wurde.

Konsolidierung: Plus Exit, wenn der Preis unterhalb der oberen Bandbreite liegt.

Vorteile

Die Strategie weist folgende Stärken auf:

  1. Systematische Operationen mit weniger subjektiven Eingriffen.

  2. Anpassungsparameter, angepasst an die Marktbedingungen.

  3. Höhere Signalgenauigkeit mit mehreren Indikatoren.

  4. Niedrigeres Risiko bei Bollinger Bands Auto Stop Loss.

  5. Alle abgerundeten Zustandfilter, um falsche Signale zu vermeiden.

  6. Dynamische Stop-Loss- und Gewinnspielen, um Trends zu folgen.

Risiken

Die wichtigsten Risiken sind:

  1. Strategie ist ungültig, wenn die Parameter nicht richtig eingestellt sind.

  2. Modellversagen aufgrund plötzlicher Ereignisse.

  3. Eine komprimierte Gewinnspanne aus den Handelskosten.

  4. Höhere Komplexität mit mehreren Modulen.

Erweiterung

Potenzielle Optimierungsrichtungen:

  1. Verbesserung der Kriterien für die Beurteilung des Marktumfelds.

  2. Einführung von maschinellem Lernen zur automatischen Anpassung von Parametern.

  3. Hinzufügen von Textanalysen zur Erkennung von Ereignissen.

  4. Multi-Markt-Backtesting, um die besten Parameter zu finden.

  5. Implementieren Sie die Strategie des Trailing Stop für einen besseren Gewinn.

Schlussfolgerung

Die Dynamic Moving Average Crossover Combo Strategie ist ein intelligentes quantitatives Handelssystem mit mehreren Indikatoren. Es passt die Parameter dynamisch an die Marktbedingungen an, um einen systematischen regelbasierten Handel umzusetzen. Die Strategie ist sehr anpassungsfähig und deterministisch.


/*backtest
start: 2024-01-28 00:00:00
end: 2024-02-04 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Improved Custom Strategy", shorttitle="ICS", overlay=true)

// Volatility
volatility = ta.atr(14)
avg_volatility_sma = ta.sma(volatility, 100)
avg_volatility = na(avg_volatility_sma) ? 0 : avg_volatility_sma

// Market Phase detection
long_term_ma = ta.sma(close, 200)
distance_from_long_term_ma = close - long_term_ma
var bool isTrending = math.abs(distance_from_long_term_ma) > 1.5 * avg_volatility and not na(distance_from_long_term_ma)
var bool isVolatile = volatility > 1.5 * avg_volatility

// EMA/MA Crossover
fast_length = 10
slow_length = 30
fast_ma = ta.ema(close, fast_length)
slow_ma = ta.sma(close, slow_length)
crossover_signal = ta.crossover(fast_ma, slow_ma)

// MACD
[macdLine, signalLine, macdHistogram] = ta.macd(close, 12, 26, 9)
macd_signal = crossover_signal or (macdHistogram > 0)

// Bollinger Bands
source = close
basis = ta.sma(source, 20)
upper = basis + 2 * ta.stdev(source, 20)
lower = basis - 2 * ta.stdev(source, 20)
isConsolidating = (upper - lower) < ta.sma(upper - lower, 20)

// StockRSI
length = 14
K = 100 * (close - ta.lowest(close, length)) / (ta.highest(close, length) - ta.lowest(close, length))
D = ta.sma(K, 3)
overbought = 75
oversold = 25

var float potential_SL = na
var float potential_TP = na
var bool buy_condition = na
var bool sell_condition = na

// Buy and Sell Control Variables
var bool hasBought = false
var bool hasSold = true

// Previous values tracking
prev_macdHistogram = macdHistogram[1]
prev_close = close[1]

// Modify sell_condition with the new criteria
if isVolatile
    buy_condition := not hasBought and crossover_signal or macd_signal and (close > lower) and (close < upper)
    sell_condition := hasBought and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2])
    potential_SL := close - 0.5 * volatility
    potential_TP := close + volatility

if isTrending
    buy_condition := not hasBought and crossover_signal or macd_signal
    sell_condition := hasBought and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2])
    potential_SL := close - volatility
    potential_TP := close + 2 * volatility

if isConsolidating
    buy_condition := not hasBought and crossover_signal and (close > lower)
    sell_condition := hasBought and (close < upper) and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2])
    potential_SL := close - 0.5 * volatility
    potential_TP := close + volatility

// Update the hasBought and hasSold flags
if buy_condition
    hasBought := true
    hasSold := false

if sell_condition
    hasBought := false
    hasSold := true

// Strategy Entry and Exit
if buy_condition
    strategy.entry("BUY", strategy.long, stop=potential_SL, limit=potential_TP)
    strategy.exit("SELL_TS", from_entry="BUY", trail_price=close, trail_offset=close * 0.05)

if sell_condition
    strategy.close("BUY")
    
// Visualization
plotshape(series=buy_condition, style=shape.labelup, location=location.belowbar, color=color.green, text="BUY", size=size.small)
plotshape(series=sell_condition, style=shape.labeldown, location=location.abovebar, color=color.red, text="SELL", size=size.small)

plot(long_term_ma, color=color.gray, title="200-Day MA", linewidth=1)
plot(potential_SL, title="SL Level", color=color.red, linewidth=1, style=plot.style_linebr)
plot(potential_TP, title="TP Level", color=color.green, linewidth=1, style=plot.style_linebr)

bgcolor(isVolatile ? color.new(color.purple, 90) : isTrending ? color.new(color.blue, 90) : isConsolidating ? color.new(color.orange, 90) : na)


Mehr