Trend nach Strategie auf Basis der mehrjährigen SMA

Schriftsteller:ChaoZhang, Datum: 2024-02-04
Tags:

img

Übersicht

Diese Strategie kombiniert mehrere SMA-Linien mit verschiedenen Perioden, um den Trend zu identifizieren und zu verfolgen. Die Kernidee ist: Vergleiche die steigenden/fallenden Richtungen von SMAs mit verschiedenen Perioden, um den Trend zu bestimmen; geh lang, wenn kurzfristige SMA über langfristige SMA überschreitet, und geh kurz, wenn kurze SMA unter lange SMA überschreitet. ZeroLagEMA wird auch verwendet, um Ein- und Ausstiege zu bestätigen.

Strategie Logik

  1. Verwenden Sie 5 SMA-Linien mit Perioden von 10, 20, 50, 100 bzw. 200.
  2. Vergleichen Sie die Richtungen dieser 5 SMAs, um den Trend zu bestimmen. Wenn beispielsweise 10--, 20--, 100- und 200-Perioden-SMAs zusammen steigen, zeigt dies einen Aufwärtstrend an; wenn sie alle fallen, zeigt dies einen Abwärtstrend an.
  3. Vergleichen Sie die Werte der SMAs mit verschiedenen Perioden, um Handelssignale zu generieren. Zum Beispiel, wenn 10-Perioden SMA über 20-Perioden SMA kreuzt, gehen Sie lang; wenn 10SMA unter 20SMA kreuzt, gehen Sie kurz.
  4. Verwenden Sie ZeroLagEMA für Eingangsbestätigung und Ausgangssignale. Gehen Sie lang, wenn schnelle ZeroLagEMA über langsame ZeroLagEMA kreuzt, verlassen Sie lang, wenn es unterhalb kreuzt.

Vorteile

  1. Die Kombination mehrerer SMA mit verschiedenen Perioden kann den Markttrend wirksam bestimmen.
  2. Durch den Vergleich der SMA-Werte werden quantitative Ein- und Ausstiegsregeln erstellt.
  3. Der ZeroLagEMA-Filter vermeidet unnötige Transaktionen und verbessert die Stabilität.
  4. Durch die Kombination von Trendbeurteilung und Handelssignalen wird der Trend nach dem Handel erreicht.

Risiken und Lösungen

  1. Wenn der Markt in eine Konsolidierung eintritt, können häufige SMA-Crossovers zu überflüssigen Verlusten führen.
    • Lösung: Erhöhen Sie den ZeroLagEMA-Filter, um ungültige Signalanmeldungen zu vermeiden.
  2. Nach Ansicht der mehrjährigen SMAs ist sie etwas zurückgeblieben und reagiert nicht schnell auf starke kurzfristige Kursänderungen.
    • Lösung: Hinzufügen schnellerer Indikatoren wie MACD, um das Urteilen zu unterstützen.

Optimierungsrichtlinien

  1. Optimieren Sie die SMA-Periodenparameter, um die beste Kombination zu finden.
  2. Fügen Sie Stop-Loss-Strategien wie Trailing Stop hinzu, um Verluste weiter zu begrenzen.
  3. Hinzufügen eines Positionsgrößenmechanismus zur Erhöhung der Einsätze bei starken Trends und zur Verringerung der Einsätze bei Konsolidierungen.
  4. Mehr Hilfsindikatoren wie MACD und KDJ einzubeziehen, um die allgemeine Stabilität zu verbessern.

Schlussfolgerung

Diese Strategie bestimmt effektiv den Markttrend durch Kombination von mehrjährigen SMAs und erzeugt quantifizierte Handelssignale. ZeroLagEMA verbessert die Gewinnrate. Zusammenfassend konnte die Strategie nach dem Handel einen quantitativen Trend erzielen, mit bemerkenswerten Ergebnissen. Weitere Optimierungsperioden, Stop Loss, Positionsgröße usw. können die Strategie für den Live-Handel stärken.


/*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 ===

Mehr