MACD schließt Hybrid-Schildkrötenstrategie

Schriftsteller:ChaoZhang, Datum: 2023-10-30 12:16:20
Tags:

img

Übersicht

Diese Strategie kombiniert die Golden Cross- und Dead Cross-Signale des MACD-Indikators, die Beziehung des Schlusskurses zur Medianlinie und die Preisvolatilitätsmerkmale, um Ein- und Ausstiegspunkte zu bestimmen.

Strategieprinzipien

Die Strategie beruht hauptsächlich auf folgenden Grundsätzen:

  1. Verwenden Sie die MACD-Schnell- und langsame Linie, das goldene Kreuz und das tote Kreuz zur Bestimmung von Bullen- und Bärenmärkten und spezifischen Einstiegspunkten.

  2. Verwenden Sie die Beziehung des Schlusskurss zur Medianlinie, um das Ende der Trends und die Ausgangspunkte zu bestimmen.

  3. Ein Wiedereintrittsmechanismus für den Wiedereintritt in die gleiche Richtung nach dem Ende des aktuellen MACD-Trends zur Erhöhung des Gewinns.

  4. Einrichtung eines Korrektur-Eingangsmechanismus zur Zugabe von Positionen bei teilweisen Kurskorrekturen innerhalb eines Trends.

  5. Dynamische Anpassung von Positionen auf der Grundlage der oben genannten, um Gewinne innerhalb von Trends zu maximieren, während der Trend schnell beendet wird.

Insbesondere prüft die Strategie zunächst, ob zwischen den schnellen und langsamen Linien des MACD ein goldenes Kreuz oder ein totes Kreuz auftritt, um lang oder kurz zu gehen.

Darüber hinaus verfügt die Strategie über einen Wiedereintrittsmechanismus, um Positionen in der ursprünglichen Richtung wieder zu öffnen, wenn der MACD nach Beendigung des anfänglichen Trends weiterhin Signale in die gleiche Richtung zeigt.

Durch diese Einstellungen kann die Strategie Positionen dynamisch anpassen, die Ein- und Ausstiegsfrequenzen erhöhen und die Renditen maximieren, während Risiken innerhalb von Trends kontrolliert werden.

Vorteile

Die wichtigsten Vorteile dieser Mehrindikatorstrategie sind:

  1. Der MACD identifiziert Trends und Umkehrpunkte für den Einstieg.

  2. Die Beziehung zwischen Schlusskurs und Medianlinie bestimmt genau das Ende des Trends.

  3. Der Wiedereintritt erhöht die Effizienz der Kapitalnutzung.

  4. Korrektur Eingabe rechtzeitig Positionen hinzufügt, um Trends zu erfassen.

  5. Eine hohe Handelsfrequenz mit kontrollierbarem Risiko führt zu hohen Gewinnfaktoren.

  6. Anpassbare Parameter für die Optimierung von Produkten und Märkten.

  7. Klare Logik und präziser Code für einfachen Live-Handel.

  8. Ausreichende Daten aus Backtests gewährleisten die Zuverlässigkeit.

Risiken

Die wichtigsten Risiken sind:

  1. Die Wahrscheinlichkeit falscher MACD-Signale muss mit anderen Indikatoren überprüft werden.

  2. Zu enge Stops können durch flüchtige Bewegungen gestoppt werden.

  3. Eine erhöhte Handelsfrequenz erfordert eine Kontrolle der Kapitalnutzung.

  4. Korrektur-Einträge können bei Rückzügen zu Verlusten führen.

  5. Optimierung für verschiedene Produkte und Märkte erforderlich.

  6. Erfordert kontinuierliches Backtesting und Optimierung.

  7. Bei Live-Trading müssen die Kosten für Slippage berücksichtigt werden.

Risikomanagementmaßnahmen umfassen die Verwendung von Stops zur Begrenzung von Verlusten, die Bewertung der Kapitalnutzung, die Optimierung von Parametern pro Produkt durch Backtesting, die Überwachung der Marktdynamik zur Verfeinerung von Parametern und die Berücksichtigung von Rutschen in Tests.

Möglichkeiten zur Verbesserung

Möglichkeiten zur Verbesserung:

  1. Hinzufügen anderer Indikatoren zur Überprüfung von Signalen, z. B. KDJ.

  2. Implementieren Sie adaptive dynamische Stopps.

  3. Optimieren Sie die Logik für den Wiedereingang und die Korrektur.

  4. Parameteroptimierung pro Produkt.

  5. Optimierung der Kapitalnutzung für Einträge.

  6. Verwenden Sie Volumenindikatoren, um Verluste durch Rücktritte zu vermeiden.

  7. Hinzufügen von Ausfahrtmechanismen wie Bewegungsstopp.

  8. Bauen Sie einen automatisierten Handels-Bot.

  9. Berücksichtigen Sie Faktoren aus der realen Welt wie Schlupf.

