Die Ressourcen sind geladen. Beförderung...

Strategie für eine doppelte Kreuzung von gleitenden Durchschnitten

Schriftsteller:ChaoZhang, Datum: 2023-12-06 11:52:10
Tags:

img

Übersicht

Die Dual Moving Average Crossover Trend Strategie ist eine Handelsstrategie, die auf gleitenden Durchschnitten basiert. Sie verwendet das Crossover von schnellen EMA- und langsamen SMA-Linien als Kauf- und Verkaufssignale und kombiniert die MACD-Indikatordivergenz mit Filtersignalen. Die Strategie berücksichtigt mehrere Faktoren wie Preis, Trend und Dynamik und bildet ein relativ vollständiges Handelssystem.

Strategieprinzip

Die Strategie verwendet zwei gleitende Durchschnitte, EMA mit einer Länge von 200 Tagen und SMA mit einer Länge von 100 Tagen. Wenn der Preis durch beide Linien nach oben bricht, wird ein Kaufsignal generiert. Wenn der Preis durch beide Linien nach unten bricht, wird ein Verkaufssignal generiert. Dies kann schwankende Trends und kurzfristige Rückschläge effektiv filtern.

Um die Zuverlässigkeit der Signale weiter zu verbessern, wird auch der MACD-Indikator eingeführt. Wenn der Preis durch die EMA und SMA bricht, um ein Signal zu bilden, muss die schnelle Linie des MACD die langsame Linie von unten durchbrechen, und das MACD-Histogramm muss über der 0-Achse sein, um ein echtes Kaufsignal auszulösen. Umgekehrt, wenn die schnelle Linie des MACD die langsame Linie von oben durchbricht und das MACD-Histogramm unter der 0-Achse ist, löst es ein echtes Verkaufssignal aus.

Darüber hinaus werden Stop-Loss und Take-Profit in der Strategie festgelegt. Nachdem die Strategie eine Position eröffnet hat, werden der Stop-Loss-Punkt und der Take-Profit-Punkt berechnet und nach dem vom Benutzer festgelegten Prozentsatz festgelegt. Dies kann das Risiko eines einzigen Handels effektiv kontrollieren.

Zusammenfassend wird in dieser Strategie umfassend mehrere Indikatoren berücksichtigt, strenge Filterbedingungen für Kauf- und Verkaufssignale festgelegt und zum Risikomanagement Stop-Loss und Take-Profit eingeführt, wodurch ein relativ strenges und vollständiges Handelssystem gebildet wird.

Analyse der Vorteile

Die Strategie des Dual Moving Average Crossover Trends weist folgende Vorteile auf:

  1. Durch die Kombination mehrerer Indikatoren, die umfassende Berücksichtigung von Preis, Trend und Dynamik und die Festlegung strenger Filterbedingungen für Signale können falsche Signale wirksam vermieden und die Signalzuverlässigkeit verbessert werden.

  2. Die Verwendung von zwei gleitenden Durchschnitten mit unterschiedlichen Parametern kann Markttrends besser identifizieren und oszillierende Märkte filtern. Die schnelle EMA-Linie wird verwendet, um Preisänderungen zeitnah zu verfolgen; die langsame SMA-Linie wird verwendet, um langfristige Trends zu bestimmen. Die Kombination der beiden Linien funktioniert besser.

  3. Der MACD-Indikator führt anpassbare Parameter ein, die je nach den Merkmalen verschiedener Märkte angepasst werden können und verfügt über eine hohe Flexibilität.

  4. Die Einstellung von Stop-Loss- und Take-Profit-Punkten kann die Kontrolle über einzelne Handelsverluste maximieren und übermäßige Verluste vermeiden.

  5. Die Parameter dieser Strategie können flexibel festgelegt und die Strategie anhand der Optimierungsergebnisse angepasst werden, was sehr praktisch ist.

Risikoanalyse

