MACD Moving Average Crossover-Trend nach Strategie mit Trailing Stop Loss

Schriftsteller:ChaoZhang, Datum: 2023-11-06 11:56:14
Tags:

img

Übersicht

Diese Strategie verwendet MACD, um die Trendrichtung zu bestimmen, kombiniert mit EMA und SMA Crossover als Bestätigung. Das Einstiegssignal ist, wenn das MACD-Histogramm oberhalb der Signallinie kreuzt und der Trend steigt. Der Stop-Loss wird auf dem Preisniveau unter dem schwimmenden ATR-Trailing-Stop festgelegt. Die Strategie geht auch teilweise aus, um Gewinn zu machen, geht mehr bei größeren Preisschwellen aus und hält eine Position mit einem Trailing-Stop, bis der Stop-Loss erreicht wird.

Logik

Eintrittssignal

Wenn ein schnellerer EMA über einen langsameren EMA kreuzt, deutet dies darauf hin, dass der kurzfristige Trend besser ist als der langfristige Trend, was einen Kauf signalisiert. In der Zwischenzeit deutet ein schnellerer SMA-Kreuz über einen langsameren SMA auch auf eine stärkere Aufwärtsdynamik in der Kurzzeit hin. Die Kombination von MACD-Linienkreuzung über dem Signal und Aufwärtstrend basierend auf EMA&SMA-Crossover hilft also, stärkere Einstiegssignale zu identifizieren.

Stop-Loss

ATR wird zur Berechnung des Stop-Loss-Niveaus verwendet. ATR kann den Kursschwankungsbereich effektiv messen. Wenn der Preis unter diesen Bereich fällt, wird der Stop-Loss ausgelöst. Die ATR-Periode kann angepasst werden - eine kleinere Periode ermöglicht einen genaueren Stop, aber es ist einfacher, auszuhalten, während eine größere Periode einen breiteren Stop, aber robuster gibt. Das Stop-Level verfolgt auch den Kurs nach oben und erzielt einen Trendfolgeneffekt.

Ausfahrtssignale

Verlässt teilweise bei kleinen Preisschwellen, um Gewinn zu erzielen. Verlässt mehr bei großen Preisspitzen, um Gewinn zu erzielen. Behält eine Position mit einem Trailing Stop, bis der Stop-Loss erreicht ist. Dies hilft, Gewinn zu erzielen, während man die Position für einen bestimmten Zeitraum halten kann.

Vorteile

  • Der Trend der MACD-Bewertung in Kombination mit dem EMA/SMA-Crossover bestätigt den Eintrittszeitplan
  • ATR-Trailing-Stop ermöglicht einen effektiven Stop-Loss, während man dem Trend folgt
  • Teilweise Ausgänge helfen, Gewinn zu erzielen, den Gewinn zu sichern und dauerhaft zu halten

Risiken und Lösungen

  • Risiko eines falschen Signals des MACD und der Trendindikatoren.

  • Risiko, dass ein ATR-Stop-Loss getroffen wird, kann die ATR-Periode oder den Stop-Loss-Multiplikator erhöhen.

  • Verringern Sie die Positiongröße und reduzieren Sie den Zeitverlust.

Möglichkeiten zur Verbesserung

  • Optimierung der MACD-Parameter für eine bessere Beurteilung des Trends

  • Optimierung der ATR-Periode für ein besseres Stop-Loss-Niveau

  • Optimierung der Ausgangsquoten und Positionsgröße zur Verringerung des Gefangenenrisikos

  • Überlegen Sie, ob Sie einen beweglichen Take-Profit- oder Volatilitätsindex hinzufügen, um den Stop-Loss zu verbessern.

Zusammenfassung

Die Strategie kombiniert MACD, EMA/SMA und andere Indikatoren, um den Trend und den Eintrittszeitpunkt genau zu bestimmen. Der schwimmende ATR-Stop-Loss hilft, Gewinne zu erzielen, während er dem Trend folgt. Die Ausgänge werden gestaffelt, um Gewinn zu erzielen, Gewinn zu erzielen und die Position für die Dauer zu halten. Insgesamt ist es stabil mit einem anständigen Ergebnis. Aber Parameter und Ausgänge können für eine bessere Rendite weiter optimiert werden.


/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 00:00:00
period: 1d
basePeriod: 1h
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/
// © Deobald

//@version=4
strategy("MACD Strategy", overlay=true)

// FUNCTIONS

Ema(src,p) =>
    ema = 0.
    sf = 2/(p+1)
    ema := nz(ema[1] + sf*(src - ema[1]),src)

Sma(src,p) => a = cum(src), (a - a[max(p,0)])/max(p,0)

Atr(p) =>
    atr = 0.
    Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
    atr := nz(atr[1] + (Tr - atr[1])/p,Tr)

/// TREND
ribbon_period = input(34, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)

p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)


// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=3)
slow_length = input(title="Slow Length", type=input.integer, defval=5)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 2)
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)

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



// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input(1, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(10, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(5, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(50, title="Long Take Profit 2 Qty", step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)




// Stop Loss
multiplier = input(2.2, "SL Mutiplier", minval=1, step=0.1)
ATR_period=input(17,"ATR period", minval=1, step=1)

// Strategy
entry_long=crossover(macd,signal) and leadLine2 < leadLine1
entry_price_long=valuewhen(entry_long,close,0)
SL_floating_long = entry_price_long - multiplier*Atr(ATR_period)
exit_long= close < SL_floating_long 

///// BACKTEST PERIOD ///////
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() => true

if testPeriod()
    strategy.entry("long", strategy.long, comment="Long", when=entry_long)
    strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1)//, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.exit("TP2", qty_percent=long_tp2_qty, limit=long_take_level_2) //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.close_all("long", when=exit_long, comment="exit long" )


// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")


Mehr