Die Ressourcen sind geladen. Beförderung...

Längfristige Trend-SMA-Quantitative Strategie

Schriftsteller:ChaoZhang, Datum: 2025-01-06 17:01:08
Tags:SMAEMA

img

Übersicht

Diese Strategie ist ein quantitatives Handelssystem, das auf Multi-Periode Simple Moving Average (SMA) Crossover-Signalen basiert. Sie identifiziert in erster Linie Pullback-Möglichkeiten innerhalb langfristiger Aufwärtstrends. Die Strategie verwendet SMAs von fünf verschiedenen Perioden (5, 10, 20, 60 und 120 Tage), um Markttrends und Handelsmöglichkeiten durch ihre relativen Positionen und Crossover-Signalen zu bestimmen.

Strategieprinzipien

Die Kernlogik umfasst mehrere Schlüsselkomponenten:

  1. Längfristige Trendbestimmung durch die relative Position von SMA20 und SMA60, die einen Aufwärtstrend bestätigt, wenn SMA20 über SMA60 liegt.
  2. Kaufsignale werden ausgelöst, wenn der kurzfristige SMA5 nach einem Pullback über den SMA20 überschreitet, was auf einen Aufschwung innerhalb des Aufwärtstrends hinweist.
  3. Die Ausstiegssignale treten auf, wenn der SMA20 über den SMA5 überschreitet, was auf eine Schwächung der kurzfristigen Dynamik hindeutet.
  4. Die Strategie beinhaltet eine Zeitfilterfunktion zur Begrenzung der Backtesting-Perioden und zur Erhöhung der Flexibilität.

Strategische Vorteile

  1. Klare und einfache Logik, die leicht zu verstehen und umzusetzen ist, ohne komplexe Berechnungen.
  2. Wirksame Geräuschfilterung durch Verwendung mehrjähriger gleitender Durchschnitte zur Verbesserung der Signalzuverlässigkeit.
  3. Konzentrieren Sie sich auf Rückzugsmöglichkeiten innerhalb von Trendmärkten, wobei Sie sich an die Grundprinzipien des Trendverfolgens orientieren.
  4. Die Verwendung von SMA anstelle von EMA verringert die Preisempfindlichkeit und falsche Signale.
  5. Eine klare Ein- und Ausstiegslogik erleichtert die Ausführung und das Risikomanagement.

Strategische Risiken

  1. Eine inhärente Verzögerung in gleitenden Durchschnittssystemen kann zu einem unteroptimalen Ein- und Ausstiegszeitplan führen.
  2. Häufige Kreuzungen in verschiedenen Märkten können zu übermäßigen falschen Signalen führen.
  3. Das Fehlen eines Volatilitätsfiltermechanismus setzt die Strategie in Zeiten hoher Volatilität einem erheblichen Zugriffsrisiko aus.
  4. Die Zuverlässigkeit der Signale kann ohne Volumenbestätigung beeinträchtigt werden.
  5. Festgelegte gleitende Durchschnittsparameter entsprechen möglicherweise nicht allen Marktbedingungen.

Optimierungsrichtlinien

  1. Einführung eines ATR-Indikators zur Volatilitätsfilterung, um den Handel in Zeiten hoher Volatilität zu vermeiden.
  2. Einbindung eines Volumenbestätigungsmechanismus zur Verbesserung der Signalzuverlässigkeit.
  3. Entwicklung anpassungsfähiger gleitender Durchschnittsperioden, um sie besser an unterschiedliche Marktumgebungen anzupassen.
  4. Hinzufügen von Trendstärkenfiltern wie ADX-Indikatoren, um den Handel nur in starken Trends zu gewährleisten.
  5. Verbesserung der Stop-Loss-Mechanismen einschließlich der Trailing-Stops zur besseren Risikokontrolle.

Zusammenfassung

Die Strategie baut ein Handelssystem auf, das sich darauf konzentriert, Pullback-Möglichkeiten innerhalb langfristiger Aufwärtstrends durch den koordinierten Einsatz von mehrjährigen SMAs zu erfassen.


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Long-Term Growing Stock Strategy", overlay=true)
// Date Range
// STEP 1. Create inputs that configure the backtest's date range
useDateFilter = input.bool(true, title="Filter Date Range of Backtest",group="Backtest Time Period")
backtestStartDate = input(timestamp("1 Jan 2014"),title="Start Date", group="Backtest Time Period",tooltip="This start date is in the time zone of the exchange " + "where the chart's instrument trades. It doesn't use the time " +"zone of the chart or of your computer.")
backtestEndDate = input(timestamp("31 Dec 2024"), title="End Date", group="Backtest Time Period")
// STEP 2. See if current bar falls inside the date range
inTradeWindow = true


// Calculate EMAs
// ema20 = ta.ema(close, ema20_length)
// ema60 = ta.ema(close, ema60_length)
// ema120 = ta.ema(close, ema120_length)
sma5 = ta.sma(close, 5)
sma10 = ta.sma(close, 10)
sma20 = ta.sma(close, 20)
sma60 = ta.sma(close, 60)
sma120 = ta.sma(close, 120)

// Long-term growth condition: EMA 20 > EMA 60 > EMA 120
longTermGrowth = sma20 > sma60
//  and ema60 > ema120

// Entry condition: Stock closes below EMA 20 and then rises back above EMA 10

// entryCondition = ta.crossover(close, ema20) or (close[1] < ema20[1] and close > ema20)
entryCondition =  sma5[1] <= sma20[1] and sma5 > sma20
// ta.crossover(sma5, sma20)

// Exit condition: EMA 20 drops below EMA 60
// exitCondition = ema5 < ema60 or (year == 2024 and month == 12 and dayofmonth == 30)
exitCondition = ta.crossover(sma20, sma5)

// Execute trades
if entryCondition and inTradeWindow
    strategy.entry("Long Entry", strategy.long)

if exitCondition and inTradeWindow
    strategy.close("Long Entry")
// plotchar(true, char="sma5: " + str.tostring(sma5))
// plotchar(true, char="sma5: " + sma20)
// label.new(x=bar_index, y=high + 10, text="SMA 5: " + str.tostring(sma5), color=color.blue, style=label.style_label_down, textcolor=color.white, size=size.small)
// label.new(x=bar_index, y=low, text="SMA 20: " + str.tostring(sma20), color=color.red, style=label.style_label_down, textcolor=color.white, size=size.small)


// x = time + (time - time[1]) * offset_x

//     var label lab = na
//     label.delete(lab)
//     lab := label.new(x=x, y=0, text=txt, xloc=xloc.bar_time, yloc=yloc.belowbar, color=color.red, textcolor=color.black, size=size.normal, style=label.style_label_up)
//     label.set_x(lab, x)



// Plot EMAs for visualization
// plot(ema20, color=color.red, title="EMA 20")
// plot(ema60, color=color.green, title="EMA 60")
// plot(ema120, color=color.blue, title="EMA 120")

Verwandt

Mehr