Die Kernidee dieser Strategie besteht darin, Handelssignale basierend auf dem Crossover von mehreren exponentiellen gleitenden Durchschnitten (EMA) zu generieren. Sie geht lang, wenn die kurzfristige EMA von unten über die langfristige EMA geht, und schließt Positionen, wenn die kurzfristige EMA unter der langfristigen EMA geht. Diese Strategie ermöglicht die Konfiguration mehrerer EMA-Perioden, und jede EMA kann unabhängig aktiviert werden. Die Strategie wird Crossovers auf allen aktivierten EMAs handeln.
Multi-Timeframe Dynamische EMA-Handelsstrategie
Die Strategie legt 8 EMA-Perioden fest - 8 Tage, 13 Tage, 21 Tage, 34 Tage, 55 Tage, 89 Tage, 144 Tage und 233 Tage.
Es erzeugt lange Signale, wenn die kurzfristige EMA von unten über die langfristige EMA überschreitet. Es erzeugt Exitsignale, wenn die kurzfristige EMA von oben unter die langfristige EMA überschreitet. Wenn also zwei EMAs aktiviert sind, ist die kürzere EMA > die längere EMA ein langes Signal, die kürzere EMA < die längere EMA ist ein Exitsignal.
Wenn beispielsweise 55-Tage-EMA und 89-Tage-EMA aktiviert sind, geht die Strategie lang, wenn die 55-Tage-EMA über die 89-Tage-EMA geht, und geht aus, wenn die 55-Tage-EMA unter die 89-Tage-EMA geht. Dies ermöglicht es der Strategie, die verwendeten EMA-Kombinationen dynamisch anzupassen, indem sie von längeren Zeitrahmen auf kürzere oder umgekehrt wechselt.
Die Positionsgröße wird so eingestellt, dass das Eigenkapital geteilt durch close geteilt durch die Anzahl der aktivierten EMAs, um sicherzustellen, dass die Positionsgrößen bei jedem EMA-Crossover gleich sind.
Es ist wichtig, die EMA-Parameter zu optimieren, da sie für verschiedene Märkte abgestimmt werden müssen.
Die Strategie kann in mehreren Aspekten optimiert werden:
Optimieren Sie die EMA-Parameter durch Parameter-Scan und Walk-Forward-Analyse, um die besten EMA-Kombinationen zu finden.
Zusätzliche Filterbedingungen auf EMA-Kreuzungen, um falsche Signale zu vermeiden, z. B. Volumenfilter, Volatilitätsfilter usw.
Kombination mit anderen Indikatoren wie MACD, KDJ, Bollinger Bands, um die Komplementarität zu nutzen.
Dynamische Anpassung der Positionsdimensionierung auf jeder EMA anhand der Marktvolatilität oder der Trendstärke.
Optimieren Sie die Stop-Loss- und Gewinnniveaus, um das beste Risiko-Rendite-Verhältnis zu erreichen.
Insgesamt ist dies eine sehr einfache und unkomplizierte Strategie, die Signale von EMA-Crossovers erzeugt, um kurz- und mittelfristige Trends zu erfassen. Sein Hauptvorteil liegt in der hohen Konfigurationsfähigkeit und Flexibilität, damit Händler die für sie geeigneten EMAs auswählen können. Allerdings kann die EMA alleine leicht falsche Signale geben, was das größte Risiko darstellt. Die Kombination mit anderen Indikatoren und Parameteroptimierung kann zu einer besseren Handelsleistung führen.
/*backtest start: 2023-11-11 00:00:00 end: 2023-12-11 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("EMA Fan", shorttitle = "EMA Fan", overlay=true) // Revision: 1 // Author: @ToS_MavericK buyprice = 0.0 buyprice := buyprice[1] // === INPUT SMA === EMA1 = input(8) EMA2 = input(13) EMA3 = input(21) EMA4 = input(34) EMA5 = input(55) EMA6 = input(89) EMA7 = input(144) EMA8 = input(233) EnableEMA1 = input(true) EnableEMA2 = input(true) EnableEMA3 = input(true) EnableEMA4 = input(true) EnableEMA5 = input(true) EnableEMA6 = input(true) EnableEMA7 = input(true) EnableEMA8 = input(true) //Profit = input(defval = 5, type = integer, title = "Profit", minval = 1, step = 1) //StopLoss = input(defval = 15, type = integer, title = "StopLoss", minval = 1, step = 1) // === INPUT BACKTEST RANGE === FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2018, title = "From Year", minval = 2012) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 2020, title = "To Year", minval = 2012) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true // create function "within window of time" // === SERIES SETUP === vEMA1 = ema(close, EMA1) vEMA2 = ema(close, EMA2) vEMA3 = ema(close, EMA3) vEMA4 = ema(close, EMA4) vEMA5 = ema(close, EMA5) vEMA6 = ema(close, EMA6) vEMA7 = ema(close, EMA7) vEMA8 = ema(close, EMA8) count = -1 if (EnableEMA1 == true) count := count + 1 if (EnableEMA2 == true) count := count + 1 if (EnableEMA3 == true) count := count + 1 if (EnableEMA4 == true) count := count + 1 if (EnableEMA5 == true) count := count + 1 if (EnableEMA6 == true) count := count + 1 if (EnableEMA7 == true) count := count + 1 if (EnableEMA8 == true) count := count + 1 // set position size Amount = 1 / (close * count) // === EXECUTION === strategy.entry("EMA1", strategy.long, qty = Amount, when = window() and crossover(vEMA1,vEMA2) and EnableEMA1 and EnableEMA2) strategy.close("EMA1", time > finish or crossunder(vEMA1,vEMA2)) strategy.entry("EMA2", strategy.long, qty = Amount, when = window() and crossover(vEMA2,vEMA3) and EnableEMA2 and EnableEMA3) strategy.close("EMA2", time > finish or crossunder(vEMA2,vEMA3)) strategy.entry("EMA3", strategy.long, qty = Amount, when = window() and crossover(vEMA3,vEMA4) and EnableEMA3 and EnableEMA4) strategy.close("EMA3", time > finish or crossunder(vEMA3,vEMA4)) strategy.entry("EMA4", strategy.long, qty = Amount, when = window() and crossover(vEMA4,vEMA5) and EnableEMA4 and EnableEMA5) strategy.close("EMA4", time > finish or crossunder(vEMA4,vEMA5)) strategy.entry("EMA5", strategy.long, qty = Amount, when = window() and crossover(vEMA5,vEMA6) and EnableEMA5 and EnableEMA6) strategy.close("EMA5", time > finish or crossunder(vEMA5,vEMA6)) strategy.entry("EMA6", strategy.long, qty = Amount, when = window() and crossover(vEMA6,vEMA7) and EnableEMA6 and EnableEMA7) strategy.close("EMA6", time > finish or crossunder(vEMA6,vEMA7)) strategy.entry("EMA7", strategy.long, qty = Amount, when = window() and crossover(vEMA7,vEMA8) and EnableEMA7 and EnableEMA8) strategy.close("EMA7", time > finish or crossunder(vEMA7,vEMA8)) plot(vEMA1, title = 'EMA1', color = red, linewidth = 2, style = line) // plot FastMA plot(vEMA2, title = 'EMA2', color = orange, linewidth = 2, style = line) // plot SlowMA plot(vEMA3, title = 'EMA3', color = yellow, linewidth = 2, style = line) // plot SlowMA plot(vEMA4, title = 'EMA4', color = green, linewidth = 2, style = line) // plot SlowMA plot(vEMA5, title = 'EMA5', color = teal, linewidth = 2, style = line) // plot SlowMA plot(vEMA6, title = 'EMA6', color = blue, linewidth = 2, style = line) // plot SlowMA plot(vEMA7, title = 'EMA7', color = maroon, linewidth = 2, style = line) // plot SlowMA plot(vEMA8, title = 'EMA8', color = white, linewidth = 2, style = line) // plot SlowMA //plot(long_stop, title = 'High-ATR', color = red, linewidth = 2, style = line) // plot SlowMA //plot(short_stop, title = 'Low+ATR', color = green, linewidth = 2, style = line) // plot SlowMA