Doppelte gleitende Durchschnitt-Crossover-Trendstrategie


Erstellungsdatum: 2023-12-06 11:52:10 zuletzt geändert: 2023-12-06 11:52:20
Kopie: 0 Klicks: 741
1
konzentrieren Sie sich auf
1619
Anhänger

Doppelte gleitende Durchschnitt-Crossover-Trendstrategie

Überblick

Die Doppel-Gleichgewichts-Kreuz-Trendstrategie ist eine Handelsstrategie, die auf Moving Averages basiert. Sie nutzt die Kreuzung der schnellen EMA und der langsamen SMA als Kauf- und Verkaufssignale und kombiniert die Abweichung des MACD-Indikators, um die Signale zu filtern. Die Strategie berücksichtigt gleichzeitig mehrere Faktoren wie Preis, Trend und Dynamik, um ein relativ vollständiges Handelssystem zu bilden.

Strategieprinzip

Die Strategie verwendet zwei Moving Averages, EMA und SMA. Die EMA ist 200 Tage lang und die SMA ist 100 Tage lang. Die Strategie erzeugt ein Kaufsignal, wenn der Preis steigt, um die beiden Mittelwerte zu brechen, und ein Verkaufsignal, wenn der Preis sinkt, um die beiden Mittelwerte zu brechen.

Um die Reliabilität des Signals weiter zu verbessern, wurde auch der MACD-Indikator eingeführt. Wenn der Preis die EMA und die SMA durchbricht, um ein Signal zu erzeugen, ist es erforderlich, dass die MACD-Schnelllinie von unten die langsame Linie durchbricht, und die MACD-Pillardiagramm befindet sich über der 0-Achse, um ein echtes Kaufsignal auszulösen.

Die Strategie setzt außerdem eine Stop-Loss- und eine Stop-Stop-Regelung ein. Nach der Eröffnung der Strategie wird ein Stop-Loss- und eine Stop-Stop-Regelung berechnet und festgelegt, basierend auf dem Prozentsatz, den der Benutzer eingestellt hat. So kann das Risiko eines einzelnen Handels effektiv kontrolliert werden.

Insgesamt betrachtet die Strategie mehrere Indikatoren, setzt strenge Filterbedingungen für Kauf- und Verkaufssignale und verwaltet das Risiko mit Stop-Loss-Stopps, um ein relativ strenges und vollständiges Handelssystem zu bilden.

Analyse der Stärken

Die Strategie bihomogener Kreuztrends hat folgende Vorteile:

  1. Durch die Kombination von mehreren Indikatoren, die Preise, Trends und Dynamik berücksichtigen, werden strenge Filterbedingungen für die Signale gesetzt, um falsche Signale wirksam zu vermeiden und die Zuverlässigkeit der Signale zu verbessern.

  2. Die Verwendung von zwei unterschiedlichen Parametern als Moving Averages ermöglicht eine bessere Identifizierung von Markttrends und filtert Erschütterungen. Die schnelle EMA-Linie wird verwendet, um die Preisänderungen zeitnah zu verfolgen. Die langsame SMA-Linie wird verwendet, um die langfristigen Trends zu beurteilen.

  3. Die Einführung von MACD-Indikatoren bietet eine hohe Flexibilität bei der Einstellung von Parametern, die sich an die Merkmale verschiedener Märkte anpassen lassen. Die Einstellung von MACD stellt sicher, dass Handelssignale gleichzeitig von Preis, Trend und Dynamik unterstützt werden, was einen starken Anwendungswert bietet.

  4. Setzen Sie eine Stop-Loss-Schranke, um den Verlust eines einzelnen Handels zu maximieren und SIZE_MATHFUNC zu vermeiden Ein angemessener Anteil an Stop-Loss-Einstellungen kann einen Teil des Gewinns sperren und die Marktrisiko-Exposition nach dem Gewinn senken.

  5. Die Strategieparameter können flexibel eingestellt und an die Strategie angepasst werden, je nach Optimierungsergebnis.

Risikoanalyse

Die Strategie der doppelten Gleichgewichts- und Kreuzungstrends birgt auch einige Risiken, die sich auf folgende Aspekte konzentrieren:

  1. Wenn die Aktienpreise stark schwanken, können die EMA und SMA mehrere Fehlkreuzungen auftreten, was zu häufigen Öffnungen und Schließungen der Handelssignale führt. Dies erhöht die Handelsfrequenz und die Kosten für die Gebühren.

  2. Die MACD-Indikatoren können zu False-Breakouts führen, insbesondere wenn die Schwingung noch unklar ist. In diesem Fall ist das Signal unzuverlässig und kann zu unnötigen Verlusten führen.

  3. Die Position und das Verhältnis der Stop-Loss-Einstellungen beeinflussen das Ergebnis des Gewinns und Verlusts erheblich. Wenn die Stop-Loss-Einstellungen zu klein sind, besteht die Gefahr, dass sie gedeckt werden, und wenn die Stop-Loss-Einstellungen zu groß sind, kann der einzelne Verlust zu hoch sein. Dies erfordert ausreichende Tests, um die optimalen Parameter zu finden.

  4. Der Moving Average ist ein Trend-Tracking-Indikator, der bei schnellen Preiswechseln seine Indikationswirkung reduziert. Die Strategie kann nicht zum Stopp-Loss kommen und wird von einem Preisumkehrschlag getroffen, was zu einem größeren Verlust führt.

