Quantitative Handelsstrategie mit Multi-Timeframe-MACD-RSI-Crossover-Volatilitätsfilter

MACD RSI VWAP ATR SMA
Erstellungsdatum: 2025-06-09 15:50:55 zuletzt geändert: 2025-06-09 15:50:55
Kopie: 0 Klicks: 326
2
konzentrieren Sie sich auf
319
Anhänger

Quantitative Handelsstrategie mit Multi-Timeframe-MACD-RSI-Crossover-Volatilitätsfilter Quantitative Handelsstrategie mit Multi-Timeframe-MACD-RSI-Crossover-Volatilitätsfilter

Überblick

Die Strategie ist ein quantitatives Handelssystem, das auf der Analyse mehrerer Zeiträume basiert und hauptsächlich auf MACD-Indikatoren, RSI-Indikatoren, VWAP-Gehälter und ATR-Fluctuationsfilter basiert. Die Strategie unterstützt sowohl Über- als auch Überschneidungen durch Bestätigung von Signalen aus verschiedenen Zeiträumen durch die Überschneidung von technischen Indikatoren und kombiniert diese mit Fluktuationsbedingungen, um die Handelsqualität zu verbessern.

Strategieprinzip

Das Kernprinzip der Strategie besteht darin, minderwertige Signale durch mehrfach bedingte Bestätigung zu filtern, und besteht aus folgenden Schlüsselkomponenten:

  1. Mehrzeit-MACD-Kreuzsignale

    • Verwendung von MACD ((12,26,9) auf dem 30-Minuten-Chart zur Identifizierung von Haupteingangssignalen
    • Optionale Verwendung des 1-Stunden-MACD-Trends als Bestätigungsbedingung
  2. RSI überkauft und überkauft Filter

    • 30 Minuten, wenn der RSI > 55 ist
    • 30 Minuten Aufenthaltsdauer
    • Der 1-Stunden-RSI als zusätzliche Trendbestätigung
  3. Dual VWAP-Preisposition bestätigt

    • Mehrfache Anfrage Preise gleichzeitig über 30 Minuten und 1 Stunde VWAP
    • Der Preis für die Leerlaufforderung liegt gleichzeitig unter dem VWAP für 30 Minuten und 1 Stunde
  4. Schwankungsratefilter

    • Vergleichen Sie die ATR 14 auf dem 30-Minuten-Chart mit ihrer 20-Perioden-Mittellinie
    • Eintritt nur, wenn die aktuelle Schwankung größer oder gleich dem Mittelwert ist, um falsche Signale in einer niedrigen Schwankung zu vermeiden
  5. Mehrere Eingriffe

    • Fixed-Prozent-Stop-Losses (1,5%) und Stop-Losses (0,5%)
    • 30 Minuten MACD umgekehrt Kreuzung ausstieg
    • 1 Stunde MACD-Trend umgekehrt

Durch diese vielschichtige Filterung und Bestätigung der Bedingungen soll die Strategie kurzfristige, mittelfristige Schwankungen mit klaren Richtungen erfassen und gleichzeitig minderwertige Signale filtern und die Gewinn- und Verlustquote verbessern.

Analyse der Stärken

  1. Mehrfache ZeitrahmenbestätigungDurch die Kombination von 30 Minuten und 1 Stunde Zeitrahmen Signalen, kann die Strategie besser zu erkennen, die echten Trends und reduzieren die Auswirkungen von falschen Signalen. Besonders 1 Stunde MACD-Trend-Bestätigung Funktion, die dazu beitragen, zu vermeiden, dass die große Trend umgekehrt handeln.

  2. Anpassungsfähigkeit der SchwankungenDer ATR-Schwankungsfilter sorgt dafür, dass die Strategie nur dann eingeht, wenn die Märkte dynamisch genug sind, und vermeidet den Handel innerhalb der niedrigen Schwankungsbereiche, was das Risiko von Schwankungen in den Toten Zonen wirksam verringert.

  3. Flexible AusstiegsmechanismenDie Strategie beinhaltet nicht nur einen festen Stop-Loss, sondern auch einen dynamischen Ausstiegsmechanismus, der auf einer Kennzahlenumkehr basiert, was es ermöglicht, rechtzeitig zu treten und die Gewinne zu schützen, wenn der Preis noch nicht den Stop erreicht hat, aber der Markt sich umgekehrt hat.

  4. Doppelpreis-PositionsbestätigungDie Anforderung, dass die Preise gleichzeitig über den VWAP-Zeitrahmen liegen (<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  5. Eingebettetes RisikomanagementDie Strategie beinhaltet einen Stop-Loss-Mechanismus und eine Positionsverwaltung (default 5%-Beteiligung pro Transaktion), die dazu beiträgt, die Risikolockage pro Transaktion zu kontrollieren und das Kapital zu schützen.

Risikoanalyse

  1. Die Herausforderung der niedrigen GewinnrateWie in der Code-Anmerkung erwähnt, kann die Strategie mit einer niedrigen Gewinnrate konfrontiert sein. Dies liegt daran, dass die Mehrfachbedingung die Signalqualität verbessert, aber die Handelsfrequenz deutlich reduziert, was zu einer geringeren Stichprobenmenge und einer begrenzten statistischen Bedeutung führt.

  2. ParameterempfindlichkeitDie Strategie verwendet mehrere anpassbare Parameter, darunter MACD-Längen, RSI-Schwellenwerte, ATR-Filterparameter usw. Kleine Änderungen dieser Parameter können erhebliche Auswirkungen auf die Strategie-Performance haben und die Gefahr einer Überoptimierung besteht.

  3. Die Einschränkung des Fixprozentsatzes des Stop LossesDie gleiche Stop-and-Stop-Ratio von 1,5% und 0,5% für alle Marktumgebungen ist möglicherweise nicht für unterschiedliche Volatilitätsumgebungen geeignet. In hochvolatilen Märkten kann der Stop-Stop zu eng sein; in niedrigvolatilen Märkten kann der Stop-Stop zu weit sein.

  4. Mehrfache ZeitrahmenverzögerungDie Verwendung von Signalen mit einem längeren Zeitrahmen (z. B. 1 Stunde) als Bestätigung kann zu Verzögerungen führen, die zu verpassten Eintrittschancen oder verzögerten Ausstiegs führen.

  5. Mangelnde Anpassungsfähigkeit am MarktDie Strategie beinhaltet keine Mechanismen zur Unterscheidung zwischen verschiedenen Marktumgebungen (Trends/Schwankungen) und kann unter bestimmten Marktbedingungen nicht gut abschneiden.

Die Lösung:

  • Erwägen Sie die Einführung eines adaptiven Stop-Loss-Mechanismus, der sich dynamisch an den ATR oder anderen Volatilitätsindikatoren anpasst
  • Hinzufügen von Modulen zur Erkennung von Marktumständen, um Strategieparameter oder Handelslogik unter verschiedenen Bedingungen anzupassen
  • Stärkere Rückprüfungen und Vorlaufprüfungen zur Vermeidung von Überoptimierungen
  • Erwägen Sie die Hinzufügung von Handelsfilterbedingungen, wie z. B. Zeitfilter oder Trendstärkefilter, um die Signalqualität weiter zu verbessern

Optimierungsrichtung

  1. Optimierung der dynamischen Stop-LossDie Strategie kann so besser an unterschiedliche Marktschwankungen angepasst werden, indem sie in Zeiten hoher Volatilität lockere Stopps anbietet und in Zeiten niedriger Volatilität die Stoppziele verschärft.

  2. Klassifizierung der MarktumgebungDie Einführung eines Marktumfelderkennungsmechanismus, der Trend- und Schwingungsmärkte unterscheidet. Die ADX, die Brin-Bandbreite oder die Beziehung von Preisen zu langfristigen Moving Averages können verwendet werden, um den Marktzustand zu erkennen und die Strategieparameter entsprechend anzupassen oder sogar die Handelslogik vollständig zu ändern.

  3. Optimierung der EintrittszeitEintritt der aktuellen K-Linie, bei der eine MACD-Kreuzung der aktuellen Strategie auftritt, kann mit einem Auslaufpunkt oder einer Ausführungsverzögerung konfrontiert werden. Erwägen Sie, bei der nächsten K-Linie nach der Bestätigung der Kreuzung einzutreten, oder setzen Sie einen Begrenzungspreis für den Eintritt in einer bestimmten Preisgebiet, um einen besseren Ausführungspreis zu erhalten.

  4. ZeitfilterEs wird ein Filter für die Zeit des Handels eingefügt, um bestimmte unwirksame Handelszeiten zu vermeiden. Zum Beispiel kann es vermieden werden, zu Zeiten zu handeln, in denen die Liquidität niedrig oder unregelmäßig sein kann, wie zum Beispiel während der Endzeit der asiatischen Zeit oder der Übergangszeit zwischen Europa und den USA.

  5. Indikatorparameter passen sich anDie Parameter von MACD, RSI und ATR werden als Selbstveränderungswerte auf Basis der jüngsten Marktvolatilität oder einer periodischen automatischen Anpassung konzipiert. So können beispielsweise kürzere MACD-Parameter in hochvolatilen Märkten und längere in niedrigvolatilen Märkten verwendet werden.

  6. SignalstärkenEs gibt ein System zur Bewertung der Stärke von Eingangssignalen, bei dem die Signale auf der Grundlage mehrerer Faktoren (wie MACD-Säulengröße, RSI-Abweichung, VWAP-Distanz usw.) bewertet werden, wobei nur Geschäfte ausgeführt werden, deren Stärke einen bestimmten Schwellenwert überschreitet, oder die Größe der Positionen entsprechend der Dynamik der Signalstärke angepasst wird.

  7. Maschinelles Lernen verstärktDie Einführung von maschinellen Lernmodellen zur Vorhersage, welche Signale eher zu profitablen Transaktionen führen, und die Identifizierung der wertvollsten Kombinationen von Modellen auf der Grundlage von Modellen, die mit historischen Daten trainiert wurden. Dies kann die Anpassungsfähigkeit und die Gewinnrate der Strategie verbessern.

Diese Optimierungsrichtungen zielen darauf ab, die Stabilität, Anpassungsfähigkeit und langfristige Leistungsfähigkeit der Strategie zu verbessern, während ihre Kernlogik unverändert bleibt. Durch diese Verbesserungen können Strategien besser auf Veränderungen in verschiedenen Marktumgebungen und -bedingungen reagieren.

Zusammenfassen

Die Multi-Time-Framework MACD-RSI Cross-Volatility-Filter-Quantifizierungs-Trading-Strategie ist ein umfassendes Handelssystem, das durch die Kombination von mehreren technischen Indikatoren und Signalen aus mehreren Zeiträumen qualitativ hochwertige Handelsmöglichkeiten identifiziert. Die Kernvorteile der Strategie liegen in ihrer vielschichtigen Signalbestätigungsmechanik und den integrierten Risikomanagementfunktionen, die es ermöglichen, das Risiko zu kontrollieren, während die Preisschwankungen erfasst werden.

Trotz der Herausforderungen der niedrigen Gewinnrate hält die Strategie ihre positive Erwartungshöhe aufrecht, indem sie die Erträge aus durchschnittlich profitablen Geschäften erhöht. Die Strategieleistung wird durch die Umsetzung der empfohlenen Optimierungsmaßnahmen, insbesondere der dynamischen Stop-Loss-Maßnahmen, der Klassifizierung des Marktumfelds und der Gradation der Signalstärke, weiter verbessert werden.

Die Strategie eignet sich für mittel- und kurzfristige Händler, insbesondere für Händler, die eine systematisierte Handelsmethode auf der Grundlage technischer Analysen anstreben und Wert auf Risikomanagement legen. Die Mehrbedingte Bestätigungsmechanismen der Strategie reduzieren zwar die Häufigkeit der Geschäfte, erhöhen jedoch die Qualität jedes Handels, was mit der Handelsphilosophie “weniger ist mehr” übereinstimmt, die auf Qualität statt auf Quantität setzt.

In der Praxis wird empfohlen, die Strategie zuerst in einem simulierten Umfeld zu testen, insbesondere die Wirksamkeit von Optimierungsmaßnahmen, und sie dann vorsichtig auf den realen Handel anzuwenden. Gleichzeitig wird die ständige Überwachung der Veränderungen der Marktbedingungen und die Anpassung der Strategieparameter zur richtigen Zeit dazu beitragen, eine langfristige stabile Leistung zu erhalten.

Strategiequellcode
/*backtest
start: 2025-01-01 00:00:00
end: 2025-06-08 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GentlemanOfTrading

//@version=6
strategy(title = "ETH Day Trader", overlay = true, margin_long = 100, margin_short  = 100, default_qty_type  = strategy.percent_of_equity, default_qty_value = 5)

// ==== 1) USER INPUTS ====
// MACD/RSI lengths
fastLen   = input.int(12,   title="MACD Fast EMA Length", minval=1)
slowLen   = input.int(26,   title="MACD Slow EMA Length", minval=1)
signalLen = input.int(9,    title="MACD Signal EMA Length", minval=1)
rsiLen    = input.int(14,   title="RSI Length", minval=1)

// RSI thresholds
rsiThreshLong30 = input.int(55, title="RSI30m > (Long)", minval=1, maxval=100)
rsiThreshShort30= input.int(45, title="RSI30m < (Short)", minval=1, maxval=100)
rsiThresh1h     = input.int(50, title="RSI1h Threshold", minval=1, maxval=100)

// ATR filter (30m)
atrLen     = input.int(14, title="ATR Length (30m)", minval=1)
atrMaLen   = input.int(20, title="ATR MA Length (30m)", minval=1)

// Take Profit / Stop Loss (percent)
tpPerc      = input.float(1.5,  title="Take Profit (%)", minval=0.1) / 100
slPerc      = input.float(0.5,  title="Stop Loss (%)",   minval=0.1) / 100

// Toggle whether to use 1h trend confirmation
use1hTrend  = input.bool(true, title="Use 1h MACD Trend Confirmation?")

// ==== 2) FETCH INDICATORS ON 30m ====
// We assume this script is applied on a chart ≤ 30m (e.g. 15m or 5m), 
// but if you apply it on a 30m chart it still works: security() with "30" just returns the same bar.

[macd30m, macdSig30m, _] = ta.macd(close, fastLen, slowLen, signalLen)
rsi30m                  = ta.rsi(close, rsiLen)
atr30m                  = ta.atr(atrLen)

// ==== 3) FETCH INDICATORS ON 1h & VWAPs via request.security() ====
// --- 1h MACD & RSI ---
[macd1h, macdSig1h, _] = request.security(syminfo.tickerid, "60", ta.macd(close, fastLen, slowLen, signalLen), lookahead=barmerge.lookahead_off)
rsi1h = request.security(syminfo.tickerid, "60", ta.rsi(close, rsiLen), lookahead=barmerge.lookahead_off)

// --- 30m VWAP & 1h VWAP (session VWAP) ---
vwap30m = request.security(syminfo.tickerid, "30", ta.vwap(close), lookahead=barmerge.lookahead_off)
vwap1h  = request.security(syminfo.tickerid, "60", ta.vwap(close), lookahead=barmerge.lookahead_off)

// ==== 4) BUILD VOLATILITY FILTER (30m ATR vs ATR MA) ====
atr30m_ma = ta.sma(atr30m, atrMaLen)
volatilityOK = atr30m >= atr30m_ma

// ==== 5) MULTI-TIMEFRAME CROSS CONDITIONS ====
// 30m MACD cross signals
longCross30m  = ta.crossover(macd30m, macdSig30m)
shortCross30m = ta.crossunder(macd30m, macdSig30m)

// 1h MACD trend confirmation
macdTrendUp1h   = macd1h > macdSig1h
macdTrendDown1h = macd1h < macdSig1h

// ==== 6) ENTRY & EXIT CONDITIONS ====
// LONG ENTRY: 
//   • 30m MACD crossover 
//   • 30m RSI > rsiThreshLong30 
//   • (optionally) 1h MACD line > 1h MACD signal 
//   • Price > 30m VWAP AND Price > 1h VWAP 
//   • 30m ATR ≥ 30m ATR MA (volatility filter)
longEntryCond = 
     longCross30m 
  and (rsi30m > rsiThreshLong30) 
  and (close > vwap30m) 
  and (close > vwap1h) 
  and volatilityOK 
  and (use1hTrend ? macdTrendUp1h : true)

// LONG EXIT: 
//   • fixed TP/SL 
//   OR • 30m MACD crossunder 
//   OR • 1h MACD falls below signal (trend flipped)
var float entryPriceLong = na
longExitCond = false

if (strategy.position_size > 0)
    // Price-based TP / SL checks
    entryPriceLong := nz(entryPriceLong[1], strategy.position_avg_price)
    longTPprice = entryPriceLong * (1 + tpPerc)
    longSLprice = entryPriceLong * (1 - slPerc)
    
    // check TP/SL first
    longExitTP = high >= longTPprice
    longExitSL = low  <= longSLprice
    
    // fallback: MACD crossunder on 30m OR 1h trend flips
    macdTrendFlip1h = macdTrendUp1h and (macd1h < macdSig1h)
    macdCross30m    = shortCross30m
    
    longExitCond := longExitTP or longExitSL or macdCross30m or macdTrendFlip1h
else
    entryPriceLong := na  // reset when no position

// SHORT ENTRY: 
//   • 30m MACD crossunder 
//   • 30m RSI < rsiThreshShort30 
//   • (optionally) 1h MACD line < 1h MACD signal 
//   • Price < 30m VWAP AND Price < 1h VWAP 
//   • 30m ATR ≥ 30m ATR MA (volatility filter)
shortEntryCond = 
     shortCross30m 
  and (rsi30m < rsiThreshShort30) 
  and (close < vwap30m) 
  and (close < vwap1h) 
  and volatilityOK 
  and (use1hTrend ? macdTrendDown1h : true)

// SHORT EXIT: 
//   • fixed TP/SL 
//   OR • 30m MACD crossover 
//   OR • 1h MACD flips up
var float entryPriceShort = na
shortExitCond = false

if (strategy.position_size < 0)
    entryPriceShort := nz(entryPriceShort[1], strategy.position_avg_price)
    shortTPprice = entryPriceShort * (1 - tpPerc)
    shortSLprice = entryPriceShort * (1 + slPerc)
    
    // check TP/SL first
    shortExitTP = low <= shortTPprice
    shortExitSL = high >= shortSLprice
    
    macdTrendFlipUp1h = macdTrendDown1h and (macd1h > macdSig1h)
    macdCrossUp30m    = longCross30m
    
    shortExitCond := shortExitTP or shortExitSL or macdCrossUp30m or macdTrendFlipUp1h
else
    entryPriceShort := na  // reset when no position

// ==== 7) EXECUTE STRATEGY ORDERS WITH LABELS & ALERTS ====
// — Long Entry —
if (longEntryCond and strategy.position_size == 0)
    strategy.entry("Long", strategy.long)
    label.new(bar_index, low, text="Buy (LT)", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, yloc=yloc.belowbar)
    alert("Buy (LT)", alert.freq_once_per_bar_close)

// — Long Exit —
if (strategy.position_size > 0 and longExitCond)
    strategy.close("Long")
    label.new(bar_index, high, text="Sell (LT)", style=label.style_label_down, color=color.new(color.red, 0), textcolor=color.white, yloc=yloc.abovebar)
    alert("Sell (LT)", alert.freq_once_per_bar_close)

// — Short Entry —
if (shortEntryCond and strategy.position_size == 0)
    strategy.entry("Short", strategy.short)
    label.new(bar_index, high, text="Sell (ST)", style=label.style_label_down, color=color.new(color.red, 0), textcolor=color.white, yloc=yloc.abovebar)
    alert("Sell (ST)", alert.freq_once_per_bar_close)

// — Short Exit —
if (strategy.position_size < 0 and shortExitCond)
    strategy.close("Short")
    label.new(bar_index, low, text="Buy (ST)", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, yloc=yloc.belowbar)
    alert("Buy (ST)", alert.freq_once_per_bar_close)


// ==== 8) OPTIONAL PLOTTING (for debugging) ====
// We’ve removed any `transp`/`opacity` arguments. Instead, we use `color.new(baseColor, α)` 
// for transparency, where α = 0 is fully opaque and α = 255 is fully transparent.

// 30m VWAP
plot(vwap30m, title = "VWAP 30m", color = color.new(color.teal, 80)) // ~31% transparentlinewidth= 1

// 1h VWAP
plot(vwap1h,  title = "VWAP 1h",  color = color.new(color.fuchsia, 80), linewidth= 1) // ~31% transparent

// 30m ATR vs ATR_MA
plot(atr30m, title = "ATR 30m", color = color.new(color.orange, 80))
plot(atr30m_ma, title = "ATR30m MA", color = color.new(color.yellow, 80))

// 30m MACD Histogram (bars)
plot(macd30m - macdSig30m, title = "MACD Histogram (30m)", style = plot.style_columns, color = (macd30m - macdSig30m >= 0 ? color.new(color.green, 80) : color.new(color.red, 80)))

// 1h MACD Histogram (area)
h1 = request.security(syminfo.tickerid, "60", macd1h - macdSig1h, lookahead=barmerge.lookahead_off)
plot(1, title = "MACD Hist (1h)", style = plot.style_area, color = (h1 >= 0 ? color.new(color.green, 80) : color.new(color.red, 80)))