Unterstützungs- und Widerstandsdurchbruchstrategie und quantitatives Trend-ADX-Filter-Handelssystem

ADX SMA 支撑阻力位 趋势滤波器 突破策略 枢轴点 动向指标 风险管理
Erstellungsdatum: 2025-05-30 11:58:27 zuletzt geändert: 2025-05-30 11:58:27
Kopie: 0 Klicks: 367
2
konzentrieren Sie sich auf
319
Anhänger

Unterstützungs- und Widerstandsdurchbruchstrategie und quantitatives Trend-ADX-Filter-Handelssystem Unterstützungs- und Widerstandsdurchbruchstrategie und quantitatives Trend-ADX-Filter-Handelssystem

Überblick

Die Strategie basiert auf dem Durchbruch des Marktpreises über die entscheidenden Preisniveaus und erhöht die Zuverlässigkeit des Handelssignals durch die Verwendung von Moving Average und Average Directional Index (ADX) als Filter. Das System verwendet einen 1-Stunden-Zeitrahmen, um dynamische Unterstützungs-Durchbruchgebiete durch die Identifizierung von Pivotal Highs und Lows zu erstellen, die beim Ausbruch der Preise in diesen Gebieten ein Handelssignal auslösen, während ein Stop-Loss-Mechanismus mit festen Prozentpunkten eingerichtet wird, um das Risiko zu kontrollieren.

Strategieprinzip

Die Kernprinzipien dieser Strategie basieren auf dem Durchbruch von Preisen in wichtigen Resistenzstützen, die in Kombination mit der Richtung der Tendenz und der Filterung der Marktstärke zu einem vollständigen Handelssystem führen. Die konkreten Implementierungsprinzipien umfassen:

  1. Unterstützung der Widerstands-IdentifikationDas System verwendet Pivot Points, um wichtige Preisniveaus zu erkennen.ta.pivothighUndta.pivotlowFunktion, die die Pivotal-Hoch- und Tiefpunkte mit 5 Perioden als Standardparameter berechnet und diese Punkte als potenzielle Widerstands- und Unterstützungspunkte verwendet.

  2. Dynamische GebietsverwaltungDas System verwendet die Array-Struktur:supportLevelsUndresistanceLevelsSpeichern Sie die Widerstandswerte und über eine benutzerdefinierte Funktionf_add_levelDie Funktion sorgt dafür, dass die neu hinzugefügten Ebenen ausreichend weit von den vorhandenen Ebenen entfernt sind (standardmäßig 2%) und verhindert, dass die Bereiche überfüllt werden, während die Aufbewahrung von maximal fünf neuesten Ebenen beschränkt wird.

  3. Trendbestätigung FilterDie Strategie nutzt den 50-Zyklus-SMA als Trendrichtungsanzeige. Nur wenn der Preis oberhalb der Durchschnittslinie liegt, wird ein Überschreiten berücksichtigt, und wenn er unterhalb der Durchschnittslinie liegt, wird ein Untergang berücksichtigt, um der allgemeinen Marktentwicklung zu folgen.

  4. Marktstärke überprüftDie ADX-Wert muss höher sein als der eingestellte Schwellenwert (Standard 25), um sicherzustellen, dass der Einstieg nur in einem Markt mit ausreichender Stärke erfolgt, um falsche Durchbrüche in einem schwachen Marktumfeld zu vermeiden.

  5. Eingangssignal erzeugt:

    • Mehrköpfige Signale: Ausgelöst, wenn der Preis die Unterstützung von unten durchbricht (Bei niedriger als die Unterstützung, aber der Schlusskurs ist höher als die Unterstützung), während der Preis oberhalb der 50-Zyklus-Durchschnittslinie liegt und der ADX-Wert über der Abschwächung liegt.
    • Hoher Signal: Ausgelöst, wenn der Preis die Resistenz von oben durchbricht (Hoch über der Resistenz, aber der Schlusskurs ist unter der Resistenz), während der Preis unterhalb der 50-Zyklus-Mittellinie liegt und der ADX-Wert über der Schwelle liegt.
  6. RisikomanagementDie Strategie verwendet die Stop-Loss-Einstellung mit einem festen Prozentsatz, die Standardeinstellung von 15% Stop-Loss und 10% Stop-Loss mit mehreren Köpfen und die Standardeinstellung von 10% Stop-Loss und 10% Stop-Loss mit leeren Köpfen. Sobald die Preise diese Ebenen erreichen, wird das System automatisch aufgelöst und die Handelsstatus wiederhergestellt.

