Dynamische Stop-Loss- und Take-Profit-Strategie auf der Grundlage eines doppelten ATR-Trailing-Stops

Schriftsteller:ChaoZhang, Datum: 2024-03-22 13:52:59
Tags:

img

Übersicht

Diese Strategie baut doppelte dynamische Trailing Stop-Loss-Linien mit zwei Average True Range (ATR) -Indikatoren mit unterschiedlichen Perioden auf und erzeugt Handelssignale, wenn der Preis die Stop-Loss-Linien durchbricht. Sie setzt auch dynamisch das Take-Profit-Niveau basierend auf der aktuellen Kerzenlänge, um dynamische Stop-Loss und Take-Profit zu erzielen. Die Strategie enthält auch EMA-Indikatoren, um den Trend zu beurteilen.

Strategieprinzipien

  1. Die ATR-Indikatorwerte für zwei verschiedene Perioden (Standard 10 und 20) werden berechnet und dann mit ihren jeweiligen Empfindlichkeitskoeffizienten (Standard 1 und 2) multipliziert, um zwei Stop-Loss-Breiten zu erhalten.
  2. Erzeugen Sie lange oder kurze Signale, die auf der Preisposition über oder unter den beiden Stop-Loss-Linien und der Ausbruchssituation basieren.
  3. Der Take-Profit-Level wird dynamisch berechnet, basierend auf der 1,65-fachen (anpassbaren) Länge des aktuellen Kerzenkörpers.
  4. Nach Eröffnung einer Position wird die Position geschlossen, wenn der Preis das Take-Profit-Niveau erreicht.
  5. Verwenden Sie Indikatoren wie die EMA, um den aktuellen Trend zu beurteilen und als Referenz für den Einstieg zu dienen.

Diese Strategie nutzt die Eigenschaften des ATR-Indikators, um doppelte dynamische Stop-Losses zu konstruieren, die sich gut an verschiedene Marktvolatilitäten anpassen und schnell auf Marktveränderungen reagieren können.

Analyse der Vorteile

  1. Die doppel dynamischen Stop-Loss-Linien können sich an unterschiedliche Marktvolatilitäten anpassen und haben eine hohe Flexibilität.
  2. Der Take-Profit-Level wird dynamisch auf der Grundlage der aktuellen Kerzenlänge berechnet, sodass mehr Gewinne in Trendmärkten erzielt werden können.
  3. Die Verwendung von EMA und anderen Indikatoren zur Bewertung des Trends stellt eine Referenz für den Einstieg dar und erhöht die Zuverlässigkeit der Strategie.
  4. Die Code-Logik ist klar und lesbar, sodass sie leicht zu verstehen und zu optimieren ist.

Risikoanalyse

  1. In den Märkten mit geringer Reichweite kann häufiger Handel zu hohen Transaktionskosten führen und die Rentabilität beeinträchtigen.
  2. Die Einstellungen der Stop-Loss-Linienparameter und der Take-Profit-Multiplikatoren müssen entsprechend den unterschiedlichen Merkmalen des Marktes und der Produkte optimiert werden; unsachgemäße Parameter können zu einer schlechten Strategieleistung führen.
  3. Die Strategie stützt sich hauptsächlich auf Preisbreakouts dynamischer Stop-Loss-Linien, um Signale zu erzeugen, die bei einigen großen Schwankungen falsche Breakouts erzeugen können.

Optimierungsrichtlinien

  1. Für die Märkte mit Bandbreite sollten mehr Indikatoren oder Bedingungen eingeführt werden, um Handelssignale wie RSI und MACD zu filtern.
  2. Für verschiedene Produkte und Märkte können historische Rückprüfung und Parameteroptimierung verwendet werden, um die optimalen Stop-Loss-Linienparameter und Take-Profit-Multiplikatoren zu finden.
  3. Überlegen Sie, Positionsmanagement- und Risikokontrollmodule einzuführen, um die Positionsgröße dynamisch anhand der Marktvolatilität und des Kontorisikos anzupassen.
  4. Hinzufügen von mehr Trendbeurteilungsindikatoren zur Verbesserung der Zuverlässigkeit und Genauigkeit der Signale.

Zusammenfassung

Diese Strategie, mit ihrem Design von doppelten dynamischen Stop-Loss-Linien und dynamischem Take-Profit, kann sich gut an verschiedene Marktumgebungen anpassen und in Trending-Märkten gut abschneiden. Allerdings kann sie in Range-bound-Märkten mit dem Problem des häufigen Handels und Gewinn- und Verlustkompensationen konfrontiert sein. Daher ist diese Strategie für den Einsatz in Trending-Märkten geeigneter und muss basierend auf Produktmerkmalen und Marktbedingungen optimiert und angepasst werden. Darüber hinaus gibt es noch Raum für weitere Optimierungen, wie die Einführung von mehr Filterbedingungen, Positionsmanagement und Risikokontrollmodulen, um die Robustheit und Rentabilität der Strategie zu verbessern. Insgesamt hat die Strategie eine klare Idee, eine einfache und leicht verständliche Logik und hat einen gewissen praktischen Wert und Raum für Optimierung, was weiterer Forschung und Anwendung würdig ist.


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

Mehr