
EMA, ATR, MOMENTUM, EFFICIENCY, BREAKOUT
Jangan tertipu oleh susunan garis rata-rata tiga 18/50/120 di permukaan. Di tengah-tengah strategi ini, terdapat sistem pengesahan trend dalam 8 dimensi yang berasingan, di mana setiap dimensi mempunyai piawaian numerik yang jelas.
Masalah dengan strategi garis rata tradisional adalah terlalu banyak isyarat palsu, sistem ini meningkatkan kadar kejayaan masuk ke tahap yang baru melalui penapisan berganda seperti kecekapan laluan (<33%), kesinambungan tenaga (<57% peningkatan dalam nisbah garis K), dan keadaan kadar turun naik (<95% peningkatan dalam nisbah ATR).
90% penembusan di pasaran adalah palsu. Strategi ini menetapkan bahawa kekuatan penembusan mesti mencapai 0.15 kali ATR, yang bermaksud bahawa ketinggian penembusan harus melebihi 15% dari pergerakan rata-rata terkini untuk dianggap sebagai isyarat yang sah.
Mekanisme penarikan semula penarikan semula lebih halus: meminta harga untuk melakukan penarikan balik yang mendalam sekurang-kurangnya 0.9 kali ATR dari garis pantas, dan kemudian mencapai kekuatan 0.15 kali ATR ketika kembali ke garis purata. Reka bentuk ini dengan berkesan menapis penembusan palsu yang cetek, hanya menangkap permulaan trend yang didorong oleh dana yang benar.
Tetapan leverage dua kali ganda kelihatan agresif, tetapi dengan 2% hentian keras dan 2.8 kali pelacakan ATR dinamik, risiko sebenarnya boleh dikawal. Yang lebih penting ialah mekanisme penguncian keuntungan 20.8 kali ganda ATR, yang secara automatik menaikkan stop loss apabila lebah mencapai tahap ini, memastikan keuntungan dalam trend besar tidak akan kembali.
Reka bentuk untuk memaksa 1 jalur K lengkap untuk mencegah frekuensi tinggi masuk dan keluar, dan tempoh sejuk 5 jalur K untuk mengelakkan perdagangan berterusan emosi. Kawalan irama ini lebih penting daripada penunjuk teknikal semata-mata.
Pendaftaran berterusan trend: berlaku untuk trend yang kuat yang telah ditubuhkan, memerlukan penembusan + kemiringan + kecekapan + momentum untuk mencapai semua standard. Pendaftaran semula: untuk pemulihan trend yang sihat, memerlukan kedalaman yang mencukupi dan mengambil semula kekuatan. Pendaftaran trend awal: menangkap tempoh tingkap 14 garis K emas yang mengubah trend.
Kelebihan reka bentuk pelbagai mod ini adalah bahawa ia tidak akan terlepas peluang untuk trend apa-apa jenis, dan setiap mod mempunyai standard kualiti yang ketat.
Keberkesanan laluan dikira perbandingan antara perpindahan bersih dan perpindahan kumulatif dalam 18 kitaran, trend yang kurang daripada 33% tidak pernah bercampur. Penunjuk ini dapat mengesan trend palsu dalam keadaan gegaran, dan mengelakkan kerugian berulang dalam pasaran berlawanan arah.
Keterusan dinamik memerlukan lebih daripada 57% K-garis berikutan 12 kitaran dinamik mestilah positif. Penyelidikan dua kali ini memastikan kekuatan dalaman trend, bukan hanya penembusan permukaan harga.
Strategi ini jelas memihak kepada pasaran trend, yang sering mencetuskan isyarat keluar dalam keadaan gegaran. Reka bentuk untuk memaksa keluar apabila ATR berada di bawah 80% dan kecekapan di bawah 25%, menunjukkan bahawa strategi ini mempunyai keperluan yang jelas terhadap keadaan pasaran.
Risiko terbesar adalah keterlambatan tempoh peralihan trend, walaupun terdapat amaran awal seperti persilangan EMA yang cepat, namun masih mungkin menghadapi penarikan balik yang lebih besar dalam pembalikan pesat. Disyorkan untuk digunakan pada saham pertumbuhan atau pasaran cryptocurrency yang mempunyai kadar turun naik yang tinggi, dan elakkan digunakan pada varian turun naik yang rendah seperti blue chip saham besar.
Petua risiko: Pemantauan semula sejarah tidak mewakili pendapatan masa depan, strategi berisiko kerugian berterusan, pengurusan risiko yang ketat perlu dilaksanakan, perbezaan prestasi yang ketara dalam keadaan pasaran yang berbeza.
/*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)