Strategische Vorteile

Basierend auf einer eingehenden Analyse des Codes weist diese Strategie folgende deutliche Vorteile auf:

  1. MehrfachbestätigungDurch die Dreifachbestätigung von Resistenzbrechern, Trendrichtung und ADX-Stärke in Kombination mit Unterstützung wird das Risiko eines falschen Brechens reduziert. Die Mehrfachbestätigung erhöht die Zuverlässigkeit der Handelssignale im Vergleich zu einem einzigen Indikator.

  2. Widerstandsbereiche mit dynamischer UnterstützungDas System identifiziert und verwaltet unterstützende Widerstände dynamisch und ist in der Lage, sich an unterschiedliche Marktumstände anzupassen. Bis zu fünf aktuelle Unterstützende Widerstände werden beibehalten, um sicherzustellen, dass die Strategie sich auf die am meisten relevanten Preisniveaus konzentriert.

  3. Intelligente GebietsgruppenDurch die maxZoneWidthPct-Prozentsatzparameter wird die Überschreitung der zu nahen Stützungswiderstandswerte vermieden, wodurch ein Redundanzsignal verringert wird.

  4. Benutzerdefinierte ADX-BerechnungStrategie: Benutzung einer benutzerdefinierten ADX-Funktion, um die Genauigkeit und Flexibilität der Kennzahlen zu gewährleisten, indem die tatsächliche Breite, Richtung und Gleitbewegung direkt berechnet werden

  5. Flexible ParameterkonfigurationDie Strategie bietet mehrere anpassbare Parameter, darunter die Pivotal-Länge, die Rücklaufphase, die maximale Bereichsbreite, die Stop-Loss-Prozentzahl und die ADX-Tap, die der Benutzer für verschiedene Marktbedingungen und Handelspräferenzen optimieren kann.

  6. Risikokontrollen sind klarDie Einführung eines Standard-Stop-Loss-Prozentsatzes bietet einen klaren Risikomanagement-Rahmen für jeden Handel, um übermäßige Verluste für einzelne Geschäfte zu verhindern und gleichzeitig angemessene Gewinne zu sichern.

  7. Intuitive VisualisierungStrategie: Unterstützungswiderstand und Handelssignale werden in den Diagrammen markiert und bieten intuitive visuelle Rückmeldungen durch Farbcodierung (Unterstützungswert grün, Widerstandswert rot) und Etiketten (LONG, SHORT, EXIT) zur Rückmeldungsanalyse und Echtzeitüberwachung.

Strategisches Risiko

Trotz der vernünftigen Ausgestaltung der Strategie bestehen folgende potenzielle Risiken und Einschränkungen:

  1. Falsche Durchbrüche in hochschwankenden MärktenIn einem sehr schwankenden Markt kann es vorkommen, dass die Preise häufig die Resistenz der Unterstützung durchbrechen und dann wieder in die ursprüngliche Zone zurückkehren, was zu einer Zunahme der falschen Durchbruchssignale führt. Lösung: Es kann in Erwägung gezogen werden, die Bestätigungsphase zu erhöhen, indem die Preise nach dem Durchbruch eine gewisse Zeit oder eine bestimmte Form erhalten, um die Signale zu bestätigen.

  2. Übermäßige Abhängigkeit von historischen WiderstandslagenDie Strategie basiert auf historisch gebildeten Unterstützungs- und Widerstandsebenen, die bei grundlegenden Veränderungen in der Marktstruktur (z. B. bei wichtigen Nachrichtenereignissen) ausfallen können. Lösung: Es kann in Erwägung gezogen werden, eine dynamische Anpassungsmechanik hinzuzufügen, die die Unterstützungs- und Widerstandsebenen automatisch an die Marktfluktuation anpasst.

  3. Die Einschränkung des Fixprozentsatzes des Stop LossesDer Stop-Loss mit einem festen Prozentsatz ist möglicherweise nicht für alle Marktumstände geeignet und kann in Märkten mit geringer Volatilität zu groß und in Märkten mit hoher Volatilität zu klein sein. Lösung: Eine dynamische Anpassung des Stop-Loss-Niveaus basierend auf der ATR (Real Amplitude) kann in Betracht gezogen werden.

  4. TrendumkehrrisikoDie Verwendung eines 50-Zyklus-SMA als Trendindikator kann zu einer Nachspielung bei der Reaktion auf eine Trendwende führen, die dazu führt, dass der Trend kurz vor dem Ende noch im Kurs ist. Lösung: Es kann in Erwägung gezogen werden, einen sensibleren kurzfristigen Trendindikator oder einen Dynamikindikator als Hilfsmittel zu verwenden.

  5. Rechenintensive StrategienDie Strategie erfordert die Berechnung und Pflege von mehreren Arrays und Metriken in Echtzeit und kann in einer Umgebung mit hoher Frequenz oder begrenzten Ressourcen zu Performance-Herausforderungen führen. Lösungsansätze: Optimierung der Algorithmen-Effizienz, Reduzierung unnötiger Berechnungen oder Berücksichtigung der Reduzierung der Frequenz der Aktualisierung.

  6. ParameterempfindlichkeitStrategie-Performance: Strategie-Performance ist empfindlich auf Parameter-Einstellungen (z. B. Pivotal-Länge, ADX-Thresholds), wobei eine falsche Parameter-Auswahl zu übertriebenen oder verpassten Chancen führen kann. Lösungsvorschlag: Erstellen Sie einen Rahmen für die Parameter-Optimierung, indem Sie die Parameter-Performance unter verschiedenen Marktbedingungen testen.

