Trendfolgestrategie basierend auf dem mehrperiodischen SMA-Indikator


Erstellungsdatum: 2024-02-04 14:50:24 zuletzt geändert: 2024-02-04 14:50:24
Kopie: 0 Klicks: 680
1
konzentrieren Sie sich auf
1617
Anhänger

Trendfolgestrategie basierend auf dem mehrperiodischen SMA-Indikator

Überblick

Die Strategie nutzt die Kombination von SMA-Mitteln aus verschiedenen Perioden, um Trends zu beurteilen und zu verfolgen. Die Kernidee besteht darin, die Auf- und Abwärtsrichtung von SMA aus verschiedenen Perioden zu vergleichen, um Trends zu beurteilen. Wenn Sie einen SMA aus einer kürzeren Periode tragen, machen Sie mehr; Wenn Sie einen SMA aus einer kürzeren Periode tragen, machen Sie einen Schaden.

Strategieprinzip

  1. Die SMA-Mittellinie verwendet fünf verschiedene Perioden, nämlich 10, 20, 50, 100 und 200 Perioden.
  2. Vergleichen Sie die Auf- und Abwärtsrichtung der fünf Mittelwerte, um die Richtung des Trends zu bestimmen. Zum Beispiel, wenn der 10-Zyklus-, 20-Zyklus-, 100-Zyklus- und 200-Zyklus-SMA-Mittelwert gleichzeitig steigt, wird er als Aufwärtstrend beurteilt; wenn der Mittelwert gleichzeitig abfällt, wird er als Abwärtstrend beurteilt.
  3. Vergleichen Sie die Werte der unterschiedlichen Perioden SMAs, um ein Handelssignal zu bilden. Zum Beispiel, wenn 10 Perioden SMA auf 20 Perioden SMA durchbrechen, ein Einstiegssignal zu bilden; Wenn 10 Perioden SMA unter 20 Perioden SMA durchbrechen, ein Einstiegssignal zu bilden.
  4. Nutzung von ZeroLagEMA als Ein- und Ausgangskennzeichen. Bei schnellen Zyklen ZeroLagEMA mehr, wenn sie langsame Zyklen durchziehen; bei niedrigen Zyklen mehr, wenn sie flach sind.

Strategische Vorteile

  1. Die Verwendung von mehreren unterschiedlichen periodischen SMA-Gewinnlinien kombiniert, kann die Richtung der Markttrends zu beurteilen.
  2. Der Vergleich von periodischen SMA-Werten kann Handelssignale erzeugen und quantitative Ein- und Ausstiegsregeln bilden.
  3. Die Zero LagEMA-Strahlung verhindert unnötige Transaktionen und erhöht die Strategie-Stabilität.
  4. Trendspeicher-Trading in Kombination mit Trendbeurteilung und Handelssignalen.

Strategische Risiken und Lösungen

  1. Wenn die Märkte in die Phase der Erschütterung gehen, können sich SMA-Liniensignale häufig kreuzen, was zu einem höheren Risiko für ungültige Geschäfte und Verluste führt.
    • Lösung: Erhöhen Sie die Parameter für die Abweichung von ZeroLagEMA, um die Eingabe von ungültigen Signalen zu vermeiden.
  2. Aufgrund der Verweisung auf mehrere SMA-Zyklen wurde das Signal als etwas verzögert eingestuft, so dass es nicht in der Lage ist, zeitnah auf kurzfristige, starke Preisänderungen zu reagieren.
    • Die Lösung: Zusätzliche Beurteilung in Kombination mit empfindlicheren Indikatoren wie MACD.

Richtung der Strategieoptimierung

  1. Optimieren Sie die Parameter der SMA-Zyklen, um die optimale Kombination von Parametern zu finden.
  2. Erhöhung der Stop-Loss-Strategien, wie zum Beispiel die Verfolgung von Stop-Losses, um die Einzelschaden weiter zu kontrollieren.
  3. Erweiterung der Positionsmanagement-Mechanismen, um die Strategie zu erweitern, wenn der Trend stark ist, und zu verkleinern, wenn der Trend schwankt.
  4. In Kombination mit weiteren Hilfsindikatoren wie MACD, KDJ und anderen, verbessert die Strategie die Gesamtstabilität.

Zusammenfassen

Durch die Kombination mehrerer Periodenzyklen-SMA-Gewährlinien kann die Strategie die Richtung der Markttrends effektiv beurteilen und quantitative Handelssignale erzeugen. Gleichzeitig erhöht die Anwendung von ZeroLagEMA die Erfolgsrate der Strategie. Insgesamt realisiert die Strategie eine quantitative Handelsidee basierend auf Trendverfolgung. Die Wirkung ist signifikant.

Strategiequellcode
/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Forex MA Racer - SMA Performance /w ZeroLag EMA Trigger", shorttitle = "FX MA Racer (5x SMA, 2x zlEMA)", overlay=false )

