Momentum-Trading-Strategie für den gleitenden Durchschnitt


Erstellungsdatum: 2024-01-24 11:09:58 zuletzt geändert: 2024-01-24 11:09:58
Kopie: 0 Klicks: 614
1
konzentrieren Sie sich auf
1617
Anhänger

Momentum-Trading-Strategie für den gleitenden Durchschnitt

Überblick

Die Strategie basiert auf der Kreuzung von schnellen und langsamen Moving Averages, um Markttrends und Kauf- und Verkaufspunkte zu beurteilen. Wenn die schnelle EMA die langsame EMA durchbricht, wird der Markt als aufsteigender Trend beurteilt und ein Kaufsignal erzeugt. Wenn die schnelle EMA die langsame EMA durchbricht, wird der Markt als fallender Trend beurteilt und ein Verkaufssignal erzeugt.

Strategieprinzip

Die Strategie nutzt eine Kreuzung aus schnellen EMAs (die 8-Tage-Linie) und langsamen EMAs (die 21-Tage-Linie), um Markttrends zu beurteilen. Die spezifische Logik ist:

  1. Berechnen Sie die 8-Tage- und 21-Tage-EMA
  2. Als die 8. EMA die 21. EMA übertrug, wurde dies als Marktwende beurteilt und der Aufwärtstrend begann.
  3. Als der 8. EMA den 21. EMA durchschreitet, wird er als Marktwende bezeichnet und der Abwärtstrend beginnt.
  4. Bei einem Aufwärtstrend erzeugt es ein Kaufsignal; bei einem Abwärtstrend erzeugt es ein Verkaufssignal
  5. Setzen Sie Stop-Loss- und Stop-Stop-Preise, um das Risiko für jeden Auftrag zu verwalten

Die Strategie kombiniert Dynamometer und Trendanalyse, um die Richtung und Wendepunkte des Marktes effektiv zu erfassen. Schnelle EMA-Kreuzungen und die Kombination mit glatten Moving Averages filtern einige der lauten Handelssignale aus.

Analyse der Stärken

Diese Strategie hat folgende Vorteile:

  1. Schnelle EMA und langsame EMA-Kreuzungen sind ein guter Indikator für Markttrends und Kauf- und Verkaufspunkte
  2. Strategieparameter können optimiert werden, EMA-Zyklen können weiter angepasst werden
  3. Kombination mit Dynamometern, um Geräuschsignale effektiv zu filtern
  4. Setup von Stop Loss Stop Logic, um Risiken aktiv zu steuern

Insgesamt ist die Strategie eine Kombination aus Trend- und Dynamikindikatoren, die sich durch Parameteranpassung an unterschiedliche Marktumgebungen anpasst und eine relativ flexible Short-Line-Handelsstrategie darstellt.

Risikoanalyse

Die Strategie birgt auch Risiken:

  1. In einem wackligen Markt sind EMA-Kreuzungen häufig und führen zu mehr Fehlhandlungen.
  2. Unmöglichkeit, eine Lücke in der Luft effektiv zu behandeln
  3. Es ist nicht möglich, die langfristigen Trends auf der großen Ebene zu berücksichtigen.

Wir können Optimierungen für diese Risiken in folgenden Bereichen vornehmen:

  1. Hinzufügen von Filtern für andere Indikatoren wie Brinband, KDJ usw. zur Verringerung der Wahrscheinlichkeit eines Fehlsignals
  2. Langfristige Trends in Kombination mit größeren, zyklischen Indikatoren
  3. Optimierung der Parameter und Anpassung der EMA-Länge an unterschiedliche Marktbedingungen
  4. Handlungsintervention, um eine Lücke zu vermeiden, die zu massiven Verlusten führt, die über die Schadensbegrenzung hinausgehen

Optimierungsrichtung

Es gibt noch viel Optimierungsmöglichkeiten für diese Strategie, und zwar in folgenden Richtungen:

  1. Optimierung der EMA-Zyklusparameter und Test der Rendite verschiedener Parameter auf historischen Daten
  2. Hinzufügen von Filter für andere technische Kennzahlen, wie KDJ, MACD, etc., um die Strategie-Genauigkeit zu verbessern
  3. Optimierung der Stop-Loss-Stopp-Einstellungen, um sie besser auf die jeweiligen Situationen abzustimmen
  4. Automatische Optimierung von Parametern durch maschinelle Lernmethoden

Diese Optimierungsmaßnahmen können die Stabilität, Anpassungsfähigkeit und Profitabilität der Strategie erheblich verbessern.

Zusammenfassen

Diese Strategie ist insgesamt eine typische Kurzlinie-Handelsstrategie, die auf Trendfolgen und Dynamikindikatoren basiert. Sie kombiniert EMA-Schnell-Schnell-Linien-Kreuzungen und Stop-Loss-Stopp-Logik, um schnell marktorientierte Chancen zu erfassen. Die Strategie hat viel Optimierungsraum, wenn weitere Hilfsindikatoren, automatische Parameteroptimierung und andere Mittel eingeführt werden.

