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.
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.
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.
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.
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.
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.
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")