Momentum-Trading: Doppelte gleitende Durchschnitts-Crossover-Strategie


Erstellungsdatum: 2024-04-01 11:53:14 zuletzt geändert: 2024-04-01 11:53:14
Kopie: 4 Klicks: 597
1
konzentrieren Sie sich auf
1617
Anhänger

Momentum-Trading: Doppelte gleitende Durchschnitts-Crossover-Strategie

Überblick

Die Strategie verwendet Index Moving Averages (EMA) aus 8 und 21 Perioden, um Veränderungen in den Markttrends zu erkennen. Wenn EMA aus kürzeren Perioden die EMA aus längeren Perioden überschreitet, erzeugt dies ein Kaufsignal. Umgekehrt, wenn EMA aus kürzeren Perioden die EMA aus längeren Perioden überschreitet, erzeugt dies ein Verkaufssignal.

Strategieprinzip

  1. Berechnen Sie EMAs für 8 und 21 Zyklen, um die wichtigsten Trends zu erkennen.
  2. Identifizierung von drei aufeinanderfolgenden höheren Tiefs ((HLL) und drei aufeinanderfolgenden niedrigeren Höhen ((LLH), als frühes Signal für eine Trendwende.
  3. Wenn die 8-Zyklus-EMA von unten durch die 21-Zyklus-EMA geht und ein HLL-Bruch auftritt, erzeugt dies ein Kaufsignal. Wenn die 8-Zyklus-EMA von oben durch die 21-Zyklus-EMA geht und ein LLH-Bruch auftritt, erzeugt dies ein Verkaufsignal.
  4. Ein Stop-Loss-Level wurde auf 5% des Einstiegspreises und ein Stop-Loss-Level auf 16% des Einstiegspreises festgelegt, um Risiken zu kontrollieren und Gewinne zu sichern.
  5. Wenn ein Rückschlagsignal erscheint, ist die Position platziert und umgekehrt eröffnet.

Strategische Vorteile

  1. In Kombination mit EMA und Preisverhaltensmustern ((HLL und LLH) zur Bestätigung von Trends und zur Erhöhung der Signalsicherheit.
  2. Die Einrichtung von eindeutigen Stop-Loss- und Stop-Stop-Levels hilft, Risiken zu kontrollieren und Gewinne zu sichern.
  3. Es ist für mehrere Zeitrahmen und für verschiedene Märkte geeignet und hat eine gewisse Allgemeingültigkeit.
  4. Die Logik ist klar, leicht zu verstehen und umzusetzen.

Strategisches Risiko

  1. Häufige Kreuzungen können zu mehreren falschen Signalen führen, die zu Verlusten führen.
  2. Die festgelegten Stop-Loss- und Stop-Out-Levels können sich nicht an unterschiedliche Marktbedingungen anpassen, was zu potenziellen Opportunitätskosten oder größeren Verlusten führt.
  3. Die Strategie ist auf historische Daten angewiesen und kann schlechter auf unvorhergesehene Ereignisse oder grundlegende Veränderungen reagieren.

Richtung der Strategieoptimierung

  1. Die Einführung von Anpassungs-Stopp- und Stop-Mechanismen, die Stop- und Stop-Levels anpassen, um sich besser an unterschiedliche Marktbedingungen anzupassen, z. B. basierend auf der Volatilität (z. B. ATR).
  2. In Kombination mit anderen Indikatoren oder Faktoren, wie der RSI (Relative Strength Index), um die Signale weiter zu filtern und die Zuverlässigkeit zu verbessern.
  3. Optimierung von Parametern (z. B. EMA-Zyklen, Stop-Loss-Stopp-Ratio, etc.), um die beste Kombination von Parametern für einen bestimmten Markt oder eine bestimmte Kennzahl zu finden.
  4. Berücksichtigen Sie Risikomanagementmaßnahmen wie Positionssizing, um die Risikolockage für Einzelgeschäfte zu kontrollieren.

Zusammenfassen

Die Strategie nutzt die Kreuzung der 8-Zyklus- und 21-Zyklus-EMA in Kombination mit den HLL- und LLH-Preismodellen, um Trendumkehrungen zu erkennen und Handelssignale zu erzeugen. Eine eindeutige Stop-Loss-Regel hilft bei der Risikokontrolle und der Gewinne-Blocking. Die Strategie kann jedoch in einem wackligen Markt falsche Signale erzeugen, wobei ein fester Stop-Loss-Level möglicherweise nicht an unterschiedliche Marktumgebungen angepasst wird.

Strategiequellcode
/*backtest
start: 2023-03-26 00:00:00
end: 2024-03-31 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Trend Following 8&21EMA with strategy tester [ukiuro7]', overlay=true, process_orders_on_close=true, calc_on_every_tick=true, initial_capital = 10000)

//INPUTS
lh3On = true
hl3On = true
emaOn = input(title='105ema / 30min', defval=true) 
assistantOn = input(title='Assistant', defval=true)
textOn = input(title='Text', defval=true)

showRiskReward = input.bool(true, title='Show Risk/Reward Area', group="TP/SL")
stopPerc = input.float(5.0, step=0.1, minval=0.1, title='Stop-Loss %:',group="TP/SL") / 100
tpPerc = input.float(16.0, step=0.1, minval=0.1, title='Take-Profit %:',group="TP/SL") / 100

backtestFilter = input(false, title='Backtest Entries to Date Range',group="Backtest Date Range")
i_startTime = input(defval=timestamp('01 Jan 2022 00:00'), inline="b_1", title='Start',group="Backtest Date Range")
i_endTime = input(defval=timestamp('01 Jan 2029 00:00'), inline="b_1", title='End',group="Backtest Date Range")
inDateRange = true

message_long_entry = input.string(title='Alert Msg: LONG Entry', defval ='', group='Alert Message')
message_short_entry = input.string(title='Alert Msg: SHORT Entry', defval='', group='Alert Message')
message_long_exit = input.string(title='Alert Msg: LONG SL/TP', defval='', group='Alert Message')
message_short_exit = input.string(title='Alert Msg: SHORT SL/TP', defval='', group='Alert Message')  

//CALCS
threeHigherLows() =>
    low[0] >= low[1] and low[1] >= low[2]

threeLowerHighs() =>
    high[2] >= high[1] and high[1] >= high[0]

breakHigher() =>
    padding = timeframe.isintraday ? .02 : .1
    high >= high[1] + padding

breakLower() =>
    padding = timeframe.isintraday ? .02 : .1
    low <= low[1] - padding

lh3 = threeLowerHighs() and lh3On
lh3bh = lh3[1] and breakHigher() and lh3On

hl3 = threeHigherLows() and hl3On
hl3bl = hl3[1] and breakLower() and hl3On

ema8 = ta.ema(close, 8)
ema21 = ta.ema(close, 21)

//VARS
var float longStop = na, var float longTp = na
var float shortStop = na, var float shortTp = na

//CONDS
isUptrend = ema8 >= ema21
isDowntrend = ema8 <= ema21
trendChanging = ta.cross(ema8, ema21)

buySignal = lh3bh and lh3[2] and lh3[3] and isUptrend and timeframe.isintraday
sellSignal = hl3bl and hl3[2] and hl3[3] and isDowntrend and timeframe.isintraday

goingDown = hl3 and isDowntrend and timeframe.isintraday
goingUp = lh3 and isUptrend and timeframe.isintraday

projectXBuy = trendChanging and isUptrend
projectXSell = trendChanging and isDowntrend

longCond = trendChanging and isUptrend and assistantOn
shortCond = trendChanging and isDowntrend and assistantOn

//STRATEGY
if shortCond and strategy.position_size > 0 and barstate.isconfirmed
    strategy.close('Long', comment='CLOSE LONG', alert_message=message_long_exit)

if longCond and strategy.position_size < 0 and barstate.isconfirmed
    strategy.close('Short', comment='CLOSE SHORT', alert_message=message_short_exit) 

if longCond and strategy.position_size <= 0 and barstate.isconfirmed and inDateRange
    longStop := close * (1 - stopPerc)
    longTp := close * (1 + tpPerc)
    strategy.entry('Long', strategy.long, comment='LONG', alert_message=message_long_entry)
    strategy.exit('Long Exit', 'Long', comment_loss="SL LONG", comment_profit = "TP LONG", stop=longStop, limit=longTp, alert_message=message_long_exit)

if shortCond and strategy.position_size >= 0 and barstate.isconfirmed and inDateRange
    shortStop := close * (1 + stopPerc)
    shortTp := close * (1 - tpPerc)
    strategy.entry('Short', strategy.short, comment='SHORT', alert_message=message_short_entry)
    strategy.exit('Short Exit', 'Short', comment_loss="SL SHORT", comment_profit="TP SHORT", stop=shortStop, limit=shortTp, alert_message=message_short_exit)

//PLOTS
plotshape(longCond, style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.small, text='Buy')
plotshape(shortCond, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.small, text='Sell')
plotchar(trendChanging and isUptrend and close < open and assistantOn, char='!', location=location.abovebar, color=color.new(color.green, 0), size=size.small)

aa = plot(ema8, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(ema21, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.new(color.green,90) : color.new(color.red,90))
buyZone = isUptrend and lh3 and high < ema21 and timeframe.isintraday
sellZone = isDowntrend and hl3 and low > ema21 and timeframe.isintraday

L1 = plot(showRiskReward and strategy.position_size > 0 ? strategy.position_avg_price : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long Entry Price')
L2 = plot(showRiskReward and strategy.position_size > 0 ? longTp : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long TP Price')
L3 = plot(showRiskReward and strategy.position_size > 0 ? longStop : na, color=color.new(color.red, 0), linewidth=1, style=plot.style_linebr, title='Long Stop Price')

S1 = plot(showRiskReward and strategy.position_size < 0 ? strategy.position_avg_price : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short Entry Price')
S2 = plot(showRiskReward and strategy.position_size < 0 ? shortTp : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short TP Price')
S3 = plot(showRiskReward and strategy.position_size < 0 ? shortStop : na, color=color.new(color.maroon, 0), linewidth=1, style=plot.style_linebr, title='Short Stop Price')

fill(L1, L2, color=color.new(color.green, 90))
fill(L1, L3, color=color.new(color.red, 90))
fill(S1, S2, color=color.new(color.teal, 90))
fill(S1, S3, color=color.new(color.maroon, 90))

bgcolor(inDateRange == false ? color.new(color.red,90) : na, title="Backtest Off-Range")