Dynamische Trendverfolgung und Volatilitätsfilterstrategie: Moving Average Crossover-System basierend auf doppelter Bestätigung von ADX und CI

ADX CI SMA DM TR ATR DI
Erstellungsdatum: 2025-02-21 09:33:38 zuletzt geändert: 2025-02-21 09:33:38
Kopie: 0 Klicks: 406
2
konzentrieren Sie sich auf
319
Anhänger

Dynamische Trendverfolgung und Volatilitätsfilterstrategie: Moving Average Crossover-System basierend auf doppelter Bestätigung von ADX und CI Dynamische Trendverfolgung und Volatilitätsfilterstrategie: Moving Average Crossover-System basierend auf doppelter Bestätigung von ADX und CI

Überblick

Die Strategie ist ein Handelssystem, das ein Gleichgewichts-Kreuzsignal mit einem Filter für die Marktsituation kombiniert. Sie erfasst Markttrends durch die Kreuzung eines 9-Zyklus- und eines 21-Zyklus-Simplen Moving Averages (SMA) und filtert die Marktumgebung mit dem Average Direction Index (ADX) und dem Chaos Index (Choppiness Index, CI), um sicherzustellen, dass nur in Trends zu handeln ist, die eindeutig und stark von Schwankungen geprägt sind. Diese Methode kombiniert effektiv traditionelle Trend-Tracking-Strategien mit modernen technischen Indikatoren und bietet einen stabileren Handelsrahmen.

Strategieprinzip

Die Kernlogik der Strategie besteht aus drei wichtigen Komponenten:

  1. Trendsignalgenerierung: Die Kreuzung von 9- und 21-Zyklus-SMA wird verwendet, um die Richtung des Trends zu bestimmen und ein grundlegendes Handelssignal zu bilden.
  2. Trendstärke-Bestätigung: Die Stärke des Trends wird anhand des ADX-Indikators (mit einer Schwelle von 20) verifiziert, um sicherzustellen, dass der Handel nur in einem klaren Marktumfeld stattfindet.
  3. Marktfluktuationsfilter: Einführung des Chaos-Index (mit einem Schwellenwert von 50), um die Schwankungen des Marktes zu erkennen und zu vermeiden, in stark bewegten Märkten zu handeln.

