Momentum-Strategie auf der Grundlage von DEMA und EMA Crossover mit ATR Volatilitätsfilter

Schriftsteller:ChaoZhang, Datum: 2024-01-08 14:14:57
Tags:

img

I. Überblick über die Strategie

Diese Strategie trägt den Namen Momentum Strategy Based on DEMA and EMA Crossover with ATR Volatility Filter. Sie erzeugt kurzfristige Handelssignale, indem DEMA und EMA Crossovers kombiniert mit dem ATR Volatilitätsindex erkannt werden. Wenn DEMA unterhalb der EMA überschreitet, während die ATR steigt, verkürzt sie die Sicherheit. Wenn DEMA wieder über der EMA überschreitet, schließt sie die Position.

II. Strategische Logik

  1. Berechnen Sie den DEMA-Indikator. DEMA ist der doppelte exponentielle gleitende Durchschnitt mit doppelten EMAs, die kurzfristigen Marktlärm filtern und die Signalgenauigkeit verbessern können.

  2. Berechnen Sie den EMA-Indikator. EMA ist der exponentielle gleitende Durchschnitt, der schneller auf Preisänderungen reagiert.

  3. Berechnen Sie den ATR-Volatilitätsindex. ATR misst die Volatilität des Marktes und die Risikoniveaus.

  4. Wenn DEMA unterhalb der EMA und ATR über die Schwelle steigt, signalisiert dies den Beginn eines kurzfristigen Abwärtstrends und ein erhöhtes Marktrisiko.

  5. Wenn die DEMA wieder über die EMA geht, signalisiert sie eine Kursunterstützung und einen Aufschwung.

III. Vorteile

  1. Die Kombination von doppelter EMA und EMA kann die Signalgenauigkeit effektiv verbessern.

  2. Der ATR-Volatilitätsfilter eliminiert risikoarme Whipsaw-Trades.

  3. Die kurzfristige Haltedauer passt zum kurzfristigen Momentum-Tracking und vermeidet eine längere Absicherung.

  4. Einfache und klare Logik, leicht zu verstehen und umzusetzen.

IV. Risiken

  1. Unzulängliche ATR-Parameter können Handelsmöglichkeiten verpassen.

  2. Es ist notwendig, sowohl lange als auch kurze Signale gleichzeitig zu überwachen, was die Schwierigkeit des Betriebs erhöht.

  3. von kurzfristiger Marktvolatilität betroffen.

Lösungen: Parameteroptimierung durch Backtesting. Vereinfachen Sie die Logik, um sich auf eine Seite zu konzentrieren. Entspannen Sie die Stop-Loss-Level angemessen.

V. Optimierungsrichtlinien

  1. Optimieren Sie die Parameter für DEMA und EMA, um die besten Kombinationen zu finden.

  2. Optimierung der ATR-Rückblicksperiode zur Bestimmung des optimalen Volatilitäts-Benchmarks.

  3. Hinzufügen anderer Indikatoren wie BOLL-Bänder zur Verbesserung der Signalgenauigkeit.

  4. Einführung von Stop Loss und Gewinnregeln, um konsequentere Gewinne zu erzielen.

VI. Schlussfolgerung

Diese Strategie konstruiert ein einfaches, aber effektives kurzfristiges Handelssystem mit DEMA, EMA-Crossovers und dem ATR-Volatilitätsindex. Die saubere Logik und die einfache Bedienung machen es für den Hochfrequenz-Momentum-Handel geeignet. Weitere Parameter- und Logikoptimierung kann möglicherweise zu einer stabileren Überleistung führen.


/*backtest
start: 2023-12-08 00:00:00
end: 2024-01-07 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
// 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("Qorban: DEMA/EMA & VOL Short ONLY", shorttitle="DEMA/EMA & VOL SHORT", 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)

// get ATR VALUE
atr = atr(14)

//ATRP (Average True Price in precentage)

// 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)
slType = input(title="Stop Loss ATR / %", type=input.float, defval=5.0, step=0.1)
slMulti = input(title="SL Multiplier", type=input.float, defval=1.0, step=0.1)
minimumProfitPercent = input(title="Minimum profit %", type=input.float, defval=20.00)

// 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))


// Determine percentage of open profit
var entry = 0.0
distanceProfit = low - entry
distanceProfitPercent = distanceProfit / entry

//Determin if we have a long entry signal OR a sell position signal
profitSignal = minimumProfitPercent == 0.0 or distanceProfitPercent >= minimumProfitPercent
shortSignal = crossunder(dema1, ema1) and atrp > maFilter and strategy.position_size == 0 and not na(atr)
exitSignal = profitSignal and strategy.position_size !=0 and  crossover(dema1, ema1)


// === 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)

//Invert trade direction & flipping 
//tradInvert = input(defval = false, title = "invert trade direction")
//MOM_MR = input(defval=1, title = "MOM = 1 / MR = -1", minval=-1, maxval=1)
//plots=input(false, title="Show plots?")

// Get stop loss (in pips AND percentage distance)
shortStop = highest(high, 4) - (atr * slMulti)
shortStopPercent = close - (close * slMulti)

// Save long stop & target prices (used for drawing data to the chart & deetermining profit)
var shortStopSaved = 0.0
var shortTargetSaved = 0.0
enterShort = false
if shortSignal
    shortStopSaved := slType ? shortStop : shortStopPercent
    enterShort:= true
    entry := close


// long conditions 
//enterLong = crossover(dema1, ema1) and atrp < maFilter
//exitSignal => crossunder(dema1, ema1)

//Enter trades when conditions are met
strategy.entry("short", strategy.short, when=enterShort, comment="SHORT")

//place exit orders (only executed after trades are active)
strategy.exit(id="Short exit",
 from_entry="short",
 limit=exitSignal ? close : na,
 stop=shortStopSaved,
 when=strategy.position_size > 0,
 comment="end short")
 

//short strategy
//goShort() => crossunder(dema1, ema1) and atrp > maFilter
//KillShort() => crossover(dema1, ema1) 
//strategy.entry("SHORT", strategy.short, when = goShort())
//strategy.close("COVER", when = KillShort())


Mehr