Richtung der Strategieoptimierung

Auf der Grundlage einer eingehenden Analyse des Strategie-Codes können folgende Optimierungsmöglichkeiten ermittelt werden:

  1. AnpassungsmechanismenEinführung eines Mechanismus, der die Schlüsselparameter automatisch an die Marktfluktuation anpasst. So können beispielsweise die ADX-Trenchwerte oder die Breite der Widerstandsbereiche erhöht werden, wenn die Marktfluktuation hoch ist, und diese Parameter während der niedrigen Fluktuation reduziert werden, um die Strategie besser an unterschiedliche Marktbedingungen anzupassen. Dies kann Fehlhandlungen unter unangemessenen Marktbedingungen reduzieren.

  2. Mehrfache ZeitrahmenanalyseDurch die Überprüfung, ob die Unterstützungswiderstände auf den Tages- oder Kreislinien-Charts mit den Niveaus auf den aktuellen 1-Stunden-Charts übereinstimmen, können stärkere, mehrfach anerkannte, wichtige Preisregionen identifiziert und die Signalqualität verbessert werden.

  3. Bestätigung des TransaktionsvolumensIn Kombination mit der Analyse der Transaktionsmenge wird die Effektivität von Durchbrüchen überprüft. Wirklich effektive Durchbrüche werden in der Regel mit einem signifikanten Anstieg der Transaktionsmenge begleitet. Durch das Hinzufügen von Transaktionsmengefilterbedingungen kann das Risiko von False-Breaks durch niedrige Transaktionsmengen verringert werden.

  4. Dynamische StoppschlägeDies ermöglicht eine größere Flexibilität bei der Risikomanagement und die Möglichkeit, die Schutzniveaus automatisch an die aktuellen Marktbedingungen anzupassen, um lockere Stop-Loss-Leistungen in hochvolatilen Märkten und engere Stop-Loss-Leistungen in niedrigvolatilen Märkten einzurichten.

  5. Teilweise GewinnabsperrungDie Einführung von Phasengewinnmechanismen, die es ermöglichen, die Stop-Loss-Kosten zu bewegen oder einen Teil der Gewinne zu sperren, wenn ein bestimmtes Gewinnniveau erreicht wird. Diese Methode kann das Rücknahmerisiko verringern, während das Potenzial für hohe Gewinne beibehalten wird.

  6. Integration der EmotionsindikatorenBerücksichtigen Sie die Integration von Marktstimmungskennzahlen (z. B. VIX oder relativ starke Kennzahlen) als zusätzliche Filterbedingungen. Die Marktstimmung beeinflusst häufig die Nachhaltigkeit von Durchbrüchen. Durch die Erhöhung der Dimension der Gefühlsanalyse kann das Verständnis der Marktlage der Strategie verbessert werden.

  7. Klassifizierung der StützungswiderstandstärkeEinführung eines Mechanismus zur Bewertung der Stärke der Stützungswiderstandsstufe, der die Stärke der einzelnen Ebenen anhand von Faktoren wie Anzahl der Testgeschichten und Dauer der Bildung bewertet. So kann der Fokus auf die Preisstufen gelegt werden, die stärker sind und eher zu einer effektiven Reaktion führen.

  8. Maschinelle Lernoptimierung: Erwägen Sie die Optimierung der Parameterwahl und Signalgenerierung mit Hilfe von Machine-Learning-Methoden. Durch die Analyse erfolgreicher und fehlender Handelsmuster in historischen Daten können Machine-Learning-Algorithmen helfen, die effektivsten Parameterkombinationen und Marktbedingungen zu identifizieren.

