
Chiến lược này sử dụng hai chu kỳ khác nhau của chỉ số ATR (Average True Range) để xây dựng đường dừng theo dõi động đôi, tạo ra tín hiệu giao dịch khi giá vượt qua đường dừng. Đồng thời sử dụng chiều dài của thực thể đường dây đệm để thiết lập giá dừng động để thực hiện dừng động. Chiến lược cũng kết hợp với chỉ số EMA để hỗ trợ phán đoán xu hướng.
Chiến lược này sử dụng đặc tính của chỉ số ATR để xây dựng lỗ hổng động đôi, có thể thích ứng tốt hơn với các tỷ lệ biến động khác nhau của thị trường, đồng thời có thể phản ứng nhanh với sự đột biến của thị trường. Thiết lập dừng động cho phép chiến lược thu được nhiều lợi nhuận hơn trong tình huống xu hướng.
Chiến lược này có thể thích ứng tốt hơn với các môi trường thị trường khác nhau, hoạt động tốt trong các tình huống xu hướng thông qua thiết kế hai đường dừng động và dừng động. Tuy nhiên, trong thị trường biến động, có thể gặp phải vấn đề giao dịch thường xuyên và bù lỗ. Do đó, chiến lược này phù hợp hơn để sử dụng trong thị trường xu hướng, đồng thời cần kết hợp các đặc điểm sản phẩm và môi trường thị trường, tối ưu hóa và điều chỉnh các tham số. Ngoài ra, vẫn còn không gian tối ưu hóa hơn nữa, chẳng hạn như giới thiệu nhiều điều kiện lọc, quản lý vị trí và các mô-đun kiểm soát rủi ro để tăng cường sức khỏe và lợi nhuận của chiến lược. Nói chung, chiến lược này có lối suy nghĩ rõ ràng, logic dễ hiểu, có một số giá trị thực tế và không gian tối ưu hóa, đáng để nghiên cứu và ứng dụng thêm.
/*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)