Dual Momentum Durchbruch und Volatilitätsfilterung Algorithmische Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-12-22 12:01:21
Tags:

img

Übersicht

Diese Strategie verwendet hauptsächlich die Überschneidung des doppelten EMA- und DEMA-Impulses zur Identifizierung von Trends und umfasst den ATR-Volatilitätsindex zur Filterung falscher Ausbrüche und setzt eine quantitative Handelsstrategie mit doppelten Impulsindikatoren und Volatilitätsfilterung um.

Strategieprinzip

Zu den Hauptbestandteilen dieser Strategie gehören:

  1. Berechnen Sie EMA und DEMA des Preises als doppelte Momentum-Indikatoren. Der längere Zeitraum EMA spiegelt langfristige Trends wider, während DEMA als empfindlicher kurzfristiger Momentum-Indikator dient. Ein Kaufsignal wird erzeugt, wenn DEMA über die EMA überschreitet.

  2. Berechnen Sie den ATR-Volatilitätsindex. Verwenden Sie den ATR-Wert, um die Marktvolatilität und die Liquiditätsbedingungen zu bestimmen. Filtern Sie die Impulsindikatoren, wenn die Volatilität zu hoch ist, um falsche Ausbrüche zu vermeiden.

  3. Die ATR-Volatilität wird durch eine parametrierte gleitende Durchschnittslinie als hoch oder niedrig beurteilt.

  4. Die Parameter regeln den ATR-Zeitrahmen, die ATR-Länge, den Typ und die Länge des gleitenden Durchschnitts der ATR usw.

  5. Festlegen von Stop-Loss, Take-Profit und Trailing-Stop-Regeln für Long-Positionen.

Analyse der Vorteile

Der doppelte EMA-Filter kann im Vergleich zu grundlegenden EMA-Cross-Strategien falsche Signale und Überhandelungen signifikant reduzieren.

Als reaktionsfähigerer kurzfristiger Impulsindikator bildet DEMA in Kombination mit dem stabilen langfristigen EMA ein zuverlässiges Combo-Signal.

Durch die Anpassung der ATR-Parameter können für verschiedene Tickers geeignete Volatilitätsschwellenwerte festgelegt werden, wodurch die Anpassungsfähigkeit der Strategie verbessert wird.

Risikoanalyse

Das größte Risiko besteht darin, dass eine unsachgemäße Einstellung der Parameter zu wenigen Handelssignalen führen kann. Zu lange DEMA- und EMA-Längen oder zu hohe ATR-Volatilitätsschwellen können die tatsächliche Strategieleistung untergraben. Wiederholte Backtests sind erforderlich, um die optimale Parameterkombination zu finden.

Ein weiteres potenzielles Risiko besteht darin, dass bei extremen Marktbedingungen Preisschwankungen die ATR-Parameterbeschränkungen verletzen und zu Verlusten führen können.

Optimierungsrichtlinien

  1. Versuche verschiedene Kombinationen von Momentindikatorparametern, um optimale Einstellungen zu finden.

  2. Versuchen Sie, Impulsindikatoren aus der doppelten EMA durch MACD oder andere Indikatoren zu ersetzen.

  3. Verschiedene Konfigurationen des Volatilitätsindex, wie z. B. die gesamte historische ATR, der Marktvolatilitätsindex usw. zu testen.

  4. Zusätzliche Volumenfilterung, um das Risiko falscher Preisschwankungen zu vermeiden.

  5. Optimieren Sie Stop-Loss- und Take-Profit-Mechanismen für ein verbessertes Risiko-Rendite-Verhältnis.

Schlussfolgerung

Diese Strategie integriert Impulsanalyse und Volatilitätsforschung mit einer soliden theoretischen Basis. Durch Parameter-Tuning und Logikoptimierung kann sie zu einem stabilen und zuverlässigen algorithmischen Handelssystem werden. Mit klaren Handelssignalen und kontrollierbaren Risiken lohnt es sich, sie im Live-Handel zu überprüfen und umzusetzen.


/*backtest
start: 2023-11-21 00:00:00
end: 2023-12-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Qorbanjf

//@version=4
strategy("ORIGIN DEMA/EMA & VOL LONG ONLY", shorttitle="ORIGIN DEMA/EMA & VOL LONG", overlay=true)

// DEMA
length = input(10, minval=1, title="DEMA LENGTH")
src = input(close, title="Source")
e1 = ema(src, length)
e2 = ema(e1, length)
dema1 = 2 * e1 - e2
plot(dema1, "DEMA", color=color.yellow)

//EMA
len = input(25, minval=1, title="EMA Length")
srb = input(close, title="Source")
offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
ema1 = ema(srb, len)
plot(ema1, title="EMA", color=color.blue, offset=offset)


// Inputs
atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution)
atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer)
useMA = input(title = "Show Moving Average?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type")
maLength = input(defval = 20, title = "Moving Average Period", minval = 1)
//longLossPerc = input(title="Long Stop Loss (%)",
    // type=input.float, minval=0.0, step=0.1, defval=1) * 0.01
longTrailPerc = input(title="Trail stop loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=50) * 0.01
longProfitPerc = input(title="Long Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=3000) / 100

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2017, title = "From Year", minval = 2000)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)


// ATR Logic // atrValue = atr(atrLookback) // atrp = (atrValue/close)*100 // plot(atrp, color=color.white, linewidth=2, transp = 30)

atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback))
atrp = (atrValue/close)*100

// Moving Average Logic
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength))

// variables for enter position
enterLong = crossover(dema1, ema1) and atrp < maFilter

// variables for exit position
sale = crossunder(dema1, ema1)

// stop loss
//longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)

// trail stop
// Determine trail stop loss prices
longStopTrail = 0.0

longStopTrail := if (strategy.position_size > 0)
    stopValue = close * (1 - longTrailPerc)
    max(stopValue, longStopTrail[1])
else
    0
//Take profit Percentage
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)

//Enter trades when conditions are met
strategy.entry(id="long",
 long=strategy.long,
 when=enterLong,
 comment="long")

//
strategy.close("long", when = sale, comment = "Sell")
//place exit orders (only executed after trades are active)

strategy.exit(id="sell",
 limit = longExitPrice,
 stop = longStopTrail,
 comment = "SL/TP")



Mehr