Doppel gleitender Durchschnitt mit Momentum-Breakout-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-02-06 14:39:22
Tags:

img

Übersicht

Diese Strategie verwendet das goldene Kreuz von 12-Tage-EMA und 26-Tage-EMA als Einstiegssignal. Um falsche Breakouts zu filtern, wird MACD angewendet, um den Markttrend und den RSI für überkaufte/überverkaufte Niveaus zu beurteilen.

Die Strategie bietet drei optionale Stop-Loss-Methoden: Trailing-Stop-Loss, Moving-Average-Stop und Moving-Average-Crossover-Stop.

Strategie Logik

  1. Eintrittssignal
    • Goldene Kreuzung zwischen 12-Tage-EMA und 26-Tage-EMA
    • MACD ist positiv und MACD-Linie über Signallinie
    • RSI innerhalb des vorgegebenen Bereichs
  2. Bestätigung der Einreise
    • Optional: Preisdurchbruch über dem dynamischen Widerstand
  3. Stop-Loss
    • Verluststop-Trailing auf Basis des Einstiegspreises und des vorgegebenen Prozentsatzes
    • Schließen unterhalb der 7-Tage-SMA
    • Beibehorende Kreuzung zwischen 12- und 26-Tage-EMA
  4. Gewinn machen
    • Zwei Phasen mit Gewinnziele, Ausgang der partiellen Position auf dem ersten Ziel und alle auf dem zweiten

Vorteile

  1. Das MA-System filtert falsche Signale und verbessert die Eingabegenauigkeit.
  2. Mehrfache Stop-Loss-Optionen für verschiedene Händler-Stile
  3. Risiken bei der dynamischen Steuerung der Rückfahrstopp
  4. Gewinn in Stufen nehmen, in gewissen Gewinnen sperren

Risiken

  1. Mehr falsche Signale bei Marktschwankungen
  2. Nach starkem Lauf kann der Hinterhalt durchdrungen werden.
  3. Nicht rechtzeitig bei Trendumkehr aussteigen

Lösungen:

  1. Verwenden Sie den MACD, um den realen Trend zu beurteilen
  2. Anpassung des Rücklaufanteils
  3. Verwendung anderer Stoppmethoden oder Kombination von Stopps

Erweiterung

  1. Optimierung der MA-Parameter für eine optimale Leistung
  2. Versuche verschiedene Haltestellen und finde die beste Methode
  3. Anpassung der Gewinnspanne für eine bessere Belohnung
  4. Filter mit anderen Indikatoren hinzufügen
  5. Anpassen für verschiedene Produkte und Zeitrahmen

Schlussfolgerung

Die Strategie verwendet ein MA-System für das Einstiegssignal, mit zusätzlichen Filtern nach MACD, RSI usw. Sowohl Stops als auch Gewinnziele sind für die Übereinstimmung mit verschiedenen Händlerstil optimiert.


