
EMA, ATR, MOMENTUM, EFFICIENCY, BREAKOUT
Đừng bị lừa bởi thiết lập đường trung bình 18/50/120 trên bề mặt. Cốt lõi của chiến lược này là một hệ thống xác minh xu hướng với 8 chiều độc lập, mỗi chiều có tiêu chuẩn số rõ ràng.
Vấn đề của chiến lược đường trung bình truyền thống là có quá nhiều tín hiệu giả, hệ thống này sẽ nâng tỷ lệ thành công nhập cảnh lên một tầm cao mới thông qua việc lọc nhiều thứ như hiệu quả đường dẫn (tối thiểu 33%), tính liên tục động lực (tăng tỷ lệ đường K hơn 57%) và trạng thái dao động (tăng tỷ lệ ATR hơn 95%).
90% đột phá trên thị trường là giả. Chiến lược này đặt ra cường độ đột phá phải đạt đến 0.15 lần ATR, có nghĩa là độ rộng đột phá phải vượt quá 15% của biến động trung bình gần đây để được coi là tín hiệu hiệu quả.
Cơ chế lấy lại điều chỉnh tinh vi hơn: yêu cầu giá phải điều chỉnh sâu từ đường nhanh ít nhất 0,9 lần ATR, sau đó đạt cường độ 0,15 lần ATR khi quay trở lại đường trung bình. Thiết kế này có hiệu quả trong việc lọc các đột phá giả mạo ở tầng nông và chỉ bắt được các khởi động xu hướng thực sự được tài trợ.
Cài đặt đòn bẩy 2 lần có vẻ cực đoan, nhưng với 2% dừng cứng và theo dõi động ATR 2.8 lần, rủi ro thực tế có thể được kiểm soát. Quan trọng hơn là cơ chế khóa lợi nhuận 20.8 lần ATR, tự động nâng mức dừng lỗ khi xu hướng đạt đến mức này, đảm bảo lợi nhuận trong xu hướng lớn không bị đảo ngược.
Thiết kế bắt buộc giữ 1 dây K hoàn chỉnh ngăn chặn tần số cao vào và ra, thời gian làm mát 5 dây K tránh giao dịch liên tục cảm xúc. Kiểm soát nhịp điệu này quan trọng hơn chỉ số kỹ thuật thuần túy.
Xu hướng tiếp tục nhập cảnh: áp dụng cho xu hướng mạnh đã được thiết lập, yêu cầu phá vỡ + độ dốc + hiệu quả + động lực đạt được tất cả các tiêu chuẩn. Đổi lại điều chỉnh: đối với xu hướng lành mạnh, yêu cầu điều chỉnh lại đủ sâu và lấy lại sức mạnh.
Điểm mạnh của thiết kế đa mô hình này là không bỏ lỡ bất kỳ cơ hội xu hướng nào, và mỗi mô hình đều có tiêu chuẩn chất lượng nghiêm ngặt. Không phải là một mạng lưới rộng, mà là một bắn tỉa chính xác.
Hiệu quả đường dẫn tính toán tỷ lệ di chuyển ròng với di chuyển tích lũy trong 18 chu kỳ, xu hướng dưới 33% không chạm. Chỉ số này có thể xác định hiệu quả các xu hướng sai trong tình huống chấn động và tránh bị phá sản lặp lại trong thị trường ngang.
Tiếp tục động lực yêu cầu K-line dương trên 57% và động lực 12 chu kỳ phải là tích cực. Việc xác minh kép này đảm bảo sức mạnh nội tại của xu hướng, chứ không chỉ là sự phá vỡ bề mặt của giá.
Chiến lược này rõ ràng thiên về thị trường xu hướng và thường xuyên kích hoạt tín hiệu thoát ra trong tình trạng biến động. Thiết kế bắt buộc thoát ra khi ATR thấp hơn 80% và hiệu quả thấp hơn 25%, cho thấy chiến lược có yêu cầu rõ ràng đối với môi trường thị trường.
Rủi ro lớn nhất là sự chậm trễ trong giai đoạn chuyển hướng, mặc dù có cảnh báo sớm như EMA nhanh chóng, nhưng vẫn có thể phải đối mặt với một sự rút lui lớn trong một sự đảo ngược nhanh chóng.
Lưu ý về rủi ro: Lịch sử phản hồi không đại diện cho lợi nhuận trong tương lai, chiến lược có nguy cơ thua lỗ liên tục, cần thực hiện quản lý rủi ro nghiêm ngặt, hiệu suất khác nhau trong các môi trường thị trường khác nhau.
/*backtest
start: 2026-01-07 15:30:00
end: 2026-03-15 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"XAG_USDT","balance":500000}]
*/
//@version=5
strategy("Quant Trend Engine Long Only v2 - Manual Leverage Fixed", overlay=true)
// === Core lengths ===
fastLen = input.int(18, "Fast EMA")
midLen = input.int(50, "Mid EMA")
slowLen = input.int(120, "Slow EMA")
smoothLen = input.int(3, "EMA Smoothing")
pullbackLen = input.int(8, "Pullback Lookback")
breakoutLen = input.int(20, "Breakout Length")
effLen = input.int(18, "Efficiency Length")
persistLen = input.int(7, "Persistence Length")
momLen = input.int(12, "Momentum Length")
slopeLen = input.int(10, "Slope Length")
atrLen = input.int(14, "ATR Length")
atrBaseLen = input.int(40, "ATR Baseline Length")
// === Thresholds ===
minScore = input.float(5.0, "Minimum Entry Score", step=0.25)
exitScore = input.float(2.5, "Weak Trend Exit Score", step=0.25)
minSepPerc = input.float(0.30, "Min EMA Separation %", step=0.05)
minSlowSlopePerc = input.float(0.03, "Min Slow Slope %", step=0.01)
minEff = input.float(0.33, "Min Efficiency", step=0.01)
minAtrRegime = input.float(0.95, "Min ATR Regime", step=0.05)
minBreakoutAtr = input.float(0.15, "Min Breakout ATR Strength", step=0.05)
pullbackAtrMult = input.float(0.90, "Pullback Distance ATR", step=0.05)
reclaimAtrMult = input.float(0.15, "Reclaim Distance ATR", step=0.05)
cooldownBars = input.int(5, "Cooldown Bars After Exit")
// === Risk ===
leverage = input.float(2.0, "Leverage", step=0.1, minval=0.1)
hardStopPerc = input.float(2.0, "Hard Stop %", step=0.1)
trailAtrMult = input.float(2.8, "ATR Trail Mult", step=0.1)
profitLockAtrMult = input.float(20.8, "Profit Lock ATR Mult", step=0.1)
// === Smoothed EMAs ===
fast = ta.ema(ta.ema(close, fastLen), smoothLen)
mid = ta.ema(ta.ema(close, midLen), smoothLen)
slow = ta.ema(ta.ema(close, slowLen), smoothLen)
// === Regime structure ===
bullStack = fast > mid and mid > slow
sepPerc = slow != 0 ? math.abs(fast - slow) / slow * 100 : 0.0
sepOk = sepPerc >= minSepPerc
fastSlope = fast[slopeLen] != 0 ? (fast - fast[slopeLen]) / fast[slopeLen] * 100 : 0.0
midSlope = mid[slopeLen] != 0 ? (mid - mid[slopeLen]) / mid[slopeLen] * 100 : 0.0
slowSlope = slow[slopeLen] != 0 ? (slow - slow[slopeLen]) / slow[slopeLen] * 100 : 0.0
slopeOk = slowSlope >= minSlowSlopePerc and midSlope > 0 and fastSlope > 0
// === Path efficiency ===
netMove = math.abs(close - close[effLen])
stepMove = 0.0
for i = 1 to effLen
stepMove += math.abs(close[i - 1] - close[i])
efficiency = stepMove != 0 ? netMove / stepMove : 0.0
effOk = efficiency >= minEff
// === Momentum persistence ===
upBars = 0.0
for i = 0 to persistLen - 1
upBars += close[i] > close[i + 1] ? 1 : 0
persistRatio = persistLen > 0 ? upBars / persistLen : 0.0
momRaw = close[momLen] != 0 ? (close - close[momLen]) / close[momLen] * 100 : 0.0
momOk = momRaw > 0 and persistRatio >= 0.57
// === Volatility regime ===
atr = ta.atr(atrLen)
atrBase = ta.sma(atr, atrBaseLen)
atrRegime = atrBase != 0 ? atr / atrBase : 0.0
atrOk = atrRegime >= minAtrRegime
// === Breakout quality ===
hh = ta.highest(high, breakoutLen)[1]
breakoutDist = close - hh
breakoutStrength = atr != 0 ? breakoutDist / atr : 0.0
breakoutOk = close > hh and breakoutStrength >= minBreakoutAtr
// === Pullback / reclaim logic ===
pullbackLow = ta.lowest(low, pullbackLen)
distFromFastAtr = atr != 0 ? (fast - pullbackLow) / atr : 0.0
deepEnoughPullback = distFromFastAtr >= pullbackAtrMult
reclaimFast = close > fast and close[1] <= fast[1]
reclaimMid = close > mid and close[1] <= mid[1]
reclaimStrength = atr != 0 ? (close - fast) / atr : 0.0
reclaimOk = (reclaimFast or reclaimMid) and reclaimStrength >= reclaimAtrMult
// === Transition memory ===
bullCross = ta.crossover(fast, mid) or ta.crossover(fast, slow) or ta.crossover(mid, slow)
barsSinceBullCross = ta.barssince(bullCross)
recentTrendBirth = barsSinceBullCross >= 0 and barsSinceBullCross <= 14
// === Weighted score ===
trendScore = 0.0
trendScore += bullStack ? 1.50 : 0.0
trendScore += sepOk ? 0.90 : 0.0
trendScore += slopeOk ? 1.10 : 0.0
trendScore += effOk ? 1.00 : 0.0
trendScore += atrOk ? 0.80 : 0.0
trendScore += momOk ? 1.00 : 0.0
trendScore += breakoutOk ? 1.25 : 0.0
trendScore += reclaimOk ? 1.10 : 0.0
// === Entry models ===
trendContinuationEntry = bullStack and breakoutOk and slopeOk and effOk and momOk
pullbackReentry = bullStack and sepOk and slopeOk and deepEnoughPullback and reclaimOk and effOk
earlyTrendEntry = recentTrendBirth and bullStack and sepOk and slopeOk and atrOk and momOk
// === Cooldown ===
var int lastExitBar = na
cooldownOk = na(lastExitBar) or bar_index - lastExitBar > cooldownBars
// === Final entry ===
enterLong = strategy.position_size == 0 and cooldownOk and trendScore >= minScore and close > slow and (trendContinuationEntry or pullbackReentry or earlyTrendEntry)
// === Manual leveraged sizing only ===
equity = math.max(strategy.equity, 0)
positionValue = equity * leverage
qty = positionValue > 0 ? positionValue / (close * syminfo.pointvalue) : 0.0
// === Entry tracking / mandatory 1 full candle hold ===
var int entryBarIndex = na
justOpened = strategy.position_size > 0 and strategy.position_size[1] == 0
if justOpened
entryBarIndex := bar_index
canExitNow = strategy.position_size > 0 and not na(entryBarIndex) and bar_index > entryBarIndex
// === Entry order ===
if enterLong and qty > 0
strategy.entry("Long", strategy.long, qty=qty)
// === Risk logic ===
hardStopPrice = strategy.position_size > 0 ? strategy.position_avg_price * (1 - hardStopPerc / 100) : na
var float trailStop = na
var float highSinceEntry = na
highSinceEntry := strategy.position_size > 0 ? (na(highSinceEntry) ? high : math.max(highSinceEntry, high)) : na
rawTrail = strategy.position_size > 0 ? close - atr * trailAtrMult : na
profitLock = strategy.position_size > 0 ? highSinceEntry - atr * profitLockAtrMult : na
combinedTrail = strategy.position_size > 0 ? math.max(rawTrail, profitLock) : na
trailStop := strategy.position_size > 0 ? (na(trailStop) ? combinedTrail : math.max(trailStop, combinedTrail)) : na
// === Exit logic ===
bearCross = ta.crossunder(fast, mid) or ta.crossunder(fast, slow)
structureBreak = close < mid and fast < mid
scoreWeak = trendScore <= exitScore
momentumFailure = persistRatio < 0.40 and momRaw < 0
regimeFailure = atrRegime < 0.80 and efficiency < 0.25
exitLong = strategy.position_size > 0 and canExitNow and (bearCross or structureBreak or scoreWeak or momentumFailure or regimeFailure)
// Only allow stop/trailing exits after 1 full candle has passed
if strategy.position_size > 0 and canExitNow
strategy.exit("Risk Exit", from_entry="Long", stop=math.max(hardStopPrice, trailStop))
justClosed = strategy.position_size[1] > 0 and strategy.position_size == 0
if justClosed
lastExitBar := bar_index
trailStop := na
highSinceEntry := na
entryBarIndex := na
if exitLong
strategy.close("Long")
// === Plots ===
plot(fast, color=color.green, linewidth=2, title="Fast EMA")
plot(mid, color=color.orange, linewidth=2, title="Mid EMA")
plot(slow, color=color.red, linewidth=2, title="Slow EMA")
plot(strategy.position_size > 0 ? trailStop : na, color=color.blue, linewidth=2, title="Adaptive Trail")
plot(trendScore, title="Trend Score", color=color.aqua)
plot(efficiency, title="Efficiency", color=color.fuchsia)
plot(atrRegime, title="ATR Regime", color=color.yellow)
plot(breakoutStrength, title="Breakout Strength", color=color.lime)
plot(persistRatio, title="Persistence Ratio", color=color.white)