Zusammenfassen

Die Quantifizierung des Handelssystems mit dem Trend-ADX-Filter ist ein gut konzipiertes, integriertes Handelssystem, das mehrere wichtige Elemente aus der technischen Analyse kombiniert. Die Strategie identifiziert und überwacht dynamisch die Resistenzpunkte der Unterstützung, kombiniert mit der Richtung des Trends und der Filterung der Marktstärke, um einen relativ zuverlässigen Handelssignalgenerationsmechanismus zu schaffen.

Die Kernvorteile der Strategie liegen in der Mehrfachbestätigung und dem ausgefeilten Risikomanagement-Framework, die das Risiko von False Breakouts wirksam reduzieren und die potenziellen Verluste eines einzelnen Handels begrenzen. Die Strategie bietet außerdem eine große Auswahl an Optionen für die Parameterkonfiguration, die es dem Händler ermöglichen, sich flexibel an die persönlichen Risikopräferenzen und die Marktbedingungen anzupassen.

Die Strategie sieht sich jedoch auch mit einigen Herausforderungen konfrontiert, wie dem Risiko von False Breakouts in hochvolatilen Märkten, der Einschränkung von festen Stop-Losses und der Parameter-Sensitivität. Die Strategie-Performance wird durch die Einführung von Optimierungsmaßnahmen wie adaptive Parametermechanismen, Multi-Time-Framework-Analyse, Transaktionsvolumen-Bestätigung und dynamische Risikomanagement weiter verbessert.

Alles in allem ist es eine logisch klare, rational konzipierte und quantitative Handelsstrategie, die für Trader mit einem gewissen Verständnis der technischen Analyse und der Marktstruktur geeignet ist. Durch die kontinuierliche Optimierung und Anpassung an Marktveränderungen hat die Strategie das Potenzial, in verschiedenen Marktumgebungen eine stabile Leistung zu erzielen.

