
Эта стратегия использует два различных цикла ATR (Average True Range) показателей, чтобы построить двойную динамическую слежку за стоп-линией, которая генерирует торговый сигнал, когда цена пересекает стоп-линию. При этом используется длина фиксированной линии, чтобы динамически установить стоп-линию для достижения динамического стоп-стоп.
Эта стратегия использует свойства ATR, чтобы построить двойные динамические остановки, которые лучше адаптируются к различным рыночным колебаниям, а также быстро реагируют на рыночные изменения. Настройка динамических остановок позволяет стратегии получать больше прибыли в трендовых ситуациях. В целом, эта стратегия хорошо работает в трендовых рынках, но может компенсировать многократные убытки в волатильных рынках.
Стратегия лучше адаптируется к различным рыночным условиям благодаря конструкции с двойной динамической стоп-линией и динамической остановкой. Она отлично работает в трендовых условиях. Однако в волатильных рынках возможны проблемы с частыми сделками и компенсацией прибыли и убытка.
/*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)