Multi-Timeframe Dynamische EMA-Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-12-12 12:18:41
Tags:

img

Übersicht

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.

Name der Strategie

Multi-Timeframe Dynamische EMA-Handelsstrategie

Strategieprinzip

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.

Analyse der Vorteile

  • Flexibilität bei der Anpassung von Zeitrahmen durch Konfiguration verschiedener EMA
  • Jede EMA kann unabhängig voneinander aktiviert/deaktiviert werden und ist sehr anpassbar
  • Positionen gleichmäßig auf die EMA verteilt, gut für das Risikomanagement
  • Nutzt mehrere EMAs, kann für verschiedene Marktstufen auf geeignete EMAs wechseln
  • Einfache und klare Logik, leicht zu verstehen und zu debuggen

Risikoanalyse

  • Die EMA allein kann die Marktstruktur nicht bestimmen, die anfällig für falsche Signale ist.
  • Whipsaw-Märkte führen zu übermäßigen EMA-Crossovers, steigender Handelshäufigkeit und Verschiebungskosten
  • Notwendigkeit der Optimierung der EMA-Parameter für verschiedene Märkte
  • Möglicherweise benötigen andere Indikatoren zur Bestätigung der Signale

Es ist wichtig, die EMA-Parameter zu optimieren, da sie für verschiedene Märkte abgestimmt werden müssen.

Optimierungsrichtlinien

Die Strategie kann in mehreren Aspekten optimiert werden:

  1. Optimieren Sie die EMA-Parameter durch Parameter-Scan und Walk-Forward-Analyse, um die besten EMA-Kombinationen zu finden.

  2. Zusätzliche Filterbedingungen auf EMA-Kreuzungen, um falsche Signale zu vermeiden, z. B. Volumenfilter, Volatilitätsfilter usw.

  3. Kombination mit anderen Indikatoren wie MACD, KDJ, Bollinger Bands, um die Komplementarität zu nutzen.

  4. Dynamische Anpassung der Positionsdimensionierung auf jeder EMA anhand der Marktvolatilität oder der Trendstärke.

  5. Optimieren Sie die Stop-Loss- und Gewinnniveaus, um das beste Risiko-Rendite-Verhältnis zu erreichen.

Schlussfolgerung

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


Mehr