Введение в SMT-анализ
Smart Money Tool (SMT) — концепция из арсенала продвинутых трейдеров, основанная на анализе "умных денег" (крупных игроков). Основная идея: когда рынок делает ложный пробой уровня (свип) на одном инструменте, но не подтверждает его на коррелированном инструменте — это может сигнализировать о манипуляции и потенциальном развороте.
Концепция свипа (Sweep):
Цена временно пробивает значимый уровень (свинг), но закрывается обратно за этим уровнем. Это часто интерпретируется как сбор стоп-лоссов.
Корреляционный анализ:
SMT использует два коррелированных актива (например, BTC и ETH). Расхождение в их поведении может указывать на слабость движения
Break of Structure (слом структуры): Показывает, что движение имеет силу. Дальнейшее подтверждение — закрытие за пределы предыдущего свинга
Чаще всего приходилось искать SMT вручную, что довольно накладно по времени и нередко можно упустить smt банально из-за человеческого фактора. Поэтому для упрощения этой работы я написал pine script индикатор. Выглядеть на графике он будет следующим образом:

Открытый код индикатора можно найти здесь: https://github.com/roman-boop/INDICATORS-PSP-SMT
Детальный разбор индикатора: как каждая строка кода создает торговую систему
Давайте погрузимся в механику работы индикатора, разбирая каждый логический блок с сохранением оригинального кода и подробным объяснением происходящего.
Базовый каркас и настройки
//@version=5
indicator("SMT + BOS + RR (Fixed & Synced) - Visual Enhanced", overlay=true, max_labels_count=500)Индикатор начинается с декларации версии Pine Script v5 — самой современной на момент написания, предлагающей расширенные возможности. Название "SMT + BOS + RR" точно отражает суть: сочетание Smart Money Technique, Break of Structure и Risk/Reward расчета. Ключевой параметр max_labels_count=500 увеличен с дефолтного значения, поскольку стандартных 50 меток не хватило бы для отображения всех сигналов на длинном историческом периоде.
Конфигурируемые параметры
symbolA = input.symbol("BINANCE:BTCUSDT", "Symbol A")
symbolB = input.symbol("BINANCE:ETHUSDT", "Symbol B")
sideInput = input.string("both", "Side", options=["long", "short", "both"])
entryType = input.string("bos_retest", "Entry Type", options=["bos_close", "bos_retest"])
swingN = input.int(2, "Swing Size")
rr = input.float(2.0, "Risk / Reward")
minBosATR = input.float(0.5, "Min BOS Body ATR")Пользовательские настройки превращают статичный код в адаптивный инструмент. Выбор двух символов позволяет анализировать любую коррелированную пару, не ограничиваясь BTC/ETH.
Параметр sideInput с опциями "long", "short", "both" дает трейдеру возможность фильтровать сигналы по направлению — например, если он торгует только лонги.
entryType предлагает два подхода к входу: на закрытии свечи BOS или на ее ретесте, что принципиально меняет точку входа и управление риском.
swingN=2 определяет чувствительность определения свингов — чем меньше значение, тем больше локальных экстремумов будет обнаружено.
rr=2.0 устанавливает целевое соотношение риск/прибыль 1:2.
minBosATR=0.5 фильтрует слабые пробои, требуя чтобы тело свечи BOS составляло не менее половины текущего ATR.
Получение и синхронизация рыночных данных
[oA,hA,lA,cA] = request.security(symbolA, timeframe.period, [open,high,low,close])
[oB,hB,lB,cB] = request.security(symbolB, timeframe.period, [open,high,low,close])
atrA = request.security(symbolA, timeframe.period, ta.atr(14))
atrB = request.security(symbolB, timeframe.period, ta.atr(14))Здесь происходит получение синхронизированных данных по двум активам. Функция request.security — мощный инструмент Pine Script, позволяющий запрашивать данные с других таймфреймов и символов без переключения графика. Мы получаем не только OHLC-данные, но и индикатор ATR (Average True Range) с периодом 14 для каждого символа отдельно.
Критически важно, что все данные запрашиваются для текущего таймфрейма графика (timeframe.period), что обеспечивает точную синхронизацию свечей. ATR в дальнейшем будет использоваться как динамический фильтр, учитывающий текущую волатильность рынка.
Определение структурных точек рынка
phA = ta.pivothigh(hA, swingN, swingN)
plA = ta.pivotlow(lA, swingN, swingN)
phB = ta.pivothigh(hB, swingN, swingN)
plB = ta.pivotlow(lB, swingN, swingN)Этот блок отвечает за обнаружение фракталов — локальных экстремумов, которые формируют структуру рынка. Функции ta.pivothigh и ta.pivotlow работают по принципу сравнения цены с заданным количеством свечей слева и справа.
При swingN=2 функция ищет свечу, у которой максимум выше максимумов двух предыдущих и двух последующих свечей. Эти точки становятся потенциальными уровнями поддержки и сопротивления. Важно понимать, что эти функции возвращают значение только в момент формирования фрактала, а на остальных свечах возвращают na (не определено).
Сохранение и отслеживание свинговых уровней
var float lastHighA = na
var float lastLowA = na
var float lastHighB = na
var float lastLowB = na
if not na(phA)
lastHighA := phA
if not na(plA)
lastLowA := plA
if not na(phB)
lastHighB := phB
if not na(plB)
lastLowB := plBЗдесь реализуется механизм сохранения последних подтвержденных свингов.
Ключевое слово var создает переменные, которые сохраняют свои значения между обновлениями свечи — это принципиально важно для отслеживания уровней во времени. Без var переменные обнулялись бы на каждой новой свече.
Условия if not na(phA) проверяют, сформировался ли новый фрактал на текущей свече. Если да — значение обновляется. Таким образом, lastHighA всегда содержит значение последнего подтвержденного максимума, даже если текущая свеча не является фракталом.
Логика обнаружения ложных пробоев (свипов)
sweepLowA = not na(lastLowA) and lA < lastLowA and cA > lastLowA
sweepHighA = not na(lastHighA) and hA > lastHighA and cA < lastHighA
sweepLowB = not na(lastLowB) and lB < lastLowB and cB > lastLowB
sweepHighB = not na(lastHighB) and hB > lastHighB and cB < lastHighBСвип (ложный пробой) — центральное понятие SMT. Для его определения используются три условия. Возьмем sweepLowA: not na(lastLowA) проверяет, что у нас есть сохраненный уровень минимума (иначе нечего пробивать). lA < lastLowA — цена на текущей свече опустилась ниже этого минимума. cA > lastLowA — но закрылась выше него.
Именно эта комбинация создает классический ложный пробой: цена временно пробивает уровень, собирая стоп-лоссы, но затем возвращается обратно. Такое поведение часто интерпретируется как манипуляция крупных игроков.
Ядро SMT-логики: анализ расхождений
smtLong = sweepLowA != sweepLowB
smtShort = sweepHighA != sweepHighB
useA_long = smtLong and sweepLowA
useA_short = smtShort and sweepHighA
useHigh = useA_long or useA_short ? hA : hB
useLow = useA_long or useA_short ? lA : lB
useOpen = useA_long or useA_short ? oA : oB
useClose= useA_long or useA_short ? cA : cB
useATR = useA_long or useA_short ? atrA : atrBЭто самый важный блок индикатора, где происходит магия SMT. Выражение sweepLowA != sweepLowB проверяет расхождение в поведении двух активов: свип минимума произошел на одном инструменте, но не на другом.
Такое расхождение может указывать на слабость движения. Переменные useA_long и useA_short определяют, какой именно актив стал "сигнальным" — тот, на котором произошел свип. Тернарные операторы в последних строках выбирают соответствующие данные для дальнейших расчетов: если сигнальным стал актив A, используются его OHLC и ATR, иначе — данные актива B.
Подтверждение пробоя структуры (BOS)
bosLong = smtLong and not na(lastHighA) and useClose > lastHighA
bosShort = smtShort and not na(lastLowA) and useClose < lastLowA
bosLongOk = bosLong and math.abs(useClose - useOpen) >= useATR * minBosATR
bosShortOk = bosShort and math.abs(useClose - useOpen) >= useATR * minBosATRSMT-сигнал сам по себе недостаточен для входа — нужен пробой структуры для подтверждения. bosLong проверяет три условия: должен быть SMT-сигнал на лонг, должен существовать предыдущий максимум (not na(lastHighA)), и закрытие должно быть выше этого максимума. Однако даже этого мало — свеча пробоя должна иметь достаточный размер. bosLongOk добавляет фильтр по минимальному размеру тела свечи в единицах ATR. Например, при minBosATR=0.5 и useATR=100 минимальное тело свечи должно составлять 50 пунктов. Это отсекает слабые, незначительные пробои.
Формирование торговых сигналов
longEntry = bosLongOk and (sideInput == "long" or sideInput == "both")
shortEntry = bosShortOk and (sideInput == "short" or sideInput == "both")Здесь происходит финальное формирование сигналов с учетом пользовательских предпочтений. bosLongOk уже содержит всю логику SMT+BOS с фильтрацией. Условие (sideInput == "long" or sideInput == "both") добавляет гибкости: если пользователь выбрал только лонговые сигналы, шортовые игнорируются, и наоборот. При выборе "both" отображаются сигналы обоих направлений.
Расчет риск-менеджмента
slLong = useLow
slShort = useHigh
tpLong = useClose + (useClose - slLong) * rr
tpShort = useClose - (slShort - useClose) * rrЭтот блок превращает сигнал в полноценную торговую идею с управлением риском. Для лонга стоп-лосс устанавливается на минимум сигнальной свечи — логичное место, так как если цена вернется ниже этого минимума, идея вероятно неверна.
Тейк-профит рассчитывается на основе заданного соотношения риск/прибыль. Формула (useClose - slLong) * rr вычисляет расстояние от точки входа до стопа (риск), умножает его на коэффициент RR, и добавляет к цене входа. При rr=2.0 тейк-профит будет находиться на расстоянии, в два раза превышающем расстояние до стопа.
Визуализация для быстрого восприятия
plotshape(longEntry, title="LONG Entry", style=shape.triangleup, location=location.belowbar, color=color.new(color.green,0), size=size.small)
plotshape(shortEntry, title="SHORT Entry", style=shape.triangledown, location=location.abovebar, color=color.new(color.red,0), size=size.small)Визуализация — критически важная часть любого индикатора. Зеленые треугольники вверх под свечой для лонговых входов и красные треугольники вниз над свечой для шортовых создают мгновенное визуальное понимание ситуации. Размещение belowbar для лонгов и abovebar для шортов соответствует логике торговли — вход на покупку обычно ассоциируется с нижней частью свечи, на продажу — с верхней.
Динамическое отображение уровней
plot(longEntry ? slLong : na, title="SL Long", color=color.new(color.red,0), style=plot.style_linebr, linewidth=2)
plot(longEntry ? tpLong : na, title="TP Long", color=color.new(color.green,0), style=plot.style_linebr, linewidth=2)Здесь используется условное отображение: линии стоп-лосса и тейк-профита рисуются только при наличии соответствующего сигнала входа.
Стиль plot.style_linebr создает пунктирные линии, которые хорошо различимы на графике. Цветовая схема интуитивна: красный для стоп-лоссов (опасность), зеленый для тейк-профитов (цель). Условный оператор ? гарантирует, что уровни не будут "висеть" на графике после того, как сигнал перестал быть актуальным.
Фоновая подсветка зон риска
bgcolor(longEntry ? color.new(color.green,85) : na, title="Long Zone")
bgcolor(shortEntry ? color.new(color.red,85) : na, title="Short Zone")Фоновая подсветка выполняет две функции: во-первых, она визуально выделяет свечи со сигналами, что полезно при быстром просмотре графика; во-вторых, прозрачность 85 (из 100) позволяет видеть ценовой график под цветовой заливкой
Диагностические элементы для анализа
plot(smtLong ? useLow : na, color=color.new(color.green,70), style=plot.style_circles, linewidth=4, title="SMT Long Dot")
plot(smtShort ? useHigh : na, color=color.new(color.red,70), style=plot.style_circles, linewidth=4, title="SMT Short Dot")Эти диагностические точки показывают, где именно был зафиксирован SMT-сигнал, даже если он не привел к формированию BOS. Это важная информация для анализа: можно видеть, на каких уровнях происходили ложные пробои, и как часто они вели к полноценным торговым сигналам. Полупрозрачные кружки (color.new(color.green,70)) не перегружают график, но дают ценную информацию для совершенствования торговой стратегии.
В целом эти элементы лично для меня даже важнее чем остальная часть индикатора. Меня интересует именно формирование smt сигнала, а всё остальное можно интерпретировать по разному и лучше дальше следовать своей торговой системе, а не просто заходить на сигнале от 'чудо-индикатора'
Как использовать индикатор на практике
SMT-индикатор — это не просто графическая надстройка, а полноценная торговая система с четкими правилами входа и выхода. Вот как работать с ним эффективно:
1. Подготовка и настройка
Выберите коррелированные пары: BTC/ETH, EUR/GBP и EUR/(1/DXY), акции одной отрасли, металлы
Начните со стандартных настроек: Swing Size=2, Min BOS ATR=0.5, RR=2.0
Адаптируйте под свой стиль: для скальпинга уменьшайте Swing Size, для свинга — увеличивайте
2. Поиск сигналов
Сначала ищем цветные кружки — это SMT-сигналы (ложные пробои с расхождением)
Ждём стрелку — подтверждение BOS с достаточно крупным телом свечи
3. Оптимизация под рынок
Трендовый рынок: можно увеличить minBosATR до 0.7-1.0 для фильтрации слабых пробоев
Флэтовый рынок: уменшить Swing Size до 1 для большего количества сигналов
Высокая волатильность: увеличить RR до 2.5-3.0 для учета широких стопов
Заключение
SMT-индикатор — это системный подход к торговле, который объединяет три мощные концепции: анализ манипуляций в концепции ict (smart money), подтверждение через пробой структуры и риск-менеджмент через фиксированное RR.
Главное преимущество — объективность: правила четкие, сигналы не требуют особой интерпретации и являются однозначными.
Важное напоминание: ни один индикатор не дает 100% точности. Всегда используйте риск-менеджмент, не рискуйте более 1-2% капитала на сделку и тестируйте стратегию на демо-счете перед реальной торговлей.