Die entsprechenden Lösungen lauten wie folgt:

  1. Die Parameter des Moving Averages können für starke Erschütterungen entsprechend angepasst werden, wobei EMA und SMA mit niedrigen Parametern verwendet werden, um die Anzahl der Kreuzungen zu verringern.

  2. Durch die Erhöhung der Filterbedingungen für die Auf- und Abbruchbedingungen der Null-Achse des MACD kann ein gewisses Maß an Fehlbruch vermieden werden. Es kann auch in Betracht gezogen werden, andere Indikatoren, wie KDJ, BOLL usw., zu kombinieren.

  3. Die Einstellungen für die Stopp-Loss-Position und -Ratio müssen umfassend retrospektiv optimiert werden, um die optimalen Parameter zu finden. Auf dieser Grundlage müssen auch die kontinuierliche Überwachung und die dynamische Anpassung berücksichtigt werden.

  4. Es kann ein Identifikationsmechanismus für eine schnelle Preisumkehr eingerichtet werden. Wenn eine ungewöhnliche Umkehr entdeckt wird, werden Notfallmaßnahmen ergriffen, um die Position zu verkleinern oder die Handelsstrategie auszusetzen, um die Risikolocke zu kontrollieren.

Optimierungsrichtung

Die Strategie bihomogener Kreuztrends hat noch Raum für weitere Optimierungen und konzentriert sich hauptsächlich auf folgende Aspekte:

  1. Test mehr Indikatoren in Kombinationen, um bessere Parameter zu finden. Zum Beispiel die Einführung von BOLL-Kanälen, die Auswirkungen von Schwankungen usw.

  2. Optimieren Sie die Längeparameter des Moving Averages, um die optimale Kombination von Parametern unter verschiedenen Marktbedingungen zu finden. Die Optimierung der Parameterrollen ist auch eine Option.

  3. Eine wissenschaftlichere und vernünftigere Einstellung der Stop-Loss-Strategie, z. B. die Einführung von Tracking-Stops oder die Einstellung eines dynamischen Risiko-Rendite-Verhältnisses basierend auf historischen statistischen Ergebnissen, kann die Strategie-Stabilität weiter verbessern.

  4. Einrichtung eines automatischen Erkennungs- und Notfallmechanismus für außergewöhnliche Preisumkehrungen. In extremen Situationen kann die Position aktiv reduziert oder die Strategie ausgesetzt werden, um große Verluste zu vermeiden.

  5. Erweiterung der Handelsvarianten, wie z. B. Devisen, digitale Währungen usw.; Prüfung der Parameterstärke verschiedener Varianten; Erweiterung des Anwendungsbereichs der Strategie.

  6. Optimierung der Strategie durch Geldmanagementstrategien wie Quantifizierung, Fixed-Position-Ratio usw.; Kontrolle des Risikos von Einzelschäden, um die Gesamtkapitalkurve flacher zu machen.

Zusammenfassen

Die Strategie berücksichtigt mehrere Faktoren und erfordert die Unterstützung von mehreren Indikatoren für Preis, Trend und Dynamik, um die Zuverlässigkeit des Signals zu gewährleisten. Die Strategie verwendet auch eine mobile Stop-Loss-Stop-Lösung, um das Risiko eines einzelnen Handels effektiv zu kontrollieren. Die Strategie-Parameter sind flexibel und praktisch, geeignet für den automatisierten Handel.

Jedoch kann keine Strategie perfekt sein. Die Strategie kann auch Schwierigkeiten in der Anwendung, wie häufigen Handel, falsche Durchbruch und Stop-Loss-Position-Einstellung. Dies erfordert, dass wir von Optimierung der Parameterpalette, die Einführung von neuen technischen Indicator-Palette, Verbesserung der Stop-Loss-Mechanismen und andere Aspekte zu tun, um die Strategie zu verbessern.

Insgesamt bilden die Doppel-Einheits-Cross-Trend-Strategien ein relativ vollständiges und rigoroses Handelssystem. In der späteren Forschung und Anwendung wird die Strategie durch kontinuierliche Optimierung und Verbesserung von größerer praktischer Bedeutung sein.

