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