Strategiequellcode
/*backtest
start: 2024-05-30 00:00:00
end: 2025-05-29 00:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("S/R Breakout Strategy (1H) with Trend and ADX Filter", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// ─────────────────────────────────────────────────────────────
// INPUTS
// ─────────────────────────────────────────────────────────────
pivotLen        = input.int(5, title="Pivot Length")
lookbackBars    = input.int(300, title="Lookback Bars")
maxZoneWidthPct = input.float(2.0, title="Max Zone Width %")
tpLong          = input.float(0.15, title="Take Profit % (Long)")
slLong          = input.float(0.10, title="Stop Loss % (Long)")
tpShort         = input.float(0.10, title="Take Profit % (Short)")
slShort         = input.float(0.10, title="Stop Loss % (Short)")
allowLong       = input.bool(true, title="Allow Long Trades")
allowShort      = input.bool(true, title="Allow Short Trades")

// ADX settings
adxThreshold    = input.float(25.0, title="ADX Threshold")
adxLen          = input.int(14, title="ADX Length")

// Trend filter: 50-period moving average
ma50 = ta.sma(close, 50)

// ─────────────────────────────────────────────────────────────
// CUSTOM ADX FUNCTION
// ─────────────────────────────────────────────────────────────
// This function calculates ADX using the common method based on true range,
// directional movement and smoothing it with the RMA.
f_adx(len) =>
    // true range for the current bar
    tr = ta.tr
    // Calculate upward and downward moves
    upMove   = high - high[1]
    downMove = low[1] - low
    // Determine directional movements
    plusDM  = (upMove > downMove and upMove > 0) ? upMove : 0.0
    minusDM = (downMove > upMove and downMove > 0) ? downMove : 0.0
    // Smooth the values using RMA (running moving average)
    smPlusDM  = ta.rma(plusDM, len)
    smMinusDM = ta.rma(minusDM, len)
    smTR      = ta.rma(tr, len)
    // Calculate the directional indicators, avoid division by zero
    plusDI  = (smTR != 0) ? 100 * smPlusDM / smTR : 0.0
    minusDI = (smTR != 0) ? 100 * smMinusDM / smTR : 0.0
    diSum   = plusDI + minusDI
    dx      = (diSum != 0) ? 100 * math.abs(plusDI - minusDI) / diSum : 0.0
    // Smooth the DX to get ADX
    ta.rma(dx, len)

// Compute ADX value using the custom function
adxValue = f_adx(adxLen)

// ─────────────────────────────────────────────────────────────
// PIVOT DETECTION & SUPPORT/RESISTANCE LEVELS
// ─────────────────────────────────────────────────────────────
pivotHigh = ta.pivothigh(high, pivotLen, pivotLen)
pivotLow  = ta.pivotlow(low, pivotLen, pivotLen)

// Declare arrays for support and resistance levels
var float[] supportLevels    = array.new_float()
var float[] resistanceLevels = array.new_float()

// Function to add a level into the provided array if it meets the criteria.
// Always returns a float (0.0) for consistency.
f_add_level(arr, newLevel) =>
    if array.size(arr) == 0
        array.push(arr, newLevel)
    else
        shouldAdd = true
        for i = 0 to (array.size(arr) - 1)
            existing = array.get(arr, i)
            if math.abs(existing - newLevel) / newLevel * 100 <= maxZoneWidthPct
                shouldAdd := false
        if shouldAdd
            array.push(arr, newLevel)
            if array.size(arr) > 5
                array.shift(arr)
    0.0

// Update support and resistance arrays once sufficient bars have formed
if bar_index > pivotLen * 2
    if not na(pivotLow)
        f_add_level(supportLevels, pivotLow)
    if not na(pivotHigh)
        f_add_level(resistanceLevels, pivotHigh)

// ─────────────────────────────────────────────────────────────
// TRADE MANAGEMENT VARIABLES
// ─────────────────────────────────────────────────────────────
var bool   inTrade    = false
var bool   isLong     = false
var float  entryPrice = na

// Signal flags
longSignal  = false
shortSignal = false

// Detect long signal: price crosses above support level
if array.size(supportLevels) > 0
    for i = 0 to (array.size(supportLevels) - 1)
        lvl = array.get(supportLevels, i)
        if low < lvl and close > lvl
            longSignal := true

// Detect short signal: price crosses below resistance level
if array.size(resistanceLevels) > 0
    for i = 0 to (array.size(resistanceLevels) - 1)
        lvl = array.get(resistanceLevels, i)
        if high > lvl and close < lvl
            shortSignal := true

// ─────────────────────────────────────────────────────────────
// ENTRY CONDITIONS & EXECUTION
// ─────────────────────────────────────────────────────────────
if not inTrade
    // Long entry: require long signal, price above 50MA, and ADX above threshold
    if allowLong and longSignal and close > ma50 and adxValue > adxThreshold
        strategy.entry("Long", strategy.long)
        label.new(x=bar_index, y=low, text="LONG", xloc=xloc.bar_index, style=label.style_label_up, color=color.green, textcolor=color.white)
        entryPrice := close
        isLong     := true
        inTrade    := true
    // Short entry: require short signal, price below 50MA, and ADX above threshold
    else if allowShort and shortSignal and close < ma50 and adxValue > adxThreshold
        strategy.entry("Short", strategy.short)
        label.new(x=bar_index, y=high, text="SHORT", xloc=xloc.bar_index, style=label.style_label_down, color=color.red, textcolor=color.white)
        entryPrice := close
        isLong     := false
        inTrade    := true

// ─────────────────────────────────────────────────────────────
// EXIT CONDITIONS
// ─────────────────────────────────────────────────────────────
if inTrade
    ret = isLong ? (close - entryPrice) / entryPrice : (entryPrice - close) / entryPrice
    tp  = isLong ? tpLong : tpShort
    sl  = isLong ? slLong : slShort
    if ret >= tp or ret <= -sl
        strategy.close_all()
        label.new(x=bar_index, y=close, text="EXIT", xloc=xloc.bar_index, style=label.style_label_left, color=color.orange, textcolor=color.black)
        inTrade    := false
        entryPrice := na

// ─────────────────────────────────────────────────────────────
// ALERT CONDITIONS
// ─────────────────────────────────────────────────────────────
alertcondition(longSignal and allowLong, title="Long Breakout", message="🚀 Long breakout on {{ticker}} at {{close}}")
alertcondition(shortSignal and allowShort, title="Short Breakout", message="🔻 Short breakout on {{ticker}} at {{close}}")