Strategie zur Verfolgung der doppelten EMA-Oszillation im Crossover

Schriftsteller:ChaoZhang, Datum: 2024-01-03 11:38:51
Tags:

img

Übersicht

Die Dual EMA Crossover Oscillation Tracking Strategie ist eine Strategie, die Trends mithilfe des EMA-Indikators identifiziert und Schwankungen bei volatilen Marktbedingungen verfolgt.

Strategie Logik

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.

Analyse der Vorteile

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.

Risikoanalyse

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.

Optimierungsrichtlinien

Die möglichen Optimierungen für diese Strategie sind:

  1. Ich teste mehr EMA-Perioden, um die optimale Kombination zu finden.

  2. Optimierung der ADX-Parameter einschließlich der ADX-Periode und der Schwellenwerte.

  3. Verbesserung der Algorithmen für die Gewinn- und Stop-Loss-Anwendung, beispielsweise durch Einführung dynamischer Stops.

  4. Zusätzliche Indikatoren wie KDJ und MACD werden kombiniert, um ein Mehrindikator-Bestätigungssystem zu schaffen.

Zusammenfassung

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()


Mehr