Dynamische Stop-Profit- und Stop-Loss-Strategie basierend auf ATR Double Trailing Stop


Erstellungsdatum: 2024-03-22 13:52:59 zuletzt geändert: 2024-03-22 13:52:59
Kopie: 1 Klicks: 616
1
konzentrieren Sie sich auf
1617
Anhänger

Dynamische Stop-Profit- und Stop-Loss-Strategie basierend auf ATR Double Trailing Stop

Überblick

Die Strategie erstellt eine doppelte dynamische Tracking-Stop-Line, die bei einem Preisbruch der Stop-Line ein Handelssignal erzeugt. Die Strategie nutzt die Länge der Linie, um den Stop-Line-Preis dynamisch einzustellen, um einen dynamischen Stop-Line-Stop zu erreichen. Die Strategie kombiniert auch die EMA-Indikatoren, um den Trend zu beurteilen.

Strategieprinzip

  1. Berechnen Sie die ATR-Werte für zwei verschiedene Perioden (default 10 und 20), multiplizieren Sie diese mit den jeweiligen Sensitivitätsfaktoren (default 1 und 2) und erhalten Sie zwei Stop-Widths.
  2. Die Über- oder Unterkopfsignale werden erzeugt, je nachdem, ob der Preis oberhalb oder unterhalb der beiden Stop-Lines und bei einem Durchbruch liegt.
  3. Der Stop-Line-Preis wird dynamisch berechnet, indem er 1,65 mal die Länge des aktuellen Linienobjekts berechnet wird.
  4. Nach dem Aufschlag, wenn der Preis den Stop-Loss-Level erreicht hat, ist der Off-Level-Position ein Gewinn.
  5. Indikatoren wie die EMA helfen bei der Beurteilung der aktuellen Trends und bieten eine Referenz für den Einstieg.

Die Strategie nutzt die Eigenschaften des ATR-Indikators, um doppelte dynamische Stopps zu erstellen, die sich besser an unterschiedliche Marktvolatilitäten anpassen und gleichzeitig schnell auf Marktveränderungen reagieren können. Die Einstellung von Dynamischen Stopps ermöglicht der Strategie, mehr Profit in trendigen Situationen zu erzielen.

Analyse der Stärken

  1. Die doppelte dynamische Stop-Line ist in der Lage, sich an unterschiedliche Marktschwankungen anzupassen und ist flexibler.
  2. Der Stop-Line-Preis basiert auf der Dynamik der aktuellen Linienlänge der Linie, um mehr Profit in einem Trend zu erzielen.
  3. Der Einsatz von Indikatoren wie EMAs, die Trends beurteilen, als Referenz für den Einstieg, erhöht die Verlässlichkeit der Strategie.
  4. Die Code-Logik ist klar, lesbar, leicht zu verstehen und zu optimieren.

Risikoanalyse

  1. Häufige Transaktionen in einem unsicheren Markt können zu höheren Gebührenkosten führen, die sich auf die Erträge auswirken.
  2. Die Einstellungen für die Stop-Line-Parameter und die Stop-Loss-Multiplikatoren müssen für verschiedene Markt- und Produktmerkmale optimiert werden. Fehlende Parameter können zu einer schlechten Strategie führen.
  3. Die Strategie basiert hauptsächlich darauf, dass der Preis die dynamische Stop-Line durchbricht, was zu falschen Signalen führen kann.

Optimierungsrichtung

  1. Für einen bewegten Markt kann man erwägen, weitere Indikatoren oder Bedingungen einzuführen, um Handelssignale wie RSI, MACD usw. zu filtern.
  2. Für verschiedene Produkte und Märkte können die optimalen Stop-Line-Parameter und Stop-Line-Multiplikatoren durch historische Rückverfolgung und Parameteroptimierung gefunden werden.
  3. Es kann in Betracht gezogen werden, Positionsmanagement- und Risikokontrolle-Module einzuführen, um die Positionsgröße an die Marktvolatilität und die Risikodynamik des Kontos anzupassen.
  4. Es wurden mehr Trend-Anzeigen hinzugefügt, um die Zuverlässigkeit und Genauigkeit der Signale zu verbessern.

Zusammenfassen

Die Strategie ist durch die Konzeption mit einer doppelten dynamischen Stop-Line und einer dynamischen Stop-Stop besser an unterschiedliche Marktumgebungen angepasst und zeichnet sich bei Trendbewegungen aus. In einem wackligen Markt kann es jedoch zu Problemen mit häufigen Transaktionen und Gewinn- und Verlust-Neutralisierung kommen. Die Strategie ist daher besser geeignet, in einem Trendmarkt verwendet zu werden, wobei die Parameter in Kombination mit den Produktmerkmalen und dem Marktumfeld optimiert und angepasst werden müssen.

