В этой статье я разбираю всё на примере бычьей дивергенции RSI (сигнал на LONG). Но метод не привязан к конкретному индикатору или типу сигнала. На место RSI можно подставить MACD, Stochastic, Bollinger Bands, любую группу индикаторов или произвольный набор правил/фильтров. Задача везде одна: понять, как ваш фильтр ведет себя на разных таймфреймах одновременно. Меняются входные данные — логика остается той же.
Я занимаюсь оптимизацией торговых алгоритмов. Через мои руки прошли сотни стратегий — на RSI, на MACD, на кастомных фильтрах и других десятках индикаторов и их комбинаций. Главная причина слива не меняется: алгоритм заходит в сделку на основании одного графика и не проверяет, подтверждают ли его остальные. Карты таймфреймов нет.

Бычью дивергенцию RSI хейтят. Стабильно. Трейдер видит: цена ушла ниже, а RSI нарисовал более высокий минимум. Заходит в LONG. Ловит стоп. Объявляет метод мусором.Но проблема не в индикаторе. Проблема в том, на каком таймфрейме сигнал считан — и что в этот момент происходит на соседних.
Сегодня разберем: математику бычьей дивергенции RSI, конфликт таймфреймов и метод построения карты, которая решает проблему. Повторюсь: та же логика работает для MACD, Stochastic, групп индикаторов и любых правил фильтрации.
1. Цена и индикатор — два параллельных уравнения

На примере бычьей дивергенции RSI это видно особенно чисто.
Цена — дискретный временной ряд. Новый минимум ниже предыдущего — это факт: Low[0] < Low[1].
RSI — производная. Считает не координату, а скорость. Упрощенная формула:
RSI = 100 — (100 / (1 + (Avg_Gain / Avg_Loss)))
Avg_Gain — средний прирост за N периодов.
Avg_Loss — среднее падение за те же N периодов.
Смоделируем бычью дивергенцию (LONG):
Предыдущий минимум: свеча пролетела вниз с сильным импульсом. Close[1] — Open[1] — большое отрицательное число. RSI ушел глубоко вниз, скажем, до 25.
Текущий минимум: цена сходила еще ниже (обновила Low), но закрылась почти на уровне открытия — длинная нижняя тень, узкое тело. Close[0] — Open[0] ~ 0.
Что видит RSI? Последнее падение — копейки. В окне расчета еще сидит старое жирное падение от первого минимума. Но сейчас Avg_Loss перестал расти, а Avg_Gain начал подрастать на отскоке. Итог: RSI идет вверх.
На графике цены — новый минимум (ниже). На индикаторе — более высокий минимум. Это и есть бычья дивергенция.
Математически: скорость падения упала при снижении координаты. Продавцы выдохлись. Физика, а не магия.
Та же логика применима к MACD (схождение скользящих при новом минимуме цены), к Stochastic (положение закрытия относительно диапазона High-Low), к любому осциллятору. Везде индикатор — функция от цены, не сама цена. И везде конфликт между значением функции и значением аргумента порождает сигнал.
2. Почему сигнал есть на одном таймфрейме и отсутствует на другом
Причина — разное окно расчета.
Период 14 для разных таймфреймов:
1H: 14 баров = 14 часов. Два торговых дня. Шум отфильтрован. Падение импульса видно четко.
15m: 14 баров = 3.5 часа. Локальный микропамп, невидимый на часовике, здесь может занимать треть окна.
5m: 14 баров = 70 минут. Шум доминирует над трендом.
Ситуация: на 1H сформирована бычья дивергенция RSI — сигнал на LONG. Переключаетесь на 15m — индикатор в нейтральной зоне, никакого сигнала.
Причина: на 15-минутке Avg_Gain и Avg_Loss считаются по другому набору приростов и падений. Локально падение еще продолжается. Алгоритм на 15m не видит, что продавцы выдохлись.
Если у вас вместо RSI — MACD, картина та же. На одном ТФ гистограмма уже развернулась вверх, на другом — продолжает снижаться. Если группа индикаторов — на старшем ТФ три из трех дают сигнал LONG, на младшем — один из трех. Конфликт частот не зависит от конкретного индикатора.
Именно здесь теряются деньги: вход в LONG по старшему ТФ без подтверждения с младших. Цена еще может сходить вниз на младших частотах и собрать стопы.
3. Сила сигнала — это количество подтверждающих таймфреймов

