Momentum-Handel mit doppeltem gleitenden Durchschnittscrossover

Schriftsteller:ChaoZhang, Datum: 2024-04-01 11:53:14
Tags:

img

Übersicht

Diese Strategie verwendet die 8-Perioden- und 21-Perioden-Exponential Moving Averages (EMA), um Veränderungen in den Markttrends zu identifizieren. Ein Kaufsignal wird erzeugt, wenn die kurzfristige EMA von unten über die längerfristige EMA überschreitet, während ein Verkaufssignal erzeugt wird, wenn die kurzfristige EMA von oben unter die längerfristige EMA überschreitet. Die Strategie beinhaltet auch drei aufeinanderfolgende Höhere Tiefststände (HLs) und drei aufeinanderfolgende niedrigere Höhen (LHs) als weitere Bestätigung von Trendumkehrungen. Zusätzlich sind Stop-Loss- und Take-Profit-Level eingestellt, um Risiken zu managen und Gewinne zu erzielen.

Strategieprinzipien

  1. Berechnen Sie die EMA für 8 und 21 Perioden, um die primäre Trendrichtung zu ermitteln.
  2. Identifizieren Sie drei aufeinanderfolgende Höhere Tiefststände (HLs) und drei aufeinanderfolgende niedrigere Höchststände (LHs) als frühe Signale für eine mögliche Trendumkehrung.
  3. Erstellen eines Kaufsignals, wenn die 8-Perioden-EMA über die 21-Perioden-EMA geht und ein HL-Ausbruch eintritt; erstellen eines Verkaufssignals, wenn die 8-Perioden-EMA unter die 21-Perioden-EMA geht und ein LH-Ausbruch eintritt.
  4. Stellen Sie den Stop-Loss-Level auf 5% des Einstiegspreises und den Take-Profit-Level auf 16% des Einstiegspreises fest, um das Risiko zu managen und die Gewinne zu sichern.
  5. Schließen Sie die Position und öffnen Sie eine Umkehrposition, wenn ein gegenteiliges Signal angezeigt wird.

Strategische Vorteile

  1. Kombiniert EMAs und Preisbewegungsmuster (HLs und LHs), um Trends zu bestätigen und die Signalzuverlässigkeit zu verbessern.
  2. Festlegt klare Stop-Loss- und Take-Profit-Niveaus, die dazu beitragen, Risiken zu managen und Gewinne zu erzielen.
  3. Anwendbar für mehrere Zeitrahmen und verschiedene Märkte und bietet eine gewisse Vielseitigkeit.
  4. Klare Logik, leicht zu verstehen und umzusetzen.

Strategische Risiken

  1. In unruhigen Märkten können häufige Crossovers zu mehreren falschen Signalen führen, die zu Verlusten führen.
  2. Festgelegte Stop-Loss- und Take-Profit-Level können sich möglicherweise nicht gut an unterschiedliche Marktbedingungen anpassen, was zu potenziellen Opportunitätskosten oder größeren Verlusten führt.
  3. Die Strategie stützt sich auf historische Daten und kann sich möglicherweise nicht gut an plötzliche Ereignisse oder grundlegende Veränderungen anpassen.

Strategieoptimierungsrichtlinien

  1. Einführung anpassungsfähiger Stop-Loss- und Take-Profit-Mechanismen, z. B. Anpassung der Niveaus auf der Grundlage der Volatilität (z. B. ATR), um sich besser an unterschiedliche Marktbedingungen anzupassen.
  2. Einbeziehung anderer Indikatoren oder Faktoren wie Volumen, Relative Strength Index (RSI) usw., um Signale weiter zu filtern und die Zuverlässigkeit zu verbessern.
  3. Optimieren von Parametern (z. B. EMA-Perioden, Stop-Loss- und Take-Profit-Prozentsätze), um die am besten funktionierende Kombination für bestimmte Märkte oder Instrumente zu finden.
  4. Überlegen Sie, Risikomanagementmaßnahmen wie die Positionsgröße einzuführen, um die Risikoposition einzelner Geschäfte zu kontrollieren.

Zusammenfassung

Diese Strategie nutzt die Überschneidung von 8-Perioden- und 21-Perioden-EMAs, kombiniert mit HL- und LH-Preismustern, um Trendumkehrungen zu identifizieren und Handelssignale zu generieren. Klare Stop-Loss- und Take-Profit-Regeln helfen dabei, Risiken zu managen und Gewinne zu sichern. Die Strategie kann jedoch in unruhigen Märkten falsche Signale generieren und feste Stop-Loss- und Take-Profit-Level können sich möglicherweise nicht gut an unterschiedliche Marktbedingungen anpassen. Um sich weiter zu verbessern, sollten Sie adaptive Stop-Loss und Take-Profit einführen, andere Indikatoren einbeziehen, Parameter optimieren und Risikomanagementmaßnahmen einführen. Insgesamt bietet die Strategie einen Rahmen für Dynamik und Trend-nachfolgendem Handel, erfordert jedoch Anpassungen und Optimierungen auf der Grundlage spezifischer Märkte und individueller Präferenzen.


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


Mehr