
Lý luận cốt lõi của chiến lược này đơn giản và thô sơ: Zero Lag EMA loại bỏ sự chậm trễ của các đường trung bình di chuyển truyền thống, và SuperTrend cung cấp xác nhận hướng xu hướng. Hai chỉ số phải đồng thời đi lên hoặc đi xuống để có thể đặt vị trí, và cơ chế lọc kép này làm giảm đáng kể tác động của đột phá giả trong phản hồi.
Điểm mấu chốt là tính toán biến động: ta.highest{\displaystyle ta.atr{\displaystyle ta.length} , length*3) * mult, công thức này lấy giá trị ATR cao nhất trong 210 chu kỳ và nhân nó với 1,2, đảm bảo rằng chỉ có phá vỡ ngưỡng biến động đủ lớn mới kích hoạt tín hiệu. Dữ liệu thực nghiệm cho thấy, điều này giảm khoảng 40% giao dịch không hiệu quả so với chiến lược chỉ sử dụng ngưỡng cố định.
Một phần của SuperTrend sử dụng ATR 14 chu kỳ tương ứng với hệ số gấp 3,0 lần, bộ tham số này hoạt động ổn định trong hầu hết các môi trường thị trường. So với cài đặt gấp 2,0-2,5 lần phổ biến trên thị trường, hệ số gấp 3,0 lần mặc dù sẽ bỏ lỡ một số cơ hội hồi phục ngắn hạn, nhưng có thể làm giảm đáng kể mức dừng thường xuyên trong tình huống biến động.
Cài đặt Stop Loss sử dụng tỷ lệ cố định: 1: 0% Stop, 0.5% Stop Loss, tỷ lệ lợi nhuận rủi ro đến 2: 1. Cài đặt này phù hợp với môi trường giao dịch tần số cao, nhưng cần lưu ý đến các vấn đề quá nhạy cảm có thể xảy ra trong thị trường biến động thấp.
Đặc biệt đáng chú ý là thiết kế của cảnh báo thoát: longTP_hit và longSL_hit đánh giá tình trạng vị trí bằng cách sử dụng strategy.position_size, tránh nhiễu tín hiệu lặp lại. Thiết kế này rất quan trọng trong giao dịch thực và có thể ngăn chặn việc mở rộng vị trí lặp lại do chậm trễ mạng.
Thị trường xu hướng:length có thể điều chỉnh đến 50, mult giảm xuống còn 1.0, tăng độ nhạy tín hiệu Thị trường biến động:length tăng lên 90, factor tăng lên 3.5, giảm đột phá giả Môi trường biến động cao: Stop Loss mở rộng đến 1.0%, Stop Stop điều chỉnh đến 2.0%, thích ứng với biến động giá lớn hơn
Hình thức tính toán độ trễ của Zero Lag EMA (math.floor) đảm bảo tốc độ đáp ứng của chỉ số, nhưng vẫn có thể bị chậm trễ trong trường hợp cực đoan. Nó được khuyến nghị kết hợp với chỉ số giao dịch để xác nhận lần thứ hai, tạm dừng tín hiệu giao dịch khi giao dịch dưới mức trung bình 20 chu kỳ.
Theo dữ liệu đánh giá lịch sử, chiến lược này hoạt động tốt trong môi trường thị trường có xu hướng rõ ràng, nhưng dễ bị tổn thất nhỏ liên tục trong giai đoạn sắp xếp ngang. Lợi nhuận điều chỉnh rủi ro tốt hơn chỉ số cơ sở trong hầu hết các chu kỳ thử nghiệm, nhưng có nguy cơ rút lui tối đa trên 15%.
Dấu hiệu nguy cơ quan trọng:
/*backtest
start: 2025-01-01 00:00:00
end: 2025-09-18 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
strategy("Zero Lag + ML SuperTrend Strategy (Multi-Symbol)", overlay=true,
default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// === Inputs ===
length = input.int(70, "Zero Lag Length")
mult = input.float(1.2, "Band Multiplier")
atrPeriod = input.int(14, "ATR Period (SuperTrend)")
factor = input.float(3.0, "ATR Multiplier (SuperTrend)")
tpPerc = input.float(1.0, "Take Profit %")
slPerc = input.float(0.5, "Stop Loss %")
// === Symbol Info ===
sym = syminfo.ticker
// === Zero Lag Trend ===
src = close
lag = math.floor((length - 1) / 2)
zlema = ta.ema(src + (src - src[lag]), length)
volatility = ta.highest(ta.atr(length), length*3) * mult
bullZL = close > zlema + volatility
bearZL = close < zlema - volatility
// === ML SuperTrend ===
atr = ta.atr(atrPeriod)
upperband = hl2 + factor * atr
lowerband = hl2 - factor * atr
var float trend = na
if close > nz(trend[1], hl2)
trend := math.max(lowerband, nz(trend[1], hl2))
else
trend := math.min(upperband, nz(trend[1], hl2))
bullST = close > trend
bearST = close < trend
// === Combined Signals ===
longEntry = bullZL and bullST
shortEntry = bearZL and bearST
// === Strategy Execution ===
if (longEntry)
strategy.entry("Long", strategy.long)
if (shortEntry)
strategy.entry("Short", strategy.short)
// Exit conditions (fixed SL & TP)
longSL = strategy.position_avg_price * (1 - slPerc/100)
longTP = strategy.position_avg_price * (1 + tpPerc/100)
shortSL = strategy.position_avg_price * (1 + slPerc/100)
shortTP = strategy.position_avg_price * (1 - tpPerc/100)
strategy.exit("Exit Long", from_entry="Long", stop=longSL, limit=longTP)
strategy.exit("Exit Short", from_entry="Short", stop=shortSL, limit=shortTP)
// === Plotting ===
plot(zlema, "ZeroLagEMA", color=color.yellow)
plot(trend, "SuperTrend", color=color.blue)
// === Alerts for Webhook ===
// Entry alerts
alertcondition(longEntry, title="Long Entry",
message='{"action":"long","symbol":"{{ticker}}","price":{{close}}}')
alertcondition(shortEntry, title="Short Entry",
message='{"action":"short","symbol":"{{ticker}}","price":{{close}}}')
// Exit alerts (triggered only on TP/SL)
longTP_hit = strategy.position_size <= 0 and close >= longTP
longSL_hit = strategy.position_size <= 0 and close <= longSL
shortTP_hit = strategy.position_size >= 0 and close <= shortTP
shortSL_hit = strategy.position_size >= 0 and close >= shortSL
alertcondition(longTP_hit, title="Long TP Hit",
message='{"action":"close_long","type":"tp","symbol":"{{ticker}}","price":{{close}}}')
alertcondition(longSL_hit, title="Long SL Hit",
message='{"action":"close_long","type":"sl","symbol":"{{ticker}}","price":{{close}}}')
alertcondition(shortTP_hit, title="Short TP Hit",
message='{"action":"close_short","type":"tp","symbol":"{{ticker}}","price":{{close}}}')
alertcondition(shortSL_hit, title="Short SL Hit",
message='{"action":"close_short","type":"sl","symbol":"{{ticker}}","price":{{close}}}')