Правило фильтра имеет разный вес в зависимости от того, сколько частот его подтверждают. Без привязки к конкретному индикатору:
Слабый сигнал: Бычья дивергенция только на 1H. Младшие ТФ — нейтрально или продолжают падать.
Фундаментально продавцы выдыхаются, но внутридневные участники еще разгоняют падение. Вход в LONG — высокая вероятность стопа на младшем таймфрейме.
Средний сигнал:Бычья дивергенция на 1H и 30m. Младшие молчат.
Процесс пошел, но синхронизации с мелкими частотами нет. Вход возможен, но с пониженным плечом и расширенным стопом.
Сильный сигнал (резонанс):Бычья дивергенция подтверждена на 5m, 15m, 30m, 1H, 4H.
Все частоты синхронизировались. Продавцы выдохлись на всех уровнях одновременно. Против вас нет ни одной группы участников, у которых «еще падаем». Максимальная вероятность отработки LONG.
Без автоматизированного анализа вы не видите эту картину. Вы смотрите на 1-2 графика. Рынок живет на сотнях таймфреймов. Неважно, RSI у вас, MACD или кастомный фильтр — конфликт частот везде одинаков.
4. Объем вычислений: почему это не считается руками
Построим границы задачи.
Исходные данные:
Один актив.
Первичные данные: минутные свечи. Один массив. Всё.
Основной торговый таймфрейм: 1H.
Проверяемый диапазон: от 5m до 1440m.
Шаг перебора: 5 минут.
Количество таймфреймов для проверки:
5m, 10m, 15m… 1440m = 288 уникальных таймфреймов.
Почему CPU.
Все 288 таймфреймов не нужно скачивать с биржи отдельными файлами. Это архитектурное безумие: 288 файлов на инструмент, и каждый еще множится на сдвиги выравнивания.
Правильный подход: есть один массив минуток. Из него на лету собирается любой нужный таймфрейм. Алгоритм сборки: берем 5 минуток — получаем 5m. Берем 15 минуток — 15m. Берем 60 минуток — 1H. И так для любого N от 1 до 1440.
Операция сборки баров из минуток — последовательная. Нужно пройти N минуток подряд, взять Open первой, Close последней, High и Low по диапазону. Это чистая CPU-задача. Однопоточный перебор с накоплением. GPU здесь не нужен: передача данных в память видеокарты и обратно съест весь выигрыш, а распараллеливание не даст преимущества на последовательном проходе.
Где возникает вычислительная сложность.
Не в сборке баров. В том, что для каждого из 288 ТФ нужно на каждом баре пересчитать индикатор:
Для RSI: Avg_Gain и Avg_Loss по окну из 14 баров.
Для MACD: быстрая и медленная EMA, сигнальная линия, гистограмма.
Для группы индикаторов: пересчет всей группы для каждого ТФ.
Дальше — больше:
Сдвиг начала отсчета на 1 минуту меняет структуру свечей. Нужно проверить каждый ТФ с несколькими вариантами выравнивания.
Для каждого ТФ ищутся сигналы (бычья дивергенция) и сравниваются с основным ТФ.
Всё считается не для одной точки, а по всему историческому диапазону.
На выходе — тепловая карта:
Таймфрейм Зона 1 Зона 2 Зона 3… Зона N
5m Нет Да Нет… Да
15m Да Да Нет… Нет
30m Да Нет Да… Да
1H (осн) Да Да Нет… Да
4H Нет Да Да… Нет
Каждая ячейка — ответ: «В этой зоне рынка, на этом таймфрейме, бычья дивергенция разрешает LONG?»
Количество ячеек — тысячи. Каждая требует пересчета индикатора по своему окну данных, собранному из минуток.
Python vs Go.
Python на таком объеме встает намертво. Не часы. Не дни. Недели на один инструмент. С форвард-тестом и перебором параметров — месяцы. Причина не в языке как таковом, а в накладных расходах на интерпретацию каждого вызова, в том что библиотеки тех. анализа не заточены под пересчет сотен ТФ на лету, и в GIL, который душит любую попытку распараллеливания на CPU.
Go выигрывает здесь у всех языков. Легковесные горутины, минимальные накладные расходы на конкурентность, управление памятью без пауз на GC в критических секциях. Но есть нюанс: победить на этом классе задач можно только при наличии многоуровневой системы. Одна горутина на сборку баров, другая на пересчет индикатора, третья на проверку фильтра — и всё это должно работать не вразнобой, а с четкой иерархией: уровень минутных данных → уровень агрегации ТФ → уровень индикаторов → уровень сигналов → уровень итоговой карты.
Именно такая архитектура заложена в Aranea. Многоуровневая система, где каждый слой получает данные от нижнего, обсчитывает свою часть и передает выше. Без этого любая горутина начинает жить своей жизнью, и вы получаете рассинхрон между сигналом на 1H и сигналом на 15m — ровно то, из-за чего стратегия сливает.
Один массив минуток в памяти → многоуровневая сборка → пересчет индикаторов → проверка фильтров → тепловая карта таймфреймов. И всё это за минуты, а не за месяцы.
5. Что дает тепловая карта таймфреймов

Зоны ложных допусков. Таймфреймы, где бычья дивергенция есть, но остальные частоты не подтверждают. Исключаются из LONG.
Зоны резонанса. Комбинации, где бычья дивергенция подтверждена на всех частотах. Точки входа в LONG с максимальной вероятностью отработки.
Переиспользуемость. Карта строится под правило фильтра, не под конкретный индикатор. Построили для «бычья дивергенция + подтверждение по ТФ» — работает для RSI, MACD, Stochastic. Заменили индикатор — та же методология, новое окно расчета, новая карта.
Анализ, не подгонка. Карта выявляет статистически значимые зоны на всей истории. Это не оптимизация параметров под кривую.
6. Вывод
Бычья дивергенция RSI — только пример. Та же проблема у MACD, Stochastic, Bollinger Bands и любых пользовательских фильтров. Индикатор дает сигнал LONG на одной частоте, молчит на другой, и трейдер теряет деньги, не понимая почему.
Но анализ одного индикатора на 288 таймфреймах — это только первый слой задачи. Тот слой, с которого всё начинается.
Дальше масштабирование выглядит так:
Слой 1: Формы индикатора.
Один и тот же RSI может давать сигналы в разных формах. Бычья дивергенция. Конвергенция. Выход из зоны перепроданности. Пробой трендовой линии на самом индикаторе. Каждая форма — это отдельное правило фильтра. И каждая форма требует своей тепловой карты таймфреймов. Один индикатор × 4 формы = 4 полных цикла расчета по 288 ТФ.
Слой 2: Система открытия позиции.
Одна сделка, усреднение, серия входов, хедж-торговля — всё это не просто механики, а логические формулы, которые должны быть заложены в оптимизацию до начала расчетов. Не «сначала посчитаем сигналы, а потом придумаем, как входить». Формула входа определяет, какие именно данные нужны от карты таймфреймов и в каком формате. Заложили формулу «усреднение на младших ТФ» — получили одну матрицу итоговых данных. Заложили «хедж между 1H и 15m» — получили совершенно другую разметку разрешенных и запрещенных состояний. Без этого карта таймфреймов — просто красивая таблица. С формулой — готовое торговое правило.
Итоговая размерность задачи:
Один индикатор × N форм × логическая формула входа × 288 ТФ × сдвиги выравнивания × полный исторический диапазон.
Каждый новый слой умножает количество проверяемых комбинаций. Ручной анализ отваливается на первом же слое. Python — на втором, и это недели вычислений. Go с многоуровневой архитектурой Aranea держит все слои в одном прогоне за минуты.
Если ваша стратегия «почти работает», но стабильно сливает на ложных входах — проблема с высокой вероятностью в карте таймфреймов на одном из слоев. Метод один для всех индикаторов и систем входа. Приносите алгоритм. Разберем ваши частоты на всех слоях.