Die Dual EMA Crossover Trend Tracking Strategie ist eine quantitative Handelsstrategie, die zwei EMA-Indikatoren verwendet, um die Kursentwicklungsrichtung zu bestimmen. Diese Strategie berechnet zwei EMA-Indikatoren mit unterschiedlichen Parametern und kombiniert golden cross und dead cross Signale, um den Kurstrend zu beurteilen. Sie erzeugt ein Kaufsignal, wenn die kürzere Periode EMA über die längere Periode EMA überschreitet, und ein Verkaufssignal, wenn die kürzere Periode EMA unter die längere Periode EMA überschreitet.
Die Kernindikatoren dieser Strategie sind zwei Sätze von EMAs, darunter ein längerer Zyklus EMA1 und ein kürzerer Zyklus EMA2. Der EMA1-Parameter ist 21 und der EMA2-Parameter ist 10. Die Strategie berechnet diese beiden EMAs auf der Grundlage des 4-Stunden-Zyklus.
Um fehlerhafte Signale zu filtern, setzt die Strategie zwei Sätze von goldenen Kreuz- und toten Kreuz-Indikatoren.
Die doppelte EMA-Struktur kann Veränderungen der kurz- und mittelfristigen Trends effektiv erfassen, um Trends zu bestimmen.
Durch die zusätzliche Filterung von zwei Sätzen von Golden Cross- und Dead Cross-Indikatoren können fehlerhafte Signale reduziert und unnötige Transaktionen durch Preisschwankungen vermieden werden.
Die Verwendung von 4-Stunden-Levels zur Berechnung von Indikatoren kann bei hochfrequenten Kursschwankungen bewältigt werden.
Die Strategiestruktur ist einfach und klar, leicht zu verstehen und umzusetzen und für quantitative Handelsanwendungen geeignet.
Die doppelte EMA-Struktur ist bei der Beurteilung von Konsolidierungsmärkten weniger wirksam.
Die 4-Stunden-Level-Indikatoren sind nicht empfindlich genug, um auf plötzliche Ereignisse zu reagieren.
Die Strategie stützt sich ausschließlich auf technische Indikatoren, ohne die Fundamentalanalyse zu kombinieren.
Diese Risiken können durch folgende Maßnahmen kontrolliert werden:
Hinzufügen von mehr EMA-Indikatoren für den Zeitzyklus zur Erstellung von Modellkombinationen.
Verwenden Sie Text-Sentiment-Analyse, um große plötzliche Ereignisse zu bestimmen und die Positionen dynamisch anzupassen.
Veränderungen des wirtschaftlichen Umfelds, der Politik und der Grundlagen des Unternehmens zu verknüpfen, um die Parameter dynamisch anzupassen.
Die Strategie kann weiter optimiert werden:
Hinzufügen von Modellkombinationen: Es können weitere Indikatorenkombinationen mit unterschiedlichen Parametern erstellt werden, um die Stabilität der Strategie zu verbessern.
Hinzufügen von Stop-Loss-Mechanismen.
Dynamische Parameteroptimierung: Die EMA-Parameter können automatisch anhand verschiedener Marktumgebungen optimiert werden.
Einbeziehung von Techniken des maschinellen Lernens. Modelle wie Tensorflow können trainiert werden, um Preistrends in Echtzeit zu kategorisieren.
/*backtest start: 2023-02-22 00:00:00 end: 2024-02-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 /// Component Code Startt testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(01, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2020, "Backtest Stop Year") testStopMonth = input(1, "Backtest Stop Month") testStopDay = input(1, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) // A switch to control background coloring of the test period testPeriodBackground = input(title="Color Background?", type=bool, defval=false) testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=97) testPeriod() => true // Component Code Stop strategy(title="Ema cross strat", overlay=true) margin = input(true, title="Margin?") Margin = margin ? margin : false resCustom = input(title="EMA Timeframe", defval="240" ) source = close, len2 = input(21, minval=1, title="EMA1") len3 = input(10, minval=1, title="EMA2") ema2 = request.security(syminfo.tickerid,resCustom,ema(source,len2), lookahead=barmerge.lookahead_off) ema3 = request.security(syminfo.tickerid,resCustom,ema(source,len3), lookahead=barmerge.lookahead_off) mylong = crossover(ema3, ema2) myshort = crossunder(ema3,ema2) last_long = na last_short = na last_long := mylong ? time : nz(last_long[1]) last_short := myshort ? time : nz(last_short[1]) in_long = last_long > last_short ? 2 : 0 in_short = last_short > last_long ? 2 : 0 mylong2 = crossover(ema3, ema2) myshort2 = crossunder(ema3, ema2) last_long2 = na last_short2 = na last_long2 := mylong2 ? time : nz(last_long2[1]) last_short2 := myshort2 ? time : nz(last_short2[1]) in_long2 = last_long2 > last_short2 ? 0 : 0 in_short2 = last_short2 > last_long2 ? 0 : 0 condlongx = in_long + in_long2 condlong = crossover(condlongx, 1.9) condlongclose = crossunder(condlongx, 1.9) condshortx = in_short + in_short2 condshort = crossover(condshortx, 1.9) condshortclose = crossover(condshortx, 1.9) if crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0 strategy.entry("Long", strategy.long, comment="Long") if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size > 0 strategy.close("Long",when = not Margin) if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0 strategy.entry("Short", strategy.short, comment="Short", when = Margin)