Monatliche Schlusskurs- und gleitender Durchschnitts-Kreuzungsstrategie

Schriftsteller:ChaoZhang, Datum: 23.11.2023 17:09:01
Tags:

img

Übersicht

Diese Strategie erzeugt Handelssignale, die auf dem Crossover zwischen dem monatlichen Schlusskurs und den gleitenden Durchschnittslinien basieren.

Strategie Logik

Die Kernlogik dieser Strategie lautet:

  1. Nehmen Sie den gleitenden Durchschnittszeitraum als Input. Wählen Sie zwischen SMA und EMA.
  2. Option zur Anzeige der gleitenden Durchschnittslinie.
  3. Option, den Schlusskurs eines anderen Ticker als Signalquelle zu verwenden.
  4. Bestimmung von Handelssignalen auf der Grundlage des Verhältnisses zwischen monatlichem Schlusskurs und gleitendem Durchschnitt:
    • Schließpreisüberschreitung über MA - Lang
    • Schließpreisüberschreitung unter MA - Schließung der Long-Position

Diese Strategie nutzt die Glättungsfähigkeit der gleitenden Durchschnitte, um Preisgeräusche auszufiltern und mittelfristige Trendumkehrungen zu erfassen.

Vorteile

Die wichtigsten Vorteile dieser Strategie sind:

  1. Nutzt monatliche Daten, um intraday-Rauschen effektiv auszufiltern und mittelfristige Trends zu erfassen
  2. Anpassbarer MA-Zeitraum für die Optimierung für verschiedene Tickers
  3. Die Möglichkeit, einen anderen Tickers als Signalquelle zu verwenden, verbessert die Stabilität
  4. Implementiert fortschrittliche Techniken zur Verhinderung der Neubemalung
  5. Flexibler Zeitrahmen für Backtesting zur Erleichterung der Prüfung

Zusammenfassend ist dies ein einfacher, aber praktischer Strategie-Rahmen, der durch Parameter-Tuning an die meisten Aktien angepasst werden kann und besonders für mittelfristige und langfristige Anleger geeignet ist.

Risiken

Es gibt auch einige Risiken zu beachten:

  1. Monatliche Daten werden langsam aktualisiert, da sie die Preisänderungen nicht in Echtzeit widerspiegeln können
  2. Verzögert und könnte kurzfristige Chancen verpassen
  3. MAs haben inhärente Verzögerungen, Signal-Timing unvorhersehbar
  4. Eine suboptimale Parameterwahl führt zu Überkonservatismus oder verpassten Möglichkeiten

Vorschläge zur Risikominderung:

  1. Einbeziehung schnellerer zeitlich begrenzter technischer Indikatoren für Hilfsurteile
  2. Optimierung der MA-Periode, um die besten Parameter zu finden
  3. Verwenden Sie als Signalquelle eine stabilere Benchmark
  4. Anpassung der Positionsgröße zur Begrenzung von Verlusten

Möglichkeiten zur Verbesserung

Diese Strategie hat ein großes Potenzial zur Verbesserung:

  1. Einbeziehung von Stop-Loss, um Gewinne zu erzielen und Risiken zu kontrollieren
  2. Ergänzende Indikatoren wie KD, MACD hinzufügen, um die Signalgenauigkeit zu verbessern
  3. Einsatz von Techniken des maschinellen Lernens zur dynamischen Optimierung von MA-Parametern
  4. Einführung von Positionsgrößen, die den Trends entsprechen
  5. Eingebundene Längen-/Kurzschaltfunktionen basierend auf den Marktbedingungen
  6. Zusammenschluss mit schnelleren Zeitrahmenpreisen für schnellere Reaktionen

Schlussfolgerung

Die monatliche Schließ- und MA-Crossover-Strategie hat eine einfache, unkomplizierte Logik und kann durch Parameter-Tuning an verschiedene Tickers angepasst werden. Sie eignet sich besonders für mittelfristige und langfristige Investoren.


/*backtest
start: 2022-11-16 00:00:00
end: 2023-11-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © universique

//@version=4
strategy("Monthly MA Close ", shorttitle="MMAC", overlay=true, default_qty_type =  strategy.percent_of_equity, default_qty_value = 100)
//MAY 6 2020 18:00

// No repaint function 
// Function to securely and simply call `security()` so that it never repaints and never looks ahead.
f_secureSecurity(_symbol, _res, _src) => security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on)
//sec10 = f_secureSecurity(syminfo.tickerid, higherTf, data)

// ————— Converts current chart resolution into a float minutes value.
f_resInMinutes() => 
    _resInMinutes = timeframe.multiplier * (
      timeframe.isseconds ? 1. / 60             :
      timeframe.isminutes ? 1.                  :
      timeframe.isdaily   ? 60. * 24            :
      timeframe.isweekly  ? 60. * 24 * 7        :
      timeframe.ismonthly ? 60. * 24 * 30.4375  : na)
// ————— Returns the float minutes value of the string _res.
f_tfResInMinutes(_res) =>
    // _res: resolution of any TF (in "timeframe.period" string format).
    // Dependency: f_resInMinutes().
    security(syminfo.tickerid, _res, f_resInMinutes())

// —————————— Determine if current timeframe is smaller that higher timeframe selected in Inputs.
// Get higher timeframe in minutes.
//higherTfInMinutes = f_tfResInMinutes(higherTf)
// Get current timeframe in minutes.
currentTfInMinutes = f_resInMinutes()
// Compare current TF to higher TF to make sure it is smaller, otherwise our plots don't make sense.
//chartOnLowerTf = currentTfInMinutes < higherTfInMinutes

// Input
switch1=input(true, title="Show MA")
exponential = input(true, title="Exponential MA")
ticker = input(false, title="Other ticker MA")

tic_ma = input(title="Ticker MA", type=input.symbol, defval="BTC_USDT:swap")
res_ma = input(title="Time MA (W, D, [min])", type=input.string, defval="M")
len_ma = input(8, minval=1, title="Period MA")

ma_cus = exponential?f_secureSecurity(tic_ma, res_ma, ema(close,len_ma)) : f_secureSecurity(tic_ma, res_ma, sma(close,len_ma))
ma_long = exponential?f_secureSecurity(syminfo.tickerid, res_ma, ema(close,len_ma)) : f_secureSecurity(syminfo.tickerid, res_ma, sma(close,len_ma))

cl1 = f_secureSecurity(syminfo.tickerid, 'M', close)
cl2 = f_secureSecurity(tic_ma, 'M', close)

// Input Backtest Range
showDate  = input(defval = false, title = "Show Date Range", type = input.bool)
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 1995, title = "From Year",       type = input.integer, minval = 1850)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1850)

// Funcion Example
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"

// Calculation
bullish_cross = ticker?cl2>ma_cus : cl1>ma_long
bearish_cross = ticker?cl2<ma_cus : cl1<ma_long

MAColor = bullish_cross ? color.green : bearish_cross ? color.red : color.orange

// Strategy
strategy.entry("long", strategy.long, when = window() and bullish_cross)
strategy.close("long", when = window() and bearish_cross)

// Output
plot(switch1?ma_long:na,color = MAColor,linewidth=4)

// Alerts
alertcondition(bullish_cross, title='Bullish', message='Bullish')
alertcondition(bearish_cross, title='Bearish', message='Bearish')

Mehr