Doppel exponentieller gleitender Durchschnitt nach der Strategie

Schriftsteller:ChaoZhang, Datum: 2024-02-02 17:11:29
Tags:

img

Übersicht

Die Dual Exponential Moving Average Trend Following Strategy ist eine Trend-following-Strategie, die auf exponentiellen Moving Average (EMA) -Kreuzungen basiert. Sie beurteilt die aktuelle Trendrichtung, indem sie die schnelle EMA-Linie und die langsame EMA-Linie berechnet und auf ihre Kreuzungen reagiert. Wenn die schnelle EMA-Linie über die langsame EMA-Linie überschreitet, wird sie als bullisches Signal bestimmt. Wenn die schnelle EMA-Linie unter die langsame EMA-Linie überschreitet, wird sie als bärisches Signal bestimmt. Basierend auf der identifizierten Trendrichtung kann diese Strategie entsprechend lang oder kurz gehen.

Strategie Logik

Die Kernlogik dieser Strategie besteht darin, zwei EMA-Linien unterschiedlicher Perioden zu berechnen - eine fungiert als Bärenlinie und eine als Bulle. Insbesondere berechnet die Strategie eine 8-Perioden-schnelle EMA-Linie mit dem Talib-Indikator als Bulle. Und sie berechnet eine 21-Perioden-langsamere EMA-Linie als Bärenlinie. Dann beurteilt sie die Kreuzungsbeziehungen zwischen der schnellen EMA-Linie und der langsamen EMA-Linie. Wenn die schnelle Linie über die langsame Linie überschreitet, bestimmt sie ein Bulle-Signal, um lang zu gehen. Wenn die schnelle Linie unter der langsamen Linie überschreitet, bestimmt sie ein Bären-Signal, um kurz zu gehen.

In Bezug auf die tatsächliche Handelsausführung kann diese Strategie nur lang gehen, nur kurz gehen oder in beide Richtungen gehen, wenn ein Crossover zwischen schnellen und langsamen Linien stattfindet. Auch Stop-Loss- und Take-Profit-Preise werden in der Strategie konfiguriert. Nach dem Öffnen von Positionen, wenn der Preis in ungünstige Richtung geht, wird Stop-Loss zu Exit-Positionen ausgelöst. Wenn der Preis das erwartete Zielniveau erreicht, wird Take-Profit realisiert und Positionen geschlossen.

Analyse der Vorteile

Der größte Vorteil der Dual EMA Trend Following Strategie liegt in der leistungsstarken Trendidentifizierungsfähigkeit von gleitenden Durchschnittsquerschnitten. Als allgemeines Werkzeug für die Trendanalyse können EMA-Linien Trendverschiebungen und Wendepunkte durch Querschnitte identifizieren, so dass sie nicht kurzfristig von Marktgeräuschen irregeführt werden und die Haupttrendrichtung erfassen.

Die flexiblen Einstellungen der Handelsrichtungen machen die Strategie sowohl an einseitige Trends als auch an zweiseitige Schwankungen anpassungsfähig, wodurch die Anwendbarkeit der Strategie erhöht wird.

Risikoanalyse

Das größte Risiko dieser Strategie sind die falschen Signale, die durch häufige kleine Crossovers unter Range-bound-Märkten ausgelöst werden. Dies würde zu übermäßigen Positionsöffnungen und Verlusten führen. Um dies zu bekämpfen, können wir EMA-Perioden verlängern, um Crossover-Zeiten und falsche Signalwahrscheinlichkeiten zu reduzieren.

Auf der anderen Seite erhöht eine zu enge Stop-Loss-Einstellung auch die Wahrscheinlichkeit, dass man gestoppt wird.

Optimierungsrichtlinien

Diese Strategie kann in folgenden Bereichen weiter optimiert werden:

  1. Adaptive Anpassung an EMA-Perioden auf der Grundlage von Marktvolatilität und Rückprüfungsergebnissen, um eine Überanpassung in festen Perioden zu vermeiden.

  2. Hinzufügen von Filterbedingungen, um falsche Signale auszufiltern, z. B. Kombination mit Handelsvolumen, um unbedeutende Crossovers zu filtern; oder Kombination anderer Indikatoren wie MACD und KDJ, um Signale in Unsicherheit zu vermeiden.

  3. Optimierung von Stop-Loss- und Take-Profit-Strategien, z. B. Kombination von ATR, um dynamisches Trailing auf SL/TP zu realisieren und zu enge SL und vorzeitige TP zu verhindern.

  4. Verschiedene Haltezeiten testen. Zu lange Haltezeiten können von Vorfällen beeinflusst werden, während zu kurze Perioden zu hohen Handelskosten und Schlupfkosten führen.

Zusammenfassung

Im Allgemeinen ist die Dual EMA Trend Following Strategie ein robustes und praktisches Trendhandelssystem. Sie fängt Trendrichtungen effektiv durch das EMA-Crossover-System ein. In der Zwischenzeit machen die flexiblen Einstellungen an Handelsrichtungen sie anpassungsfähig; die konfigurierte Stop-Loss- und Take-Profit-Kontrollerisiken. Mit weiteren Optimierungen und Verbesserungen kann diese Strategie zu einem leistungsstarken Werkzeug für den quantitativen Handel werden.


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

Mehr