Krypto-Handelsstrategie auf Basis des MACD

Schriftsteller:ChaoZhang, Datum: 2023-09-19 11:21:42
Tags:

Übersicht

Diese Strategie verwendet die Moving Average Convergence Divergence (MACD) und den Relative Strength Index (RSI) Indikatoren, um Handelssignale für Kryptowährungen zu identifizieren.

Strategie Logik

  1. Berechnen Sie die 12-Tage-EMA und die 26-Tage-EMA als kurz- und langfristige gleitende Durchschnitte.

  2. Berechnen Sie den Unterschied zwischen kurzen und langen EMAs als MACD-Histogramm.

  3. Berechnen Sie den 9-Tage-EMA des MACD als Signallinie.

  4. Berechnen Sie den 14-Tage-RSI, um überkaufte/überverkaufte Werte zu beurteilen.

  5. Das Kaufsignal wird angezeigt, wenn der MACD über der Signallinie überschreitet und der RSI größer als 81 ist.

  6. Verkaufssignal angezeigt, wenn der MACD unterhalb der Signallinie überschreitet und der RSI unter 27 liegt.

  7. Verwenden Sie ein integriertes Strategie-Modul für Ein- und Ausgänge.

Analyse der Vorteile

  1. Der MACD kann Trends und Veränderungen identifizieren, der RSI zeigt Überkauf/Überverkauf.

  2. Der MACD über/unter der Nulllinie zeigt die Richtung/Stärke des kurz- bzw. langfristigen Trends an.

  3. RSI auf hohen/niedrigen Niveaus zeigt mögliche Überhitzung/Überverkauf an. Hilft, Handelssignale zu finden.

  4. Klare und einfache Handelssignale, die systematisch ausgeführt werden können.

  5. Anpassbare Parameter zur Optimierung und Anpassung an unterschiedliche Marktbedingungen.

Risikoanalyse

  1. MACD- und RSI-Daten, die anfällig für falsche Ausbrüche und Anomalien sind, können falsche Signale erzeugen.

  2. Festgelegte Parameter können sich nicht an die sich wandelnden Märkte anpassen und müssen optimiert werden.

  3. Die Signale können sich verzögern und an den Wendepunkten nicht handeln können.

  4. Nur Long/Short, nicht in der Lage, von verschiedenen Märkten zu profitieren.

Optimierungsrichtlinien

  1. Versuche verschiedene Parameterkombinationen, um optimale Einstellungen zu finden.

  2. Fügen Sie Filter hinzu, um falsche Breakout-Trades zu vermeiden.

  3. Hinzufügen von Stop Loss, um Verluste in einseitigen Märkten zu begrenzen.

  4. Verwalten von Positionsgröße, Zunahme von Trends und Abnahme von Bandbreiten.

  5. Kombination mit anderen Indikatoren für genauere Signale.

  6. Tests mit verschiedenen Instrumenten und Zeitrahmen.

Zusammenfassung

Diese Strategie nutzt die komplementären Stärken von MACD und RSI, um Trends und Handelssignale zu identifizieren. Feinabstimmungsparameter und das Hinzufügen von Filtern können die Robustheit und Rentabilität verbessern. Die Anpassung von Stops und Positionsgrößen hilft auch, Gewinne zu maximieren und Risiken zu minimieren. Die Vor- und Nachteile von MACD und RSI machen diese Strategie besser geeignet, um mittelfristige bis langfristige Trends anstatt kurzfristige Trades zu erfassen. Insgesamt ist es eine einfache und praktische Strategie, die es wert ist, weiter getestet und optimiert zu werden, um verbesserte Backtest- und Liveergebnisse zu erzielen.


/*backtest
start: 2023-09-11 00:00:00
end: 2023-09-12 04:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
// Revision:        5
// Author:          @Hugo_Moriceau
//study("Thesis_EMLYON_Withdate-strategies-Daily_Crypto_Moriceau_indicator",overlay=true)

// Pyramide 10 order size 100, every tick

strategy("Daily_Crypto_Moriceau_indicator",overlay=true)

// === GENERAL INPUTS ===

fast = 12, slow = 26
fastMA = ema(close, fast)
slowMA = ema(close, slow)

macd = fastMA - slowMA
signal = sma(macd, 9)
rsi = rsi(close,14)



tradeInvert     = input(defval = false, title = "Invert Trade Direction?")

// === LOGIC ===

// is fast ma above slow ma?
aboveBelow = fastMA >= slowMA ? true : false

// are we inverting our trade direction?
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

// === Plot Setting ===

//plot(fastMA,color=red)
//plot(slowMA,color=blue)
//barcolor(color=iff(fastMA > slowMA, yellow, na))
//barcolor(color=iff(fastMA < slowMA, black, na))
barcolor(color=iff(macd > 0.12*close , fuchsia, na))
barcolor(color=iff(macd < -0.1*close , lime, na))
dataS= macd > 0.125 and rsi>81 and fastMA > slowMA
dataB= macd < -0.1  and rsi<27 and fastMA< slowMA


plotchar(dataB, char='B',color=black,size = size.tiny,location = location.belowbar,transp= 0)  
plotchar(dataS, char='S',color=black,size = size.tiny,location = location.abovebar,transp= 0)


// === BACKTEST RANGE ===
FromMonth = input(defval = 01, title = "From Month", minval = 1)
FromDay   = input(defval = 01, title = "From Day", minval = 1)
FromYear  = input(defval = 2017, title = "From Year", minval = 2014)
ToMonth   = input(defval = 2, title = "To Month", minval = 1)
ToDay     = input(defval = 10, title = "To Day", minval = 1)
ToYear    = input(defval = 2019, title = "To Year", minval = 2018)


// === STRATEGY RELATED INPUTS ===+
// the risk management inputs
inpTakeProfit   = input(defval = 20000, title = "Take Profit", minval = 0)
inpStopLoss     = input(defval = 1500, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 100, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===

// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na


// === STRATEGY - LONG POSITION EXECUTION ===

enterLong() => not tradeDirection[1] and tradeDirection 
exitLong() => tradeDirection[1] and not tradeDirection
strategy.entry(id = "Long", long = true, when = enterLong()) // use function or simple condition to decide when to get in
strategy.close(id = "Long", when = exitLong()) // ...and when to get out

// === STRATEGY - SHORT POSITION EXECUTION ===

enterShort() => tradeDirection[1] and not tradeDirection
exitShort() => not tradeDirection[1] and tradeDirection
strategy.entry(id = "Short", long = false, when = enterShort())
strategy.close(id = "Short", when = exitShort())

// === STRATEGY RISK MANAGEMENT EXECUTION ===

// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)

Mehr