Quantitative Handelsstrategie zum Öffnen und Schließen des gleitenden Durchschnitts-Crossovers in Kombination mit dem dynamischen ADX-Indikator

MA ADX SMMA EMA DEMA TEMA WMA VWMA HullMA LSMA ALMA SSMA TMA ATR
Erstellungsdatum: 2025-02-18 13:35:54 zuletzt geändert: 2025-02-18 13:35:54
Kopie: 1 Klicks: 445
1
konzentrieren Sie sich auf
1617
Anhänger

Quantitative Handelsstrategie zum Öffnen und Schließen des gleitenden Durchschnitts-Crossovers in Kombination mit dem dynamischen ADX-Indikator

Überblick

Dies ist eine quantitative Handelsstrategie, die auf einer Kreuzung von Moving Averages basiert, die sich auf den Öffnungs- und Schlusskurs bewegen, und die den durchschnittlichen Trendindikator ((ADX) als Filter verwendet. Die Strategie verwendet verschiedene Arten von Moving Averages, einschließlich SMMA, EMA und DEMA, um Markttrendänderungen zu erfassen, indem sie die Kreuzung von Gleichungen identifiziert, während die ADX-Indikatoren zur Bestätigung der Trendstärke verwendet werden, um die Zuverlässigkeit des Handels zu verbessern.

Strategieprinzip

Die Kernlogik der Strategie ist die Berechnung von Moving Averages für die Eröffnungs- und Schlussprize, die mehrere Signale erzeugen, wenn die Schlussprize die Eröffnungs- und Schlussprize aufwärts überschreitet und der ADX-Wert den gesetzten Schwellenwert übersteigt. Die Strategie unterstützt verschiedene Moving Average-Berechnungsmethoden, darunter einfache Moving Averages (SMA), Index Moving Averages (EMA) und Doppelindex Moving Averages (EMAD), wobei die am besten geeigneten Mittelwerttypen für verschiedene Marktmerkmale ausgewählt werden.

Strategische Vorteile

  1. Flexibilität: Unterstützung für mehrere Arten von Moving Average, die optimale Methode zur Berechnung von Moving Average für unterschiedliche Marktumstände
  2. Trendbestätigung: Filterung der ADX-Indikatoren wirkt wirkungsvoll, um Falschsignale in den Schwankungen zu reduzieren
  3. Risikokontrolle: Ein Stop-Loss- und Stop-Stop-Funktion, um das Risiko für jeden Handel effektiv zu steuern
  4. Hochgradige Anpassbarkeit: Bereitstellung von mehreren Interfaces mit Parametern wie Durchschnittszyklus, ADX-Threshold, Handelsrichtung usw. zur Optimierung der Strategie
  5. Unterstützung für mehrere Zeiträume: kann in verschiedenen Zeiträumen ausgeführt werden und ist für verschiedene Handelsstile geeignet

Strategisches Risiko

  1. Moving Average Lagging: Die Moving Average ist ein im Wesentlichen Lagging-Indikator, der in schnell schwankenden Märkten ein Lagging-Signal erzeugen kann
  2. False-Breakout-Risiko: Bei Marktschwankungen kann es zu einem mittleren False-Breakout kommen, wobei die ADX-Filterung vorsichtig ist
  3. Parameter-Sensitivität: Strategieeffekte sind auf Parameter-Einstellungen empfindlich und müssen für unterschiedliche Marktumstände angepasst werden
  4. Marktadaptivität: bessere Performance in trendigen Märkten, aber möglicherweise häufiger in turbulenten Märkten
  5. Komplexität der Berechnung: Die Berechnung mit mehreren Mittellinientypen kann die Systembelastung erhöhen und die Betriebseffizienz muss berücksichtigt werden

Richtung der Strategieoptimierung

  1. Einführung von Volumenindikatoren: Die Wirksamkeit des Trends kann durch die Kombination von Volumenänderungen bestätigt werden
  2. Optimierung der ADX-Parameter: Anpassung der ADX-Throughs an unterschiedliche Marktzyklusdynamiken
  3. Hinzufügen von Trendbestätigungsindikatoren: Erwägen Sie, weitere Trendindikatoren hinzuzufügen, um die Signalsicherheit zu verbessern
  4. Verbesserte Stop-Loss-Mechanismen: Einführung von Tracking-Stops oder Schwankungsrate-Adaptive Stop-Losses
  5. Optimierung der Handelszeiten: Berücksichtigung von Marktvolatilität und Liquiditätsfaktoren zur Auswahl der optimalen Handelszeiten

Zusammenfassen

Es handelt sich um ein quantitatives Handelssystem, das die klassischen Linear-Cross-Strategien mit den ADX-Indikatoren kombiniert. Durch die Unterstützung von mehreren Linear-Typen und die Bestätigung von ADX-Trends ist es möglich, die Markttrends besser zu erfassen, und es verfügt über eine umfassende Risikokontrolle. Die Strategie ist stark anpassbar und kann entsprechend der verschiedenen Marktbedingungen optimiert werden.

Strategiequellcode
/*backtest
start: 2024-02-18 00:00:00
end: 2025-02-16 08:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

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

//@version=6
strategy("Open Close Cross Strategy R5.1", shorttitle="OCC Strategy R5.1", overlay=true,
     pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

// === INPUTS ===
useRes      = input.bool(true, title="Use Alternate Resolution?")
intRes      = input.int(3, title="Multiplier for Alternate Resolution", minval=1)
stratRes    = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes) + "M" :
              timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes) + "W" :
              timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes) + "D" :
              timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes) : "60"

basisType   = input.string("SMMA", title="MA Type:", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"])
basisLen    = input.int(8, title="MA Period", minval=1)
offsetSigma = input.int(6, title="Offset for LSMA / Sigma for ALMA", minval=0)
offsetALMA  = input.float(0.85, title="Offset for ALMA", minval=0, step=0.01)
scolor      = input.bool(false, title="Show Colored Bars to Indicate Trend?")
delayOffset = input.int(0, title="Delay Open/Close MA (Forces Non-Repainting)", minval=0, step=1)
tradeType   = input.string("BOTH", title="What trades should be taken:", options=["LONG", "SHORT", "BOTH", "NONE"])

// === BASE FUNCTIONS ===
variant(type, src, len, offSig, offALMA) =>
    if type == "EMA"
        ta.ema(src, len)
    else if type == "DEMA"
        ta.ema(ta.ema(src, len), len) * 2 - ta.ema(ta.ema(ta.ema(src, len), len), len)
    else if type == "TEMA"
        3 * (ta.ema(src, len) - ta.ema(ta.ema(src, len), len)) + ta.ema(ta.ema(ta.ema(src, len), len), len)
    else if type == "WMA"
        ta.wma(src, len)
    else if type == "VWMA"
        ta.vwma(src, len)
    else if type == "SMMA"
        ta.sma(src, len)
    else if type == "HullMA"
        ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))
    else if type == "LSMA"
        ta.linreg(src, len, offSig)
    else if type == "ALMA"
        ta.alma(src, len, offALMA, offSig)
    else if type == "TMA"
        ta.sma(ta.sma(src, len), len)
    else
        ta.sma(src, len)

// Security wrapper
reso(exp, use, res) => use ? request.security(syminfo.tickerid, res, exp, lookahead=barmerge.lookahead_on) : exp

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries  = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)

// Alternate resolution series
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt  = reso(openSeries, useRes, stratRes)

// Trend Colors
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour     = closeSeries > openSeriesAlt ? color.lime : color.red
barcolor(scolor ? bcolour : na, title="Bar Colours")

closeP = plot(closeSeriesAlt, title="Close Series", color=trendColour, linewidth=2, style=plot.style_line)
openP  = plot(openSeriesAlt, title="Open Series", color=trendColour, linewidth=2, style=plot.style_line)
fill(closeP, openP, color=trendColour)
// === ADX FILTER ===
// ADX Calculation
// Input parameters
adxLength = input.int(14, title="ADX Length", minval=1)
adxfilter = input.int(13, title="ADX filter", minval=1)
// Calculate +DM and -DM (Directional Movement)
plusDM = math.max(high - high[1], 0)
minusDM = math.max(low[1] - low, 0)

// Remove cases where both are positive
plusDM := plusDM > minusDM ? plusDM : 0
minusDM := minusDM > plusDM ? minusDM : 0

// Smooth the directional movement using RMA
smoothedPlusDM = ta.rma(plusDM, adxLength)
smoothedMinusDM = ta.rma(minusDM, adxLength)

// Calculate True Range and smooth it
tr = ta.atr(adxLength)
smoothedTR = ta.rma(tr, adxLength)

// Compute +DI and -DI
plusDI = (smoothedPlusDM / smoothedTR) * 100
minusDI = (smoothedMinusDM / smoothedTR) * 100

// Compute DX (Directional Index)
dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100

// Compute ADX by smoothing DX
adx = ta.rma(dx, adxLength)




// === UPDATED TRADE CONDITIONS ===
xlong     = ta.crossover(closeSeriesAlt, openSeriesAlt) and adx > adxfilter
xshort    = ta.crossunder(closeSeriesAlt, openSeriesAlt) and adx > adxfilter
longCond  = xlong
shortCond = xshort


// === STRATEGY ===
slPoints  = input.float(0, title="Initial Stop Loss Points", minval=0)
tpPoints  = input.float(0, title="Initial Target Profit Points", minval=0)
ebar      = input.int(10000, title="Number of Bars for Back Testing", minval=0)

tdays     = (timenow - time) / 60000.0

tdays     := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier :
             timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier :
             timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier :
             tdays / timeframe.multiplier

TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

if (ebar == 0 or tdays <= ebar)
    if longCond and tradeType != "SHORT"
        strategy.entry("long", strategy.long)
    if shortCond and tradeType != "LONG"
        strategy.entry("short", strategy.short)
    if shortCond and tradeType == "LONG"
        strategy.close("long")
    if longCond and tradeType == "SHORT"
        strategy.close("short")
    strategy.exit("XL", from_entry="long", profit=TP, loss=SL)
    strategy.exit("XS", from_entry="short", profit=TP, loss=SL)

// === END ===