Die Dual EMA Crossover Oscillation Tracking Strategie ist eine Strategie, die Trends mithilfe des EMA-Indikators identifiziert und Schwankungen bei volatilen Marktbedingungen verfolgt.
Diese Strategie verwendet die 20-Perioden-EMA als Indikator zur Beurteilung von Trends. Wenn der Preis über die EMA geht, signalisiert er einen Aufwärtstrend, und wenn der Preis darunter geht, signalisiert er einen Abwärtstrend.
Wenn der Preis über die EMA geht, wird eine Long-Position eingegeben, wobei der höchste Preis in den letzten 20 Perioden als Take-Profit und der niedrigste Tief seit dem Crossover als Stop-Loss verwendet wird.
Gleichzeitig prüft die Strategie auch, ob der ADX über 30 liegt. Trades werden nur getätigt, wenn der Trend stark genug ist, d.h. wenn der ADX über 30 liegt.
Während offener Trades ändert sich der Trailing Stop weiterhin anhand der Marktbedingungen, um mehr Gewinne zu erzielen.
Diese Strategie kombiniert die Vorteile des Trend-Tracking und des Oszillationshandels. Sie kann höhere Renditen während der Trending-Märkte und konsistente Renditen während der Oszillationen erzielen.
Durch die Verwendung von EMA werden die Parameter auch einfach gehalten, wodurch die Risiken einer Überoptimierung verringert und die Stabilität gewährleistet wird.
Das Hauptrisiko dieser Strategie besteht in der Möglichkeit häufigerer Stop-Outs während intensiverer Schwankungen. Hier kommt der ADX ins Spiel. Durch das Deaktivieren des Handels, wenn der ADX niedrig ist, können Verluste in Abwesenheit eines klaren Trends vermieden werden.
Darüber hinaus ist die richtige Stop-Loss-Platzierung ebenfalls entscheidend. Übermäßig breite Stops können den Betrag eines einzelnen Handelsverlustes erhöhen. Übermäßig enge Stops können zu empfindlich sein und die Stop-Out-Wahrscheinlichkeit erhöhen. Es muss ein Gleichgewicht zwischen Gewinnzielen und Stop-Loss-Risiken gefunden werden.
Die möglichen Optimierungen für diese Strategie sind:
Ich teste mehr EMA-Perioden, um die optimale Kombination zu finden.
Optimierung der ADX-Parameter einschließlich der ADX-Periode und der Schwellenwerte.
Verbesserung der Algorithmen für die Gewinn- und Stop-Loss-Anwendung, beispielsweise durch Einführung dynamischer Stops.
Zusätzliche Indikatoren wie KDJ und MACD werden kombiniert, um ein Mehrindikator-Bestätigungssystem zu schaffen.
Zusammenfassend ist die Dual EMA Crossover Oscillation Tracking Strategie eine sehr praktische Strategie. Sie kombiniert die Stärken beider Trend- und Oszillationsstrategien. Sie kann sowohl für den langfristigen Tracking als auch für den kurzfristigen Handel verwendet werden. Weitere Leistungsverbesserungen können durch Parameteroptimierung und Hinzufügen von Bestätigungsindikatoren erzielt werden. Sie eignet sich für Anleger mit einem gewissen Grad an analytischen Fähigkeiten in Bezug auf die Marktbedingungen.
/*backtest start: 2023-12-26 00:00:00 end: 2024-01-02 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("Linda Raschke's Holy Grail", shorttitle="RHG", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, overlay = true) adxlen = input(14, title="ADX period") adxMin = input(30) dilen = adxlen f_highest(_src, _length)=> _adjusted_length = _length < 1 ? 1 : _length _value = _src for _i = 0 to (_adjusted_length-1) _value := _src[_i] >= _value ? _src[_i] : _value _return = _value f_lowest(_src, _length)=> _adjusted_length = _length < 1 ? 1 : _length _value = _src for _i = 0 to (_adjusted_length-1) _value := _src[_i] <= _value ? _src[_i] : _value _return = _value dirmov(len) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(tr, len) plus = fixnan(100 * rma(plusDM, len) / truerange) minus = fixnan(100 * rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) emaLength = input(20) curEma = ema(close, emaLength) highPeriod = input(20) d = na takeProfitLong = highest(high, highPeriod) stopLossLong = f_lowest(low, barssince(low >= curEma)) if strategy.position_size == 0 if adx(dilen, adxlen) <= adxMin or high < curEma strategy.cancel("Long") if adx(dilen, adxlen) > adxMin and low < curEma and high > curEma and curEma > curEma[highPeriod / 2] and curEma > curEma[highPeriod] and takeProfitLong > high strategy.order("Long", strategy.long, stop = high) strategy.exit("Exit", "Long", limit = takeProfitLong, stop = stopLossLong) d := high takeProfitShort = lowest(low, highPeriod) stopLossShort = f_highest(high, barssince(high <= curEma)) if strategy.position_size == 0 if adx(dilen, adxlen) <= adxMin or low > curEma strategy.cancel("Short") if adx(dilen, adxlen) > adxMin and high > curEma and low < curEma and curEma < curEma[highPeriod / 2] and curEma < curEma[highPeriod] and takeProfitShort < low strategy.order("Short", strategy.short, stop = low) strategy.exit("Exit", "Short", limit = takeProfitShort, stop = stopLossShort) d := low strategy.close("Exit") plot(d == high ? stopLossLong : d == low ? stopLossShort : na, style = circles, linewidth = 4, color = red) plot(d == high ? takeProfitLong : d == low ? takeProfitShort : na, style = circles, linewidth = 4, color = green) plot(d, style = circles, linewidth = 4, color = yellow) plot(curEma, color = black, linewidth = 2) // === Backtesting Dates === testPeriodSwitch = input(false, "Custom Backtesting Dates") testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(3, "Backtest Start Month") testStartDay = input(6, "Backtest Start Day") testStartHour = input(08, "Backtest Start Hour") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0) testStopYear = input(2018, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(14, "Backtest Stop Day") testStopHour = input(14, "Backtest Stop Hour") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false isPeriod = testPeriodSwitch == true ? testPeriod() : true // === /END if not isPeriod strategy.cancel_all() strategy.close_all()