Strategiequellcode
/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Hi,
// This is my first strategy made by myself(except for the MACD indicator). I'm publishing this to get myself out there and for some newer people to see how a basic strategy works. All credits go to Zen&TheArtofTrading, for teaching me almost everything I know about Pinescript
// The strategy is basically an MACD crossover trend strategy. If the MACD line crosses the signal line upward, above the zero point of the histogram, while the price is above 200 EMA and 100 SMA it's a buy signal
// If the MACD line crosses the signal line downward, while below zero point of the histogram, as well as the price being below 200 EMA and 100 SMA it's a sell signal
// I used the 200 EMA and 100 SMA because I wanted to filter weak signals as much as possible when the market is ranging, if you have any suggestions to go around this better, please let me know, still learning everyday

// If you have any suggestions, tips or tricks please let me know. I'm still new to Pinescript, but having a lot of fun trying stuff out. If you see something in my code that you don't understand, feel free to ask, I'll try to answer as best as I can

// I opened the strategy with predetermined backtesting pyramiding, currency etc. This made the progress of backtesting multiple TP and SL easier. Also the commission value is from Binance Futures, I just left it in there for anyone who wants to just copy this strategy
strategy("MACD Crossover Trend Strategy Template", overlay = true )

// Determining inputs and values, I just copied the built-in MACD strategy and removed everything I didn't need, just needed the barebone indicator and added EMA + SMA inputs
fast_length = input(title = "Fast Length", type = input.integer, defval = 12, group = "MACD Values")
slow_length = input(title = "Slow Length", type = input.integer, defval = 26, group = "MACD Values")
src = input(title = "Source", type = input.source, defval = close, group = "MACD Values")
signal_length = input(title = "Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9, group = "MACD Values")
sma_source = input(title = "Simple MA (Oscillator)", type = input.bool, defval = false, group = "MACD Values")
sma_signal = input(title = "Simple MA (Signal Line)", type = input.bool, defval = false, group = "MACD Values")
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
emaLength = input(title = "EMA", type = input.integer, defval = 200, step = 10, group = "Moving Averages")
smaLength = input(title = "SMA", type = input.integer, defval = 100, step = 10, group = "Moving Averages")

// Input backtest range, you can adjust this here or in the input options
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
fromYear  = input(defval = 2000, title = "From Year",       type = input.integer, minval = 1970, group = "Backtest Date Range")
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
thruYear  = input(defval = 2099, title = "Thru Year",       type = input.integer, minval = 1970, group = "Backtest Date Range")

// Inputs for EMA, SMA and to adjust your take profit and stop losses in the input options while backtesting, it's result of your input is calculated back to percentages
ema = ema(close, emaLength)
sma = sma(close, smaLength)
profitlong = input(title = "Profit Long %", type = input.float, defval = 2, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
losslong = input(title = "Loss Long %", type = input.float, defval = 1, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
profitshort = input(title = "Profit Short %", type = input.float, defval = 2, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
lossshort = input(title = "Loss Short %", type = input.float, defval = 1, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01

// Check EMA and SMA also check the backtest range. inDataRange is a true or false statement, true if the date right now is between the parameters that's filled at the corresponding inputs
// (for example 1-1-2020 till 12-12-2020, if that specific bar is between these dates, statement is true and trade will be executed)
// If the date is not in between the given parameters, statement turns to false and it won't allow new trades and closes all current trades as seen with the strategy.close_all function
inDataRange = (time >= timestamp(syminfo.timezone, fromYear, fromMonth, fromDay, 0, 0)) and (time < timestamp(syminfo.timezone, thruYear, thruMonth, thruDay, 0, 0))
long = close > ema and close > sma and inDataRange
short = close < ema and close < sma and inDataRange

// Entry and exit signals + checking backtest date range, what the signals are supposed to do is noted at the beginning of the code
// I want a way to filter out weak signals that are ranging around the zero point of the histogram. 
// So far couldn't think of a decent way to do this over multiple symbols since the range of the histogram changes with every symbol, sometimes ranging between 0 and 1 or sometimes ranging between 0 and 1000
// I could probably use a cofficiency or something, but that's beyond my grasp at the moment
// Also I wanted a way to let my strategy determine a stop loss based on the pullback and having a 1.5 risk/reward TP on top of that. Couldn't really figure out a way to determine the pullback
if (crossover(macd, signal) and macd > 0)
    strategy.entry("Long", long = strategy.long,
     comment = "Long Buy",
     when = long)

strategy.exit("Exit Long", "Long", profit = close * profitlong / syminfo.mintick, loss = close * losslong / syminfo.mintick)


if (crossunder(macd, signal) and macd < 0)
    strategy.entry("Short", long = strategy.short,
     comment = "Short Buy",
     when = short)

strategy.exit("Exit Short", "Short", profit = close * profitshort / syminfo.mintick, loss = close * lossshort / syminfo.mintick)

// To make sure the backtesting doesn't leave a position open beyond, or before, our applied dates
if (not inDataRange)
    strategy.close_all()

// plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)