Strategiequellcode
/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="UT Bot Strategy", overlay=true)

// Inputs
a1 = input(1, title="Key Value 1 ('This changes the sensitivity')")
c1 = input(10, title="ATR Period 1")
a2 = input(2, title="Key Value 2 ('This changes the sensitivity')")
c2 = input(20, title="ATR Period 2")
h = input(false, title="Signals from Heikin Ashi Candles")

////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
 
// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2019, title="From Year", minval=1970)
 
// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2100, title="To Year", minval=1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate
 
////////////////////////////////////////////////////////////////////////////////

xATR1 = atr(c1)
nLoss1 = a1 * xATR1
xATR2 = atr(c2)
nLoss2 = a2 * xATR2

src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=false) : close

xATRTrailingStop1 = 0.0
xATRTrailingStop1 := iff(src > nz(xATRTrailingStop1[1], 0) and src[1] > nz(xATRTrailingStop1[1], 0), max(nz(xATRTrailingStop1[1]), src - nLoss1),
   iff(src < nz(xATRTrailingStop1[1], 0) and src[1] < nz(xATRTrailingStop1[1], 0), min(nz(xATRTrailingStop1[1]), src + nLoss1), 
   iff(src > nz(xATRTrailingStop1[1], 0), src - nLoss1, src + nLoss1)))

xATRTrailingStop2 = 0.0
xATRTrailingStop2 := iff(src > nz(xATRTrailingStop2[1], 0) and src[1] > nz(xATRTrailingStop2[1], 0), max(nz(xATRTrailingStop2[1]), src - nLoss2),
   iff(src < nz(xATRTrailingStop2[1], 0) and src[1] < nz(xATRTrailingStop2[1], 0), min(nz(xATRTrailingStop2[1]), src + nLoss2), 
   iff(src > nz(xATRTrailingStop2[1], 0), src - nLoss2, src + nLoss2)))
 
pos = 0   
pos := iff(src[1] < nz(xATRTrailingStop1[1], 0) and src > nz(xATRTrailingStop1[1], 0), 1,
   iff(src[1] > nz(xATRTrailingStop1[1], 0) and src < nz(xATRTrailingStop1[1], 0), -1, nz(pos[1], 0))) 
   
xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue 

ema1 = ema(src, 1)
above1 = crossover(ema1, xATRTrailingStop1)
below1 = crossover(xATRTrailingStop1, ema1)
buy1 = src > xATRTrailingStop1 and above1 
sell1 = src < xATRTrailingStop1 and below1
barbuy1 = src > xATRTrailingStop1 
barsell1 = src < xATRTrailingStop1 

ema2 = ema(src, 1)
above2 = crossover(ema2, xATRTrailingStop2)
below2 = crossover(xATRTrailingStop2, ema2)
buy2 = src > xATRTrailingStop2 and above2 
sell2 = src < xATRTrailingStop2 and below2
barbuy2 = src > xATRTrailingStop2 
barsell2 = src < xATRTrailingStop2 

plotshape(buy1,  title="Buy 1",  text='Buy 1',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell1, title="Sell 1", text='Sell 1', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)
plotshape(buy2,  title="Buy 2",  text='Buy 2',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell2, title="Sell 2", text='Sell 2', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)

barcolor(barbuy1  ? color.green : na)
barcolor(barsell1 ? color.red   : na)
barcolor(barbuy2  ? color.green : na)
barcolor(barsell2 ? color.red   : na)

// Calculate SL and TP levels
candle_size = abs(open - close)
tp_level = close + candle_size *65

// Close long positions if TP is hit
strategy.exit("TP Long", "long", limit=tp_level)

// Close short positions if TP is hit
strategy.exit("TP Short", "short", limit=tp_level)

// Enter long position
strategy.entry("long", strategy.long, when=(buy1 or buy2) and time_cond)

// Enter short position
strategy.entry("short", strategy.short, when=(sell1 or sell2) and time_cond)

//adding ema with width
// Calculate EMA and SMA
ema5 = ema(close, 5)
ema200 = ema(close, 200)
ema21 = ema(close, 21)
ema50 = ema(close, 50)
sma50 = sma(close, 50)

// Plot EMA and SMA with width
plot(ema5, color=color.rgb(130, 235, 139), title="EMA 5", linewidth=1)
plot(ema200, color=color.rgb(243, 246, 249), title="EMA 200", linewidth=2)
plot(ema21, color=color.blue, title="21", linewidth=1)
plot(ema50, color=color.rgb(255, 64, 0), title="EMA 50", linewidth=2)
//plot(sma50, color=color.purple, title="SMA 20", linewidth=2)