Diese können die Stabilität, Anpassungsfähigkeit, Automatisierung und Live-Performance weiter verbessern.

Schlussfolgerung

Diese Strategie integriert MACD-Signale, Schlusskursanalyse und mehrere Einstiegsmechanismen, um Trends zu maximieren und gleichzeitig das Risiko zu kontrollieren.


/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 2h
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/
// © Puckapao

//@version=4
// strategy(title="MACD", shorttitle="MACD", overlay=true, initial_capital=10000.00, currency="USD", default_qty_type=strategy.cash, default_qty_value=10000.00)
// Getting inputs
reenter_delay = input(title="Re-enter Delay", type=input.integer, defval=2)
sculp_delay = input(title="Sculp Delay", type=input.integer, defval=4)
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=true)
ema_period = input(title="EMA Period", type=input.integer, defval=21)

// Get date
startDate = input(title="Start Date", type=input.integer,
     defval=19, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=09, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2017, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=31, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=3, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
// STEP 2:
// Look if the close time of the current bar
// falls inside the date range
inDateRange =  true

reenter_cnt = 0
reenter_cnt := nz(reenter_cnt[1])

sculp_cnt = 0
sculp_cnt := nz(sculp_cnt[1])

close_cnt = 0
close_cnt := nz(close_cnt[1])

on_long = false
on_long := nz(on_long[1])

on_short = false
on_short := nz(on_short[1])

sculp = false
reenter = false
slowdown = false

ema = ema(close, ema_period)

// 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
// plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)

cross_up = crossover(macd, signal)
cross_down = crossunder(macd, signal)

if (inDateRange)

    over_macd = macd > 0 and signal > 0 ? true : false
    under_macd = macd < 0 and signal < 0 ? true : false
    over_water = close > ema ? true : false
    under_water = close < ema ? true : false
    slowdown := hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] > hist ? false : true)
    reenter := hist >= 0 ? (hist[1] < hist ? true : false) : (hist[1] > hist ? true : false)
    sculp := (hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] < hist ? true : false))
    
    if(reenter == true)
        if(reenter_cnt < reenter_delay)
            reenter_cnt := reenter_cnt + 1
    else
        if(reenter_cnt > 0)
            reenter_cnt := reenter_cnt - 1
                    
    if(sculp == true)
        if(sculp_cnt < sculp_delay)
            sculp_cnt := sculp_cnt + 1
    else
        if(sculp_cnt > 0)
            sculp_cnt := sculp_cnt - 1
        
    if(slowdown == false)
        if(close_cnt < 2)
            close_cnt := close_cnt + 1
        else
            close_cnt := 0
    
    // plotchar(fork_cnt, "fork count", "")
    // plotchar(spoon_cnt, "spoon count", "")

    // Entry
    if (cross_up == true)
        strategy.entry("long", strategy.long, comment = "long", alert_message = "long")
        on_long := true
        on_short := false
    if (cross_down == true)
        strategy.entry("short", strategy.short, comment = "short", alert_message = "short")
        on_short := true
        on_long := false
        
    // Sculp bottom / top
    if (sculp == true and sculp_cnt >= sculp_delay)
        if (hist >= 0)
            strategy.entry("sculp-short", strategy.short, comment = "sculp-short", alert_message = "sculp-short")
        else
            strategy.entry("sculp-long", strategy.long, comment = "sculp-long", alert_message = "sculp-long")
        
        sculp_cnt := 0
        sculp := false
            
    // Re-Entry
    if (reenter == true and reenter_cnt >= reenter_delay)
        if (hist >= 0)
            strategy.entry("re-long", strategy.long, comment = "re-long", alert_message = "re-long")
        else
            strategy.entry("re-short", strategy.short, comment = "re-short", alert_message = "re-short")
            
        reenter_cnt := 0
        reenter := false
            
    // Close
    strategy.close("long", when = slowdown, comment = "close long", alert_message = "close long")
    strategy.close("short", when = slowdown, comment = "close short", alert_message = "close short")
    strategy.close("re-long", when = slowdown, comment = "close re-long", alert_message = "close re-long")
    strategy.close("re-short", when = slowdown, comment = "close re-short", alert_message = "close re-short")
    strategy.close("sculp-long", when = slowdown, comment = "close sculp-long", alert_message = "close sculp-long")
    strategy.close("sculp-short", when = slowdown, comment = "close sculp-short", alert_message = "close sculp-short")
    
    if (slowdown)
        if (hist >= 0)
            on_long := false
        else
            on_short := false


plotchar(slowdown, "close", "")
plotchar(reenter, "reenter", "")
plotchar(reenter_cnt, "reenter count", "")
plotchar(sculp, "sculp", "")
plotchar(sculp_cnt, "sculp count", "")

Mehr