MACD-Oszillator mit EMA-Crossover-Strategie

Schriftsteller:ChaoZhang, Datum: 23.09.2023
Tags:

Übersicht

Dies ist eine einfache, aber effiziente Handelsstrategie, die den MACD-Oszillator und den EMA-Crossover kombiniert. Derzeit für 4h-Kerzen eingerichtet, aber an andere Zeitrahmen angepasst. Es hat in den letzten 3 Jahren gut auf BTC und ETH abgeschnitten, Buy and Hold. Mit Optimierungen kann es für Futures, Indizes, Forex, Aktien usw. angepasst werden.

Strategie Logik

Die wichtigsten Komponenten sind:

  1. MACD: Beurteilung der Preisdynamik.

  2. EMA: Bestimmung der Kursentwicklung.

  3. Zeitbedingung: Definition einer gültigen Strategieperiode.

  4. Lange/kurze Option: Wahl der langen oder kurzen Richtung.

Die Handelsregeln sind:

  1. Long/Exit short: Bei Schließen über der EMA, MACD-Histogramm positiv und aktuelle Kerze höher als vorherige Kerze.

  2. Short/Exit long: Bei Schließen unterhalb der EMA, MACD-Histogramm negativ und aktuelle Kerze niedriger als vorherige Kerze.

Die Strategie vereint Trendverfolgung und Dynamik in einem einfachen und effizienten System.

Vorteile

Die wichtigsten Vorteile im Vergleich zu einzelnen Indikatoren sind:

  1. Der MACD beurteilt die kurzfristige Dynamik, der EMA bestimmt die Trendrichtung.

  2. Einfache und klare Regeln, leicht verständlich und umsetzbar.

  3. Flexible Einstellung der Parameter für verschiedene Produkte und Zeitrahmen.

  4. Option für den Handel nur lang/kurz oder bidirektional.

  5. Kann eine gültige Strategieperiode definieren, um unnötige Trades zu vermeiden.

  6. Stabile Leistung über Jahre.

  7. Kontrollierbares Risiko pro Geschäft.

  8. Potenzial zur weiteren Optimierung durch maschinelles Lernen.

Risiken

Trotz der Vorzüge sind folgende Risiken zu berücksichtigen:

  1. Eine breite Einstellung der Parameter birgt das Risiko einer Überanpassung.

  2. Keine Haltestellen, unbegrenzte Verluste.

  3. Kein Volumenfilter, Risiko für falsche Ausbrüche.

  4. Verzögerungen bei der Einholung von Trendkurven können nicht alle Verluste vermeiden.

  5. Abnahme der Leistungsfähigkeit durch veränderte Marktregime.

  6. Nur auf der Grundlage historischer Daten ist die Robustheit des Modells der Schlüssel.

  7. Eine hohe Handelsfrequenz erhöht die Transaktionskosten.

  8. Notwendigkeit der Überwachung der Risiko-Rendite-Verhältnisse und der Eigenkapitalkurven.

Verbesserungen

Die Strategie kann verbessert werden, indem

  1. Ich füge den Lautstärkungsfilter hinzu, um falsche Ausfälle zu vermeiden.

  2. Einführung von Stops zur Kontrolle von Verlusten pro Handel.

  3. Bewertung der Parameterwirksamkeit über Zeiträume hinweg.

  4. Einbeziehung von maschinellem Lernen für dynamische Optimierungen.

  5. Robustheitstests auf verschiedenen Märkten.

  6. Anpassung der Positionsgröße zur Verringerung der Frequenz.

  7. Optimierung von Risikomanagementstrategien.

  8. Tests von Ausbreitungsinstrumenten zur Erhöhung der Frequenz.

  9. Kontinuierliche Rückprüfung zur Vermeidung von Überanpassung.

Schlussfolgerung

Zusammenfassend lässt sich sagen, dass die Strategie aus der Kombination von MACD und EMA ein einfaches, aber leistungsstarkes System bildet.


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

//@version=4
strategy("My Script", overlay=true)

//heiking ashi calculation
UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")
//
// === /INPUTS ===

// === BASE FUNCTIONS ===

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//timecondition
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2020, title = "From Year", minval = 1970)
 //monday and session 
 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2021, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true

//ema data  -- moving average
len = input(9, minval=1, title="Length")
src = input(hl2, title="Source")
out = ema(src, len)
//plot(out, title="EMA", color=color.blue)

//histogram
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
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)

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


//main variables to apply conditions are going to be out(moving avg) and hist(macd)

long = haClose > out and haClose > haClose[1] and out > out[1] and hist> 0 and hist[1] < 0 and time_cond
short = haClose < out and haClose < haClose[1] and out < out[1] and hist < 0 and hist[1] > 0 and time_cond

//limit to 1 entry
var longOpeneda = false
var shortOpeneda = false
var int timeOfBuya = na



longCondition= long and not longOpeneda 

if longCondition
    longOpeneda := true
    timeOfBuya := time


longExitSignala = short
exitLongCondition = longOpeneda[1] and longExitSignala

if exitLongCondition
    longOpeneda := false
    timeOfBuya := na


plotshape(longCondition, style=shape.labelup, location=location.belowbar, color=color.green, size=size.tiny, title="BUY", text="BUY", textcolor=color.white)
plotshape(exitLongCondition, style=shape.labeldown, location=location.abovebar, color=color.red, size=size.tiny, title="SELL", text="SELL", textcolor=color.white)

//automatization

longEntry= input(true)
shortEntry=input(false)

if(longEntry)
    strategy.entry("long",strategy.long,when=longCondition)
    strategy.close("long",when=exitLongCondition)

if(shortEntry)
    strategy.entry("short",strategy.short,when=exitLongCondition)
    strategy.close("short",when=longCondition)



Mehr