Die Dual Moving Average Trend Tracking Strategie ist eine quantitative Handelsstrategie, die die Kursentwicklung von Aktien verfolgt.
Diese Strategie basiert hauptsächlich auf dem doppelten exponentiellen gleitenden Durchschnittssystem, um die Richtung des Kurstrends zu bestimmen. Die Strategie verwendet zwei schnelle und langsame EMAs mit unterschiedlichen Parametern, die schnelle EMA1 reagiert schneller auf Preisänderungen und die langsame EMA2 reagiert langsamer auf Preisänderungen. Wenn die schnelle Linie über die langsame Linie überschreitet, ist dies ein Kaufsignal, das anzeigt, dass der Preis zu steigen begonnen hat; wenn die schnelle Linie unterhalb der langsamen Linie überschreitet, ist dies ein Verkaufssignal, das anzeigt, dass der Preis zu fallen begonnen hat.
Darüber hinaus führt die Strategie auch den ADX-Indikator ein, um die Stärke des Trends zu beurteilen. ADX berechnet Preisschwankungen, um die Stärke des Trends zu beurteilen. Wenn ADX steigt, bedeutet dies, dass der Trend stärker wird; wenn ADX fällt, bedeutet dies, dass der Trend schwächer wird. Die Strategie legt die Handelsfilterbedingungen durch den ADX-Indikator fest und gibt nur Handelssignale aus, wenn die Trendstärke relativ stark ist.
Insbesondere sind die Regeln für die Erzeugung von Signalen in der Strategie:
Dies kann ungültige Signale mit einer schwächeren Trendstärke effektiv filtern und die Stabilität des Handelssystems weiter verbessern.
Diese Strategie hat folgende Hauptvorteile:
Erfasst mittel- bis langfristige Preisentwicklungen: Das duale EMA-System kann die mittelfristigen bis langfristigen Preisentwicklungen effektiv bestimmen und die Beeinträchtigung durch kurzfristigen Marktlärm vermeiden.
Falsche Ausbrüche filtern: Durch die Beurteilung der Trendstärke durch den ADX-Indikator werden unnötige Verluste durch falsche Ausbrüche um Trendwendepunkte vermieden.
Großer Parameteroptimierungsraum: Schnelle und langsame Linienparameter, ADX-Parameter und mehr haben Raum für Optimierungen, die durch Parameterkombinationen bessere Handelsergebnisse erzielen können.
Hohe Anpassungsfähigkeit: Diese Strategie ist für die meisten Bestände und Zeitrahmen geeignet und auf verschiedenen Märkten erprobt.
Einfach umzusetzen: Diese Strategie erfordert nur einfache gleitende Durchschnittsindikatoren, verbraucht wenig Ressourcen, ist einfach zu programmieren und hat geringe praktische Anwendungskosten.
Diese Strategie birgt auch einige Risiken, die sich hauptsächlich auf folgende Bereiche konzentrieren:
Trendumkehrrisiko: Jede Trendstrategie kann die Umkehrpunkte des Trends nicht perfekt bestimmen, und sie ist dazu verpflichtet, größere Verluste zu erleiden, wenn sich der reale Trend tatsächlich umkehrt.
Übermäßiges Optimierungsrisiko: Eine extreme Optimierung der Parameter kann auch dazu führen, dass die Strategie zu sehr auf historische Daten angepasst wird, was die Stabilität und praktische Wirkung der Strategie verringert.
Risiko eines Ereignisses des Schwarzen Schwanen: Große unerwartete Ereignisse werden das ursprüngliche Preistrendmodell durchbrechen, wodurch der gleitende Durchschnittsindikator ausfällt und manuelle Intervention oder Stop-Loss-Einstellungen erforderlich sind, um Verluste zu kontrollieren.
Um den oben genannten Risiken entgegenzuwirken, können wir die folgenden Aspekte optimieren:
Einführung zusätzlicher Indikatoren zur Bestimmung von Preiswendepunkten, z. B. Einführung des Handelsvolumens, das sich bei Erscheinen von Preiswendepunkten verstärkt.
Die ADX-Parameter sollten angemessen gelockert werden, um zu gewährleisten, dass Chancen in den frühen Phasen eines Trends genutzt werden können.
Multi-Gruppen-Schulungen und Tests von Parameterkombinationen durchführen und Kombinationen mit guter Stabilität und praktischer Wirkung auswählen, um Risiken einer Überoptimierung einzelner Parametergruppen zu vermeiden.
Es gibt auch einige Richtungen, in denen diese Strategie optimiert werden kann:
Einführung von Stop-Loss-Mechanismen: Setzen Sie einen beweglichen Stop-Loss oder einen prozentualen Stop-Loss, der Verluste aktiv stoppen kann, wenn sich Trends umkehren, um übermäßige Verluste zu vermeiden.
Kombination von Handelsvolumenindikatoren: Zum Beispiel Handelsvolumen, das falsche Signale vermeiden kann, wenn sich das Handelsvolumen bei Preiswendepunkten erweitert.
Parameter selbstadaptive Optimierung: Die Anpassung der Indikatorparameter an Echtzeitmarktveränderungen anstelle von festen statischen Parametern, die die Stabilität der Strategien erheblich verbessern können.
Einführung von maschinellem Lernen: Verwenden Sie maschinelle Lernalgorithmen, um große Mengen historischer Daten zu analysieren, um Parameter für gleitende Durchschnitte und ADX zu bestimmen und sogar zukünftige Kursbewegungen vorherzusagen.
Kreuzzyklusoptimierung: Verschiedene Handelszyklusparameter können unterschiedlich festgelegt werden und die optimale Konfiguration für jeden Zyklus kann getestet werden.
Im Allgemeinen ist die Dual Moving Average Trend Tracking Strategie eine reife und stabile Strategieidee. Diese Strategie erfasst mittelfristige bis langfristige Preistrends durch das duale EMA-System und hat den ADX-Indikator, um Signale zu filtern, die Aktienkurstrends effektiv erfassen und Störungen durch kurzfristigen Marktlärm vermeiden können. Gleichzeitig birgt diese Strategie auch bestimmte Risiken, die die Optimierung von Parameterkombinationen und Stop-Loss-Methoden erfordern, und kann sogar mehr Hilfsindikatoren und maschinelle Lernalgorithmen einführen, um die Strategie-Stabilität zu verbessern. Zusammenfassend hat die Dual Moving Average Trend Tracking Strategie ein gutes Gleichgewicht und ist eine quantitative Strategieidee, die für mittelfristige bis langfristige Anleger geeignet ist.
/*backtest start: 2022-12-14 00:00:00 end: 2023-11-10 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Kitaec Strategy4", shorttitle = "Kitaec str4", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot") len = input(14, defval=14, minval=1, maxval=1000, title="Smoothing") len2 = input(14, defval=14, minval=1, maxval=1000, title="Smoothing2") len3=input(550) src = close ema1=ema(src, len) ema2=ema(ema1, len2) d=ema1-ema2 zlema=ema1+d ema21=ema(src, (len/3)*2) ema22=ema(ema21, (len2/3)*2) d2=ema21-ema22 zlema2=ema21+d2 ema31=ema(src, len3) ema32=ema(ema21, len3) d3=ema31-ema32 zlema3=ema31+d2 fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //MAs //ma1 = security(tickerid, "60", vwma(src, len)[1]) //ma2 = security(tickerid, "120", vwma(src, len)[1]) //plot(ma1, linewidth = 2, color = blue, title = "MA") //plot(ma2, linewidth = 2, color = red, title = "MA2") // ADX lenadx = 14 lensig = 14 limadx = 18 up = change(high) down = -change(low) trur = rma(tr, lenadx) plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, lenadx) / trur) minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, lenadx) / trur) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig) adx2 = ema(adx, 14) adx2i = ema(adx2,14) dadx2 = adx2 - adx2i zladx2 = adx2 + dadx2 plus2 = ema(plus, 14) plus2i = ema (plus2, 14) dplus2 = plus2 - plus2i zlplus2 = plus2 + dplus2 minus2 = ema(minus, 14) minus2i = ema (minus2, 14) dminus2 = minus2 - minus2i zlminus2 = minus2 + dminus2 vwma = vwma(close, 150) vwma2 = ema(vwma, 9) vwma2i = ema(vwma2, 9) dvwma2 = vwma2 - vwma2i zlvwma2 = vwma2 + dvwma2 rmax=rma(src, len) rmax2=rma(rmax, len2) rmd=rmax-rmax2 zlrmax=rmax+rmd rmaxz=rma(src, (len/3)*2) rmaxz2=rma(rmaxz, (len2/3)*2) rmzd=rmaxz-rmaxz2 zlrmaxz=rmaxz+rmzd rmaxcol2=zlrmaxz[1] > zlema2[1] ? red:lime rmaxcol= zlrmax[1] > zlema[1] ? red:lime rmazlema3=rma(zlema3, 100) plot(rmazlema3, color=gray, linewidth=2) plot(zlema, color=green) plot(zlema2, color=yellow) plot(zlema3, color=teal, linewidth=2) plot(ema2, color=na) plot(rmax, color=rmaxcol2, linewidth=3) plot(zlrmax, color=rmaxcol, linewidth=3) //Trading size = strategy.position_size lot = 0.0 lot := size != size[1] ? strategy.equity / close * capital / 100 : lot[1] if zlrmax[1] < zlema[1] strategy.entry("Buy", strategy.long, needlong ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if zlrmax[1] > zlema[1] strategy.entry("Sell", strategy.short, needshort ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))