Strategiequellcode
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
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/
// © TradersPostInc

//@version=5
strategy('TradersPost Example MOMO Strategy', overlay=true)

startTime = input(defval = timestamp('01 Jan 2021 00:00 +0000'), title = 'Start Time', group = 'Date Range')
endTime = input(defval = timestamp('31 Dec 2023 23:59 +0000'), title = 'End Time', group = 'Date Range')
timeCondition = true
timeConditionEnd = timeCondition[1] and not timeCondition

fastEmaLength = input.int(defval = 8, title = 'Fast EMA Length')
slowEmaLength = input.int(defval = 21, title = 'Slow EMA Length')
sides = input.string(defval = 'Both', title = 'Sides', options = ['Long', 'Short', 'Both', 'None'])

fastEma = ta.ema(close, fastEmaLength)
slowEma = ta.ema(close, slowEmaLength)

isUptrend = fastEma >= slowEma
isDowntrend = fastEma <= slowEma
trendChanging = ta.cross(fastEma, slowEma)

ema105 = request.security(syminfo.tickerid, '30', ta.ema(close, 105)[1], barmerge.gaps_off, barmerge.lookahead_on)
ema205 = request.security(syminfo.tickerid, '30', ta.ema(close, 20)[1], barmerge.gaps_off, barmerge.lookahead_on)
plot(ema105, linewidth=4, color=color.new(color.purple, 0), editable=true)
plot(ema205, linewidth=2, color=color.new(color.purple, 0), editable=true)

aa = plot(fastEma, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(slowEma, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.green : color.red, transp=90)

tradersPostBuy = trendChanging and isUptrend and timeCondition
tradersPostSell = trendChanging and isDowntrend and timeCondition

pips = syminfo.pointvalue / syminfo.mintick

percentOrPipsInput = input.string('Percent', title='Percent or Pips', options=['Percent', 'Pips'])

stopLossLongInput = input.float(defval=0, step=0.01, title='Stop Loss Long', minval=0)
stopLossShortInput = input.float(defval=0, step=0.01, title='Stop Loss Short', minval=0)

takeProfitLongInput = input.float(defval=0, step=0.01, title='Target Profit Long', minval=0)
takeProfitShortInput = input.float(defval=0, step=0.01, title='Target Profit Short', minval=0)

stopLossPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (stopLossLongInput / 100) * pips
stopLossPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (stopLossShortInput / 100) * pips

takeProfitPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (takeProfitLongInput / 100) * pips
takeProfitPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (takeProfitShortInput / 100) * pips

takeProfitALong = takeProfitLongInput > 0 ? takeProfitLongInput : na
takeProfitBLong = takeProfitPriceLong > 0 ? takeProfitPriceLong : na

takeProfitAShort = takeProfitShortInput > 0 ? takeProfitShortInput : na
takeProfitBShort = takeProfitPriceShort > 0 ? takeProfitPriceShort : na

stopLossALong = stopLossLongInput > 0 ? stopLossLongInput : na
stopLossBLong = stopLossPriceLong > 0 ? stopLossPriceLong : na

stopLossAShort = stopLossShortInput > 0 ? stopLossShortInput : na
stopLossBShort = stopLossPriceShort > 0 ? stopLossPriceShort : na

takeProfitLong = percentOrPipsInput == 'Pips' ? takeProfitALong : takeProfitBLong
stopLossLong = percentOrPipsInput == 'Pips' ? stopLossALong : stopLossBLong
takeProfitShort = percentOrPipsInput == 'Pips' ? takeProfitAShort : takeProfitBShort
stopLossShort = percentOrPipsInput == 'Pips' ? stopLossAShort : stopLossBShort

buyAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "buy", "price": ' + str.tostring(close) + '}'
sellAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "sell", "price": ' + str.tostring(close) + '}'

exitLongAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'
exitShortAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'

if (sides != "None")
    if tradersPostBuy
        strategy.entry('Long', strategy.long, when = sides != 'Short', alert_message = buyAlertMessage)
        strategy.close('Short', when = sides == "Short" and timeCondition, alert_message = exitShortAlertMessage)

    if tradersPostSell
        strategy.entry('Short', strategy.short, when = sides != 'Long', alert_message = sellAlertMessage)
        strategy.close('Long', when = sides == 'Long', alert_message = exitLongAlertMessage)

exitAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit"}'

strategy.exit('Exit Long', from_entry = "Long", profit = takeProfitLong, loss = stopLossLong, alert_message = exitAlertMessage)
strategy.exit('Exit Short', from_entry = "Short", profit = takeProfitShort, loss = stopLossShort, alert_message = exitAlertMessage)

strategy.close_all(when = timeConditionEnd)