Многомерная машина для захвата трендов


Дата создания: 2026-03-17 11:43:45 Последнее изменение: 2026-03-17 11:43:45
Копировать: 13 Количество просмотров: 179
2
Подписаться
451
Подписчики

Многомерная машина для захвата трендов Многомерная машина для захвата трендов

EMA, ATR, MOMENTUM, EFFICIENCY, BREAKOUT

Это не обычная трехуровневая стратегия, это многомерная машина, которая захватывает тенденции.

Не будьте обманутыми на поверхности 18/50/120 трехместной линией. В основе этой стратегии лежит система проверки трендов в 8 независимых измерениях, каждое из которых имеет четкие количественные критерии.

Проблема с традиционной стратегией равнолинейного подхода заключается в том, что в ней слишком много ложных сигналов, и эта система повышает успешность входа на новый уровень с помощью многократной фильтрации таких факторов, как эффективность маршрута (<33%), постоянство движения (<57% увеличение пропорции K-линий) и состояние колебаний (<95% ATR).

Прорыв в массовом тестировании: 0.15 ATR - это настоящий прорыв

90% прорывов на рынке являются ложными прорывами. Эта стратегия устанавливает, что прорыв должен достигать 0.15 ATR, что означает, что прорыв должен превышать 15% недавних средних колебаний, чтобы считаться эффективным сигналом.

Механизм обратного отбора более изысканный: требуется глубокое отклонение от скорой линии не менее чем в 0,9 раза ATR, а затем интенсивность до 0,15 раза ATR при восстановлении на средней линии. Такая конструкция эффективно фильтрует поверхностные ложные прорывы и захватывает только действительно финансируемые запуска тенденции.

Логика управления риском с 2-кратным леверем + 2.8-кратным ATR для отслеживания убытков

Настройка на два раза больше рычагов выглядит радикальной, но с 2%-ным жестким стопом и динамическим отслеживанием ATR в 2,8 раза реальный риск контролируется. Еще более важным является механизм блокировки прибыли ATR в 20,8 раза, который автоматически повышает уровень стоп-убытков при достижении этого уровня, гарантируя, что прибыль в большом тренде не будет отброшена.

Обязательное удержание 1 полной K-линии позволяет предотвратить высокочастотные входы и выходы, а 5 K-линий - охлаждение, что позволяет избежать эмоциональной смены. Этот ритм управления важнее, чем чисто технические показатели.

Три типа входа, которые охватывают различные состояния рынка

Продолжение входа в тренд: применяется к уже установленным сильным тенденциям, требуя полного достижения стандарта прорыва + уклона + эффективности + динамики. Пересмотр входа: для здоровых тенденций, требующий достаточной глубины и восстановления силы. Ранний вход в тренд: для захвата золотого окна 14 K-линий, в котором преобразуется тенденция.

Преимущество такого многомодного дизайна заключается в том, что он не упускает ни одного типа трендовых возможностей, при этом каждый из моделей имеет строгие стандарты качества.

Показатели эффективности - наиболее недооцененный инструмент оценки качества тенденций

Эффективность траектории рассчитывается как отношение чистого смещения к совокупному смещению в течение 18 циклов, при котором тенденции ниже 33% не совпадают. Этот показатель позволяет эффективно идентифицировать ложные тенденции в шокирующих ситуациях и избегать повторных потерь на горизонтальном рынке.

Продолжительность динамики требует более 57% убывания K-линии, при этом 12 циклов динамики должны быть положительными. Такая двойная проверка гарантирует внутреннюю силу тренда, а не только поверхностное прорыв цены.

Анализ применимости: не универсальная стратегия, но отличная на рынке трендов

Эта стратегия явно ориентирована на трендовые рынки и часто вызывает выходные сигнала в шокирующих ситуациях. Дизайн, который заставляет выходить из рынка, когда ATR ниже 80% и эффективность ниже 25%, свидетельствует о том, что стратегия имеет четкие требования к рыночной среде.

Наибольший риск заключается в задержке перехода к тренду. Несмотря на ранние предупреждения, такие как быстрые перекрестные ЭМА, в быстром развороте все еще может быть большой откат. Рекомендуется использовать его в растущих акциях или криптовалютных рынках с высокой волатильностью, избегайте его использования в низко волатильных вариантах, таких как крупные блокчейн-схемы.

Примечание о риске: исторический отсчет не является индикатором будущей прибыли, существует риск непрерывного убытка от стратегии, требуется строгое управление рисками, существенная разница в производительности в разных рыночных условиях.

Исходный код стратегии
/*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)