
Chiến lược này kết hợp hệ thống lọc hai đường đồng nhất và cơ chế theo dõi tự điều chỉnh ATR để theo dõi xu hướng có tỷ lệ chiến thắng cao bằng cách vẽ Heikin Ashi để làm mịn biến động giá. Cốt lõi của chiến lược là sử dụng EMA nhanh và EMA chậm làm bộ lọc hướng xu hướng, đồng thời sử dụng dừng động dựa trên ATR để bảo vệ lợi nhuận. Lịch sử cho thấy chiến lược có tỷ lệ chiến thắng trên 90% và phù hợp để giao dịch xu hướng ngắn đường trung tâm.
Lớp tạo tín hiệu:
Trình lọc xu hướng:
Quản lý rủi ro:
Thực hiện logic:
Điều chỉnh tham số động:
Hệ thống lọc tổng hợp:
Tối ưu hóa học máy:
Xác thực đa chiều:
Chiến lược này có khả năng nắm bắt xu hướng có tỷ lệ xác suất cao thông qua cấu trúc ba chiều Heikin Ashi-ATR-EMA, cơ chế dừng lỗ động bảo vệ lợi nhuận một cách hiệu quả. Ưu điểm cốt lõi là kết hợp hữu cơ định hướng xu hướng (EMA), thích ứng tỷ lệ dao động (ATR) và lọc tiếng ồn (Heikin Ashi).
/*backtest
start: 2025-01-01 00:00:00
end: 2025-04-23 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/
//@version=5
strategy("UTBot + EMA Filter (HA + ATR Logic)", overlay = true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// === INPUTS ===
bandwidth = input.float(8., 'Bandwidth')
atr_mult = input.float(1.0, 'ATR Multiplier')
atr_len = input.int(20, 'ATR Length')
ema_fast_len = input.int(10, 'EMA Fast Length')
ema_slow_len = input.int(50, 'EMA Slow Length')
use_heikin = input.bool(true, title='Use Heikin Ashi Candle')
trail_step = input.float(10.0, title='Trailing Step (Points)', minval=0.1)
trail_offset = input.float(10.0, title='Trailing Offset (Points)', minval=0.1)
take_profit_points = input.float(100.0, title='Take Profit (Points)', minval=0.1)
// === SOURCE ===
sr = use_heikin ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close) : close
// === ATR Trailing Stop ===
atr = ta.atr(atr_len)
nLoss = atr_mult * atr
var float trail = na
iff_1 = sr > nz(trail[1]) ? sr - nLoss : sr + nLoss
iff_2 = sr < nz(trail[1]) and sr[1] < nz(trail[1]) ? math.min(nz(trail[1]), sr + nLoss) : iff_1
trail := sr > nz(trail[1]) and sr[1] > nz(trail[1]) ? math.max(nz(trail[1]), sr - nLoss) : iff_2
// === EMA FILTER ===
ema_fast = ta.ema(sr, ema_fast_len)
ema_slow = ta.ema(sr, ema_slow_len)
// === ENTRY & EXIT CONDITIONS ===
buy = sr[1] < trail[1] and sr > trail and ema_fast > ema_slow
sell = sr[1] > trail[1] and sr < trail and ema_fast < ema_slow
// === EXIT on opposite signal ===
exit_buy = sell
exit_sell = buy
// === STRATEGY EXECUTION ===
if buy
strategy.entry("Buy", strategy.long)
if sell
strategy.entry("Sell", strategy.short)
if exit_buy and strategy.position_size > 0
strategy.close("Buy")
if exit_sell and strategy.position_size < 0
strategy.close("Sell")
// === TRAILING STOP + TAKE PROFIT ===
// Long
if strategy.position_size > 0
strategy.exit("Exit Long", from_entry="Buy", trail_points=trail_step, trail_offset=trail_offset, limit=sr + take_profit_points)
// Short
if strategy.position_size < 0
strategy.exit("Exit Short", from_entry="Sell", trail_points=trail_step, trail_offset=trail_offset, limit=sr - take_profit_points)
// === PLOTS ===
plotshape(buy, title='Buy Signal', text='Buy', location=location.belowbar, color=color.green, style=shape.labelup, textcolor=color.white, size=size.tiny)
plotshape(sell, title='Sell Signal', text='Sell', location=location.abovebar, color=color.red, style=shape.labeldown, textcolor=color.white, size=size.tiny)
plot(ema_fast, color=color.teal, title='EMA Fast')
plot(ema_slow, color=color.purple, title='EMA Slow')
// === ALERTS ===
alertcondition(buy, title='UTBot Buy', message='UTBot Buy Signal')
alertcondition(sell, title='UTBot Sell', message='UTBot Sell Signal')