Die Ressourcen sind geladen. Beförderung...

Doppel gleitender Durchschnitts-Crossover MACD Quantitative Strategie

Schriftsteller:ChaoZhang, Datum: 2024-02-22 15:32:42
Tags:

img

Übersicht

Diese Strategie erzeugt den MACD-Indikator durch Berechnung der Differenz zwischen den schnellen und langsamen gleitenden Durchschnittslinien und beurteilt den Trend und die überkauften / überverkauften Bereiche der Finanzmärkte zusammen mit der Signallinie.

Strategie Logik

Die grundlegende Logik ist die Verwendung des MACD-Indikators, der aus der schnellen und langsamen MA-Differenz erzeugt wird, um die Markttrendrichtung zu bestimmen, und der Signallinie, um die Überkauf-/Überverkaufsniveaus zu beurteilen. Wenn MACD und Signallinie ein goldenes Kreuz bilden, ist es ein langes Signal, um lang zu gehen. Wenn ein totes Kreuz entsteht, ist es ein kurzes Signal, um kurz zu gehen. In der Zwischenzeit verwendet es die Beziehung des Preisess zum 200-Tage-MA, um die Signale zu filtern, wobei nur lange Signale genommen werden, wenn der Preis über 200-Tage-MA liegt, und kurze Signale, wenn der Preis unter 200-Tage-MA liegt, um Whipsaws während starker Trends zu vermeiden.

Die spezifische Berechnungsmethode lautet:

  1. Fast Moving Average (12 Tage EMA) minus Slow Moving Average (26-Tage EMA), um den MACD zu erhalten
  2. Der 9-Tage-EMA des MACD, um die Signallinie zu erhalten
  3. MACD minus Signallinie, um das MACD-Histogramm zu erhalten

Wenn der MACD über die Signallinie überschreitet, während beide unter 0 liegen, ist dies ein goldenes Kreuz-Langsignal. Wenn der MACD unter die Signallinie überschreitet, während beide über 0 liegen, ist dies ein totes Kreuz-Kurzsignal. In der Zwischenzeit dauert es nur lange, wenn der Preis über 200-Tage-MA liegt, und kurz, wenn der Preis unter 200-Tage-MA liegt.

Vorteile

  1. Die Verwendung eines Doppelindikatorsystems vermeidet die Einschränkungen eines einzigen Indikators und verbessert die Genauigkeit
  2. Die Kombination von Preisaktion und MA-Doppelfiltern verhindert bei starken Trends Whipsaws
  3. Großer Raum für die Optimierung von Parametern zur Anpassung an verschiedene Marktumgebungen
  4. Die konservative Einstellung der Parameter führt zu weniger, aber höherwertigen Signalen
  5. Einfache und leicht umsetzbare Strategielogik

Risiken

  1. Marktvolatilität kann zu Fehlern bei der Bewertung von Indikatoren führen
  2. Die Verzögerungen bei der Umsetzung von Finanzhilfen beeinträchtigen die Aktualität der Strategie
  3. Weniger Signale können Trendchancen verpassen
  4. Risiken einer Überoptimierung bei der Optimierung von Parametern
  5. Mangelnde Zugriffskontrolle und Stopp-Loss-Mechanismen

Kann die Risiken durch Verkürzung der MA-Perioden, Hinzufügung anderer Indikatoren und Hinzufügung von Stop-Loss senken.

Optimierungsrichtlinien

1.An verschiedenen Zeitrahmen von 15m bis 1D getestet, optimale Ergebnisse bei 4H bei risikobereinigten Renditen

2. Optimieren Sie schnelle und langsame MA, damit MACD Zyklen erfasst, 7-21 gut für 15m

3.Hull MA für MACD zeigte gute Ergebnisse

4.Stopploss verbessert das Risikomanagement

Schlussfolgerung

Dies ist insgesamt eine sehr einfache und praktische Strategie, die durch duales Indikatorsystem und Preisfilterung hochwahrscheinliche Handelssignale generiert. Sie hat eine relativ hohe Gewinnspanne, verwendet die klassische MACD-Parameterkombination, um eine Überoptimierung zu vermeiden. Es gibt immer noch viel Raum für Optimierung, indem die MA-Parameter angepasst werden, andere Indikatoren und Stop-Loss-Mechanismen hinzugefügt werden, um die Leistung weiter zu verbessern. Insgesamt ist es eine typische quantitative Strategie, die auf Fundamentaldaten basiert.


/*backtest
start: 2024-02-14 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
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/
// © Hurmun

//@version=4
strategy("Simple MACD strategy ", overlay=true, margin_long=100, margin_short=100)


fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false)
// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
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


movinga2 = input(title="movinga 2", type=input.integer, defval=200)

movinga200 = sma(close, movinga2)

plot(movinga200, "MA", color.orange)
longCondition = crossover(macd, signal) and macd < 0 and signal < 0 and close > movinga200
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = crossunder(macd, signal) and macd > 0 and signal > 0 and close < movinga200
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)
    
shortProfitPerc = input(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100
longProfitPerc = input(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100
    
stoploss = input(title="stoploss in %", minval = 0.0, step=1, defval=2) /100

longStoploss = strategy.position_avg_price * (1 - stoploss)
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)

shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)
shortStoploss = strategy.position_avg_price * (1 + stoploss)
    
if (strategy.position_size > 0 )
    strategy.exit(id="XL TP", limit=longExitPrice, stop=longStoploss)






if (strategy.position_size < 0 )
    strategy.exit(id="XS TP", limit=shortExitPrice, stop=shortStoploss)

Mehr