Die Strategie verwendet optimierte Methoden zur Berechnung von technischen Kennzahlen, einschließlich einer benutzerdefinierten Summationsfunktion, der Berechnung von Höchst- und Mindestwerten sowie der standardisierten Berechnung der realen Breite ((TR), um die Genauigkeit und Rechenleistung des Signals zu gewährleisten.

Strategische Vorteile

  1. Mehrere Bestätigungsmechanismen: Die Zuverlässigkeit des Handelssignals wird durch die Kombination von Gleichschleife-Kreuzung, ADX und CI Dreifachfilterung deutlich erhöht.
  2. Anpassungsfähigkeit: Strategieparameter können an unterschiedliche Marktbedingungen angepasst werden und haben eine gute Anpassungsfähigkeit.
  3. Gute Risikokontrolle: Das Risiko von False Breaks wird durch die Filterung des CI-Index während hoher Schwankungen wirksam reduziert.
  4. Hohe Rechenleistung: Die Verwendung von optimierten Rechenmethoden, insbesondere bei der Verarbeitung historischer Daten.

Strategisches Risiko

  1. Parameter-Sensitivität: Die Strategiewirkung hängt stark von den Threshold-Einstellungen für ADX und CI ab, wobei unterschiedliche Parameterkonfigurationen in verschiedenen Marktumgebungen erforderlich sein können.
  2. Verzögerung: Da mehrere Moving Average-Indikatoren verwendet werden, kann es zu Signalverzögerungen kommen.
  3. Der Markt ist in einem Zustand von Schwankungen: In einem schwankenden Markt kann es sein, dass man einige Short-Line-Geschäftsmöglichkeiten verpasst.
  4. Komplexität der Berechnung: Die Berechnung von mehreren Kennzahlen erhöht die Komplexität der Strategie und kann die Effizienz der Realzeit-Transaktionsdurchführung beeinträchtigen.

Richtung der Strategieoptimierung

  1. Dynamische Parameter-Anpassung: Einführung eines Anpassungsparameter-Anpassungsmechanismus, um die ADX- und CI-Termine entsprechend der dynamischen Marktlage anzupassen.
  2. Stop-Loss-Optimierung: Erhöhung der dynamischen Stop-Loss-Mechanismen, um eine flexiblere Stop-Loss-Strategie basierend auf ATR oder Volatility Bands zu entwickeln.
  3. Erweiterte Signalbestätigung: Ein zusätzlicher Mechanismus zur Bestätigung der Übergabe kann in Betracht gezogen werden, um die Signalzuverlässigkeit weiter zu verbessern.
  4. Erhöhung der Recheneffizienz: Optimierung der Methode zur Berechnung von Kennzahlen, insbesondere der Leistung bei der Verarbeitung von Langzeitdaten.

Zusammenfassen

Die Strategie baut ein vollständiges Handelssystem auf, indem sie die klassische Gleichlinien-Kreuzung mit modernen technischen Indikatoren kombiniert. Sie konzentriert sich nicht nur auf die Erfassung von Trends, sondern auch auf die Eignung für die Marktumgebung. Sie erhöht die Stabilität des Handels durch mehrere Filtermechanismen.

Strategiequellcode
/*backtest
start: 2024-02-22 00:00:00
end: 2024-12-06 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("MA9/MA21 Cross with ADX & CHOP Filter", overlay=true, initial_capital=10000, currency=currency.USD)

// ─── CUSTOM FUNCTIONS ──────────────────────────────────────────────────────
// Custom function to compute the sum over the last 'len' bars.
f_sum(src, len) =>
    s = 0.0
    for i = 0 to len - 1
        s += src[i]
    s

// Custom function to compute the highest value over the last 'len' bars.
f_highest(src, len) =>
    h = src[0]
    for i = 1 to len - 1
        h := math.max(h, src[i])
    h

// Custom function to compute the lowest value over the last 'len' bars.
f_lowest(src, len) =>
    l = src[0]
    for i = 1 to len - 1
        l := math.min(l, src[i])
    l

// ─── INPUTS ──────────────────────────────────────────────────────────────
ma9Period   = input.int(9, title="MA 9 Period", minval=1)
ma21Period  = input.int(21, title="MA 21 Period", minval=1)
adxLength   = input.int(7, title="ADX Smoothing / DI Length", minval=1)
adxThresh   = input.float(20.0, title="ADX Threshold", step=0.1)
chopLen     = input.int(7, title="CHOP Length", minval=1)
chopOff     = input.int(0, title="CHOP Offset", minval=0)  // Not applied in calculation
chopThresh  = input.float(50.0, title="CHOP Maximum (do not trade if above)", step=0.1)

// ─── CALCULATE INDICATORS ────────────────────────────────────────────────────
// Moving Averages
ma9  = ta.sma(close, ma9Period)
ma21 = ta.sma(close, ma21Period)

// --- True Range Calculation ---
// Manual implementation of true range (tr)
tr = math.max(math.max(high - low, math.abs(high - nz(close[1]))), math.abs(low - nz(close[1])))

// --- ADX Calculation (Manual Implementation) ---
// Calculate directional movements
upMove   = high - nz(high[1])
downMove = nz(low[1]) - low
plusDM   = (upMove > downMove and upMove > 0) ? upMove : 0.0
minusDM  = (downMove > upMove and downMove > 0) ? downMove : 0.0

// Smooth the values using the built-in rma function
atr      = ta.rma(tr, adxLength)
plusDI   = 100 * ta.rma(plusDM, adxLength) / atr
minusDI  = 100 * ta.rma(minusDM, adxLength) / atr
dx       = 100 * math.abs(plusDI - minusDI) / (plusDI + minusDI)
adxValue = ta.rma(dx, adxLength)

// --- Choppiness Index Calculation ---
// Compute the sum of true range over chopLen periods
atrSum      = f_sum(tr, chopLen)
// Compute highest high and lowest low over chopLen periods using custom functions
highestHigh = f_highest(high, chopLen)
lowestLow   = f_lowest(low, chopLen)
priceRange  = highestHigh - lowestLow
chop        = priceRange != 0 ? 100 * math.log(atrSum / priceRange) / math.log(chopLen) : 0

// ─── STRATEGY CONDITIONS ─────────────────────────────────────────────────────
// MA Crossover Signals
longCond  = ta.crossover(ma9, ma21)
shortCond = ta.crossunder(ma9, ma21)

// Filter: Only trade if ADX > threshold and CHOP ≤ threshold.
filterCond = (adxValue > adxThresh) and (chop <= chopThresh)

// Entries and Exits
if longCond and filterCond
    strategy.entry("Long", strategy.long)
if shortCond and filterCond
    strategy.entry("Short", strategy.short)
if shortCond
    strategy.close("Long")
if longCond
    strategy.close("Short")

// ─── PLOTTING ──────────────────────────────────────────────────────────────
plot(ma9, color=color.red, title="MA 9")
plot(ma21, color=color.blue, title="MA 21")
plot(adxValue, title="ADX", color=color.purple)
hline(adxThresh, title="ADX Threshold", color=color.purple, linestyle=hline.style_dotted)
plot(chop, title="CHOP", color=color.orange)
hline(chopThresh, title="CHOP Threshold", color=color.orange, linestyle=hline.style_dotted)