// === INPUTS ===
hr0             = input(defval = true, title = "=== SERIES INPUTS ===")
smaSource       = input(defval = close, title = "SMA Source")
sma1Length      = input(defval = 10, title = "SMA 1 Length")
sma2Length      = input(defval = 20, title = "SMA 2 Length")
sma3Length      = input(defval = 50, title = "SMA 3 Length")
sma4Length      = input(defval = 100, title = "SMA 4 Length")
sma5Length      = input(defval = 200, title = "SMA 5 Length")
smaDirSpan      = input(defval = 4, title = "SMA Direction Span")
zlmaSource      = input(defval = close, title = "ZeroLag EMA Source")
zlmaFastLength  = input(defval = 9, title = "ZeroLag EMA Fast Length")
zlmaSlowLength  = input(defval = 21, title = "ZeroLag EMA Slow Length")
hr1             = input(defval = true, title = "=== PLOT TIME LIMITER ===")
useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
// set up where we want to run from
startYear       = input(defval = 2018, title = "Start From Year", minval = 0, step = 1)
startMonth      = input(defval = 02, title = "Start From Month", minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day", minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour", minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute", minval = 0,step = 1)
hr2             = input(defval = true, title = "=== TRAILING STOP ===")
useStop     = input(defval = false, title = "Use Trailing Stop?")
slPoints    = input(defval = 200, title = "Stop Loss Trail Points", minval = 1)
slOffset    = input(defval = 400, title = "Stop Loss Trail Offset", minval = 1)
// === /INPUTS ===

// === SERIES SETUP ===
// Fast ZeroLag EMA
zema1=ema(zlmaSource, zlmaFastLength)
zema2=ema(zema1, zlmaFastLength)
d1=zema1-zema2
zlemaFast=zema1+d1

// Slow ZeroLag EMA
zema3=ema(zlmaSource, zlmaSlowLength)
zema4=ema(zema3, zlmaSlowLength)
d2=zema3-zema4
zlemaSlow=zema3+d2

// Simple Moving Averages
period10 = sma(close, sma1Length)
period20 = sma(close, sma2Length)
period50 = sma(close, sma3Length)
period100 = sma(close, sma4Length)
period200 = sma(close, sma5Length)
// === /SERIES SETUP ===

// === PLOT ===
// colors of plotted MAs
p1 = (close < period10) ? #FF0000 : #00FF00
p2 = (close < period20) ? #FF0000 : #00FF00
p3 = (close < period50) ? #FF0000 : #00FF00
p4 = (close < period100) ? #FF0000 : #00FF00
p5 = (close < period200) ? #FF0000 : #00FF00

plot(period10, title='10 Period', color = p1, linewidth=1)
plot(period20, title='20 Period', color = p2, linewidth=2)
plot(period50, title='50 Period', color = p3, linewidth=4)
plot(period100, title='100 Period', color = p4, linewidth=6)
plot(period200, title='200 Period', color = p5, linewidth=10)
// === /PLOT ===

//BFR = BRFIB ? (maFast+maSlow)/2 : abs(maFast - maSlow)

// === STRATEGY ===
// calculate SMA directions
direction10 = rising(period10, smaDirSpan) ? +1 : falling(period10, smaDirSpan) ? -1 : 0
direction20 = rising(period20, smaDirSpan) ? +1 : falling(period20, smaDirSpan) ? -1 : 0
direction50 = rising(period50, smaDirSpan) ? +1 : falling(period50, smaDirSpan) ? -1 : 0
direction100 = rising(period100, smaDirSpan) ? +1 : falling(period100, smaDirSpan) ? -1 : 0
direction200 = rising(period200, smaDirSpan) ? +1 : falling(period200, smaDirSpan) ? -1 : 0

// conditions
// SMA Direction Trigger
dirUp = direction10 > 0 and direction20 > 0 and direction100 > 0 and direction200 > 0
dirDn = direction10 < 0 and direction20 < 0 and direction100 < 0 and direction200 < 0

longCond = (period10>period20) and (period20>period50) and (period50>period100) and  dirUp//and (close > period10) and (period50>period100) //and (period100>period200)
shortCond = (period10<period20) and (period20<period50) and dirDn//and (period50<period100) and (period100>period200)

longExit = crossunder(zlemaFast, zlemaSlow) or crossunder(period10, period20)
shortExit = crossover(zlemaFast, zlemaSlow) or crossover(period10, period20)


// entries and exits
startTimeOk() =>
    // get our input time together
    inputTime   = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    // check the current time is greater than the input time and assign true or false
    timeOk      = time > inputTime ? true : false
    // last line is the return value, we want the strategy to execute if..
    // ..we are using the limiter, and the time is ok -OR- we are not using the limiter
    r = (useTimeLimit and timeOk) or not useTimeLimit


if( true )
    // entries
    strategy.entry("long", strategy.long, when = longCond)
    strategy.entry("short", strategy.short, when = shortCond)

        
    // trailing stop
    if (useStop)
        strategy.exit("XL", from_entry = "long", trail_points = slPoints, trail_offset = slOffset)
        strategy.exit("XS", from_entry = "short", trail_points = slPoints, trail_offset = slOffset)

    // exits
    strategy.close("long", when = longExit)
    strategy.close("short", when = shortExit)
// === /STRATEGY ===