Die Strategie für die Überschneidung von Doppel gleitenden Durchschnitten birgt ebenfalls einige Risiken, hauptsächlich in den folgenden Bereichen:

  1. Wenn der Aktienkurs heftige Schwankungen zeigt, können sich EMA und SMA viele Male falsch kreuzen, was zu häufigen Öffnungs- und Schließungssignalen führt.

  2. Die MACD-Indikatoren können falsche Ausbrüche aufweisen, insbesondere in dem Prozess, in dem das Momentum noch unklar ist.

  3. Die Position und das Verhältnis der Stop-Loss-Einstellungen haben einen großen Einfluss auf die Gewinn- und Verlustergebnisse. Wenn der Stop-Loss zu klein eingestellt ist, besteht das Risiko, erwischt zu werden; wenn der Stop-Loss zu groß eingestellt ist, kann der einzelne Verlust zu schwer sein. Dies erfordert ausreichende Tests, um die optimalen Parameter zu finden.

  4. Als Trend-Tracking-Indikator wird die Wirksamkeit des gleitenden Durchschnitts verringert, wenn sich die Preise schnell umkehren.

Die entsprechenden Lösungen sind wie folgt:

  1. Bei volatilen Märkten müssen die Parameter der gleitenden Durchschnitte entsprechend angepasst werden, wobei EMA und SMA mit niedrigeren Parametern verwendet werden, um die Crossover-Frequenz zu reduzieren.

  2. Erhöhung der Filterbedingungen, wie z. B. MACD-Ausbrüche über und unter der Nulllinie, die falsche Ausbrüche in gewissem Maße reduzieren können.

  3. Die Einstellung der Stop-Loss-Position und des Stop-Loss-Verhältnisses erfordert ausreichende Rückprüfung und Optimierung, um die optimalen Parameter zu finden.

  4. Bei der Feststellung von abnormalen Kursumkehrungen können Notfallmaßnahmen ergriffen werden, wie z. B. die Reduzierung von Positionen oder die Aussetzung von Handelsstrategien, um das Risikopositionsrisiko zu kontrollieren.

Optimierungsrichtlinien

Die Strategie des Dual Moving Average Crossover Trend kann noch weiter optimiert werden, vor allem in folgenden Aspekten:

  1. Für eine Kombination von mehr Indikatoren werden bessere Parameter getestet, wie z. B. die Einbeziehung des BOLL-Kanals und die Berücksichtigung der Auswirkungen der Volatilität.

  2. Optimieren von Parametern der gleitenden Durchschnittslängen, um die beste Parameterkombination unter verschiedenen Marktbedingungen zu finden.

  3. Einführung wissenschaftlicher und vernünftigerer Stop-Loss- und Gewinnstrategien, wie z. B. Einführung von Trailing-Stop-Loss oder Festlegung dynamischer Risiko-Rendite-Verhältnisse auf der Grundlage historischer statistischer Ergebnisse.

  4. Einrichtung von Mechanismen zur automatischen Identifizierung und Notfallreaktion bei abnormalen Kursumkehrungen.

  5. Erweitern Sie Handelsvarianten wie Devisen, Kryptowährungen und andere Varianten. Testen Sie die Robustheit von Parametern in verschiedenen Varianten, um die Anwendbarkeit der Strategie zu erweitern.

  6. Optimierung der Kapitalmanagementstrategien der Strategie, wie zum Beispiel der Handel mit einem festen Betrag, die Feste Positionquote usw. Kontrolle des Verlustrisikos bei einzelnen Geschäften, wodurch die Gesamtkapitalkurve stabiler wird.

Schlussfolgerung

Die Dual Moving Average Crossover Trend Strategie berücksichtigt umfassend mehrere Faktoren. Bei der Erzeugung von Handelssignalen erfordert sie Unterstützung durch mehrere Indikatoren wie Preis, Trend und Dynamik, um die Signalzuverlässigkeit zu gewährleisten. Die Strategie setzt auch einen beweglichen Stop-Loss und Take-Profit ein, um die Risiken einzelner Trades effektiv zu kontrollieren. Die flexiblen Parameter-Einstellungen der Strategie machen sie für den automatisierten Handel sehr praktisch.

Diese Strategie kann jedoch nicht perfekt sein. Diese Strategie wird auch auf einige Schwierigkeiten bei der Anwendung stoßen, z. B. häufigen Handel, falschen Ausbrüchen, Stop-Loss-Positionierung usw. Um die Robustheit und Rentabilität der Strategie weiter zu verbessern, müssen in vielen Aspekten Anstrengungen unternommen werden, einschließlich der Optimierung von Parameterportfolios, der Einführung neuer technischer Indikatoren, der Verbesserung des Stop-Loss-Mechanismus usw.

Zusammenfassend lässt sich sagen, dass die Dual Moving Average Crossover Trend Strategie ein relativ vollständiges und rigoroses Handelssystem bildet.


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

Mehr