/*backtest
start: 2023-01-30 00:00:00
end: 2024-02-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/
// © AbdulRahimShama
//@version=5


strategy('12/26-IT strategy', overlay=true,initial_capital = 100000)



Show_Only_12_26_Crossover_Entry = input.bool(true, group = "Entry_Exit Criteria")
Show_12_26_Crossover_and_resistance_Entry = input.bool(false, group = "Entry_Exit Criteria")


Show_TSL_StopLoss = input.bool(true, group = "Entry_Exit Criteria")
Show_Crossdown_StopLoss = input.bool(true, group = "Entry_Exit Criteria")
Show_SMA7_StopLoss = input.bool(false, group = "Entry_Exit Criteria")



////////////////////////////////////////////////
////////////////TARGETS INPUT
////////////////////////////////////////////////

////////Target1

TargetPerc1 = input.float(title="Target (%)", minval=0,defval=5, group="Target-1") / 100
TargetPrice1 = strategy.position_avg_price * (1 + TargetPerc1)
Target1_exit_qty = input.int(50, group="Target-1",tooltip = "% qty to sell when Target1 is reached")



////////Target2

TargetPerc2 = input.float(title="Target (%)", minval=0,defval=10, group="Target-2") / 100
TargetPrice2 = strategy.position_avg_price * (1 + TargetPerc2)
Target2_exit_qty = input.int(100, group="Target-2",tooltip = "% qty to sell when Target2 is reached")



////////////////////////////////////////////////
////////////////TRAILING STOP LOSS
////////////////////////////////////////////////


TSLsource = input(low, title="TSL Source", group="Trailing StopLoss")

longTrailPerc = input.float(title='Trail Long Loss (%)', minval=0.0, step=0.1, defval=1, group="Trailing StopLoss") * 0.01

TrailStopPrice = 0.0

TrailStopPrice := if strategy.position_size > 0
    sPIVOT_highValue = TSLsource * (1 - longTrailPerc)
    math.max(sPIVOT_highValue, TrailStopPrice[1])
else
    0

TSL = close < TrailStopPrice
plot(series=strategy.position_size > 0 and Show_TSL_StopLoss ? TrailStopPrice : na, color=color.new(color.fuchsia, 0), style=plot.style_linebr, linewidth=2, title='Trailing StopLoss')




////////////////////////////////////////////////
////////////////Moving Averages
////////////////////////////////////////////////



EMA_12=ta.ema(close, 12)
EMA_26=ta.ema(close, 26)
EMA_21=ta.ema(close,21)

plot(EMA_12, title="EMA_12", color=color.rgb(0, 255, 0), offset=0, linewidth=1)
plot(EMA_26, title="EMA_26", color=color.rgb(0, 0, 255), offset=0, linewidth=1)
plot(Show_SMA7_StopLoss ? ta.sma(close,7) : na, title="SMA_7", color=color.rgb(255, 0, 0), offset=0, linewidth=1)



////////////////////////////////////////////////
////////////////RESISTANCE INPUT and PLOTTING
////////////////////////////////////////////////

CrossOverLookbackCandles = input.int(10, group= "RESISTANCE")

resistanceSRC = input(high, group= "RESISTANCE")
resistanceLEFT = input(10, group= "RESISTANCE")
resistanceRIGHT = input(10, group= "RESISTANCE")

hih = ta.pivothigh(resistanceSRC, resistanceLEFT, resistanceRIGHT)
top = ta.valuewhen(hih, resistanceSRC[resistanceRIGHT], 0)

res = plot(top, color=top != top[1] ? na : color.new(#00ff00, 50), offset=-resistanceLEFT, linewidth=2, title="Resistance Line")

EMA_12_Low = ta.lowest(EMA_12, CrossOverLookbackCandles)
EMA_26_Low = ta.lowest(EMA_26, CrossOverLookbackCandles)


////////////////////////////////////////////////
////////////////RSI INPUT and PLOTTING
////////////////////////////////////////////////
RSI = ta.rsi(close, 14)
RSILowerRange = input.int(50, tooltip = "RSI value should be ABOVE this value for entry", group = "RSI")
RSIUpperRange = input.int(70, tooltip = "RSI value should be BELOW this value for entry", group = "RSI")



////////////////////////////////////////////////
////////////////MACD
////////////////////////////////////////////////
fast_length = 12
slow_length = 26
MACD_src = close
signal_length = 9

fast_ma = ta.ema(MACD_src, fast_length)
slow_ma = ta.ema(MACD_src, slow_length)
macd = fast_ma - slow_ma
signal = ta.ema(macd, signal_length)
hist = macd - signal



////////////////////////////////////////////////
////////////////ENTRY CRITERIA
////////////////////////////////////////////////


BUYVALUE= input(100000, tooltip = "Buy qty displayed on chart will be based on this value")

BASEENTRY = macd > signal and RSI > RSILowerRange and RSI < RSIUpperRange and close > EMA_21 and close > ta.sma(close, 7)


Entry= ta.crossover(EMA_12, EMA_26) and BASEENTRY
Entry2 = ta.crossover(close, top) and EMA_12_Low < EMA_26_Low and EMA_12 > EMA_26 and RSI < 70

////////////////////////////////////////////////
////////////////BUY SELL STRATEGY
////////////////////////////////////////////////

if ((Entry and Show_Only_12_26_Crossover_Entry))
    strategy.entry("buy", strategy.long, qty=BUYVALUE/close)

if (Entry2 and Show_12_26_Crossover_and_resistance_Entry)
    strategy.entry("buy", strategy.long, qty=BUYVALUE/close)

strategy.exit("Tg1", "buy", limit=TargetPrice1, qty_percent = Target1_exit_qty)
strategy.exit("Tg2", "buy", limit=TargetPrice2, qty_percent = Target2_exit_qty)



if TSL and Show_TSL_StopLoss and close < EMA_12 
    strategy.close_all ("sl")

if ta.crossunder(EMA_12, EMA_26) and Show_Crossdown_StopLoss
    strategy.close_all ("sl")

if ta.crossunder(close, ta.sma(close, 7)) and Show_SMA7_StopLoss
    strategy.close_all ("sl")




Mehr