Doppelte EMA-Strategie zur Verfolgung des gleitenden Durchschnitts


Erstellungsdatum: 2024-02-02 17:11:29 zuletzt geändert: 2024-02-02 17:11:29
Kopie: 0 Klicks: 575
1
konzentrieren Sie sich auf
1617
Anhänger

Doppelte EMA-Strategie zur Verfolgung des gleitenden Durchschnitts

Überblick

Die Dual Exponential Moving Average Trend Following Strategy ist eine Trendverfolgungsstrategie, die auf der Kreuzung von Mittellinien basiert. Die Strategie berechnet die aktuelle Trendrichtung durch Berechnung von Schnell- und Langläufigem EMA und ihrer Kreuzung. Wenn die Schnelllinie die Langläufigkeit überschreitet, wird sie als bullish beurteilt; wenn die Schnelllinie die Langläufigkeit überschreitet, wird sie als bullish beurteilt.

Strategieprinzip

Die Kernlogik der Strategie besteht darin, die EMA-Mittelwerte für zwei verschiedene Perioden zu berechnen, eine als leere und eine als mehrsprachige Linie. Konkret berechnet die Strategie über den Talib-Indikator einen 8-Zyklus-schnellen EMA-Mittelwert als mehrsprachige Linie und einen 21-Zyklus-langen EMA-Mittelwert als leere Linie. Dann wird die Kreuzung zwischen der schnellen EMA-Linie und der langsamen EMA-Linie beurteilt.

Die Strategie kann sowohl über als auch unterlegen sein, wenn die Handlung konkret durchgeführt wird. Sie kann auch gleichzeitig in zwei Richtungen handeln, wenn sich schnelle und langsame Linien kreuzen. Darüber hinaus enthält die Strategie einen Stop-Loss- und einen Stop-Price. Nach der Positionseröffnung wird ein Stop-Loss-Exit durchgeführt, wenn der Kurs in eine ungünstige Richtung bewegt.

Analyse der Stärken

Der größte Vorteil der Doppel-EMA-Gleichlinien-Tracking-Strategie besteht darin, dass die EMA-Gleichlinien als ein allgemein verwendetes Trend-Erkennungs-Tool verwendet werden. Durch die Gleichlinien-Kreuzung kann der Trend der Preisänderung und der Umkehrzeit identifiziert werden, um nicht vom Kurzlinien-Marktgeräusch verwirrt zu werden und die Richtung der Trends zu erfassen.

Die Strategie ist außerdem flexibel und kann sowohl auf einseitige Trends eingestellt werden, als auch auf zwei-seitige Gelegenheiten in der Schwankungszone eingesetzt werden. Die Strategie ist außerdem praktisch. Die Stop-Loss-Stop-Strategie ermöglicht eine effektive Risikokontrolle, die einen Teil der Gewinne verriegelt.

Risikoanalyse

Die größte Gefahr bei der doppelten EMA-Linien-Tracking-Strategie besteht darin, dass die häufige Auslösung von Kreuzungen und Falschsignalen durch die Kreuzung von mehreren kleineren Stärken unter schwankenden Bedingungen. Dies führt zu häufigen Positionseröffnungen und Verlusten der Strategie. In diesem Fall kann die EMA-Zyklus angemessen vergrößert werden, um die Häufigkeit von Kreuzungen und die Wahrscheinlichkeit von Falschsignalen zu verringern.

Auf der anderen Seite erhöht die Einstellung eines zu kleinen Stop-Loss-Bereichs die Wahrscheinlichkeit, dass die Strategie getroffen wird. In diesem Fall kann der Stop-Loss-Bereich angemessen erweitert werden, aber auch das Risiko, dass er eingeschränkt wird, muss abgewogen werden.

Optimierungsrichtung

Die Strategie kann in folgenden Bereichen weiter optimiert werden:

  1. Dynamische Anpassung der EMA-Durchschnittsphase. Die EMA-Phasen können dynamisch angepasst werden, um Überpassung unter festen Phasen zu vermeiden.

  2. Zusätzliche Filterbedingungen zum Filtern von Falschsignalen. Zum Beispiel kann die falsche Kreuzung, die bei geringen Schwingungen entsteht, in Verbindung mit dem Handelsvolumen gefiltert werden. Es kann auch mit anderen Indikatoren wie MACD, KDJ usw. kombiniert werden, um zu vermeiden, dass ein Signal zu unbestimmten Zeiten erzeugt wird.

  3. Die Optimierung der Stop-Loss-Strategie in Kombination mit Indikatoren wie ATR ermöglicht die dynamische Verfolgung der Stop-Loss-Strategie.

  4. Verschiedene Haltedauer zu testen. Haltedauer zu lang, leicht von unvorhergesehenen Ereignissen beeinflusst; Haltedauer zu kurz, hohe Transaktionskosten und Slip-Point-Kosten. Finden Sie die optimale Anzahl von Haltetagen, um die Profitabilität der Strategie zu verbessern.

Zusammenfassen

Die Doppel-EMA-Evenline-Tracking-Strategie ist insgesamt eine robuste und praktische Trend-Tracking-Strategie. Sie nutzt die EMA-Evenline-Kreuzung, um die Preisentwicklung zu beurteilen und die Richtung des Marktes effektiv zu erfassen. Die flexible Handelsrichtung der Settings erhöht die Anpassungsfähigkeit der Strategie.

Strategiequellcode
/*backtest
start: 2024-01-02 00:00:00
end: 2024-02-01 00:00:00
period: 2h
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, default_qty_value=100, initial_capital=100000, default_qty_type=strategy.percent_of_equity, pyramiding=0)

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)