Разработка индикатора кумулятивной дельты (CVD) для трейдинга

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

Кумулятивная дельта индикатор: где ломается расчёт потока

Кумулятивная дельта индикатор выглядит простым: вычитаем объём продаж из объёма покупок и накапливаем результат по сделкам. Проблема в том, что расчёт потока заявок никогда не идёт одним непрерывным каналом — поток рвётся на переподключениях, а сделки приходят уже агрегированными биржей. Именно на стыках начинается накопление ошибки расчёта, которая дальше только растёт.

Типичный сбой: соединение отваливается на несколько секунд, и часть сделок не доезжает. При восстановлении приходит снимок книги заявок и текущий поток, но пропущенный интервал остаётся дырой — дельта на этом участке недосчитана. Обратная ошибка тоже бывает: буфер применяется повторно, и один и тот же объём попадает в дельту дважды. Если пересчёт идёт только вперёд, отставание остаётся в кривой до конца дня: ошибка не затухает, а интегрируется вместе со значением.

Второй источник — агрегация. Одна запись о сделке может содержать десятки исполнений, в том числе по разным сторонам спреда, а история баров отдаёт объём без разделения на агрессора. Если сводить тиковые данные с барами без сверки, дельта бара расходится с дельтой по сделкам — и это расхождение тоже накапливается.

На графике это выглядит правдоподобно: кривая идёт, дивергенции рисуются. Но дисбаланс объёма в ней уже смещён, поэтому ложные сигналы индикатора появляются именно там, где поток был нестабилен. Разбираем, как это закрывается.

Что даёт индикатор: скорость расчёта и устойчивость

Точность расчёта держится на постоянной сверке, а не на доверии к одному потоку. Каждое обновление проходит проверку порядка и уникальности, а накопленная сумма периодически пересчитывается из истории сделок. Расхождение — это не шум, а сигнал о разрыве, и его мы видим сразу, а не через час торговли на кривой линии индикатора.

Основной источник ошибок — пропущенные обновления. Индикатор ведёт счётчик разрывов последовательности, и при любом пропуске догружает нужный отрезок из архива сделок, после чего пересчитывает значение за этот интервал. Доля пропусков при штатной работе — десятые доли процента, и она не накапливается: один разрыв не превращается в смещение графика к концу сессии.

Время восстановления потока измеряется секундами. При обрыве канала индикатор переподключается сам, догружает пропущенное окно и продолжает расчёт с корректного состояния — без ручного перезапуска и пересборки истории заново. Инженеры видят это по журналу: каждое восстановление оставляет запись с длительностью разрыва и объёмом догруженных данных.

Устойчивость обеспечивается идемпотентной обработкой: повторно пришедшее событие не удваивает объём, а границы торговых сессий и всплески активности не сдвигают накопленную сумму. За счёт сглаживания на нескольких интервалах и отсечки аномальных выбросов число ложных сигналов снижается примерно вдвое — индикатор перестаёт реагировать на случайные крупные сделки и разрывы ленты.

Режимы расчёта объёмного дисбаланса: поток заявок против сделок

Режим расчёта задаёт, что именно попадает в дельту: приращение объёма по агрессивным сделкам или изменение лимитных заявок в стакане. Смысл один — перевес покупателей над продавцами, — но чувствительность и требования к источнику у подходов разные. Выбор упирается не в формулу, а в то, какие данные площадка отдаёт без потерь.

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

Вариант расчёта Когда подходит Ограничения источника
Агрессивные сделки (лента сделок) нужен чистый перевес инициатора и низкая задержка не во всех сделках указана сторона, возможны пропуски
Поток заявок по стакану нужна реакция до исполнения редкие срезы стакана, часть ликвидности уходит вне его
Сделки плюс изменения стакана поиск скрытого давления и крупных лимитов требуется точная синхронизация двух каналов по времени
Свечные данные за интервал длинная история без глубокой ленты направление внутри интервала теряется, дельта приблизительна

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

Этапы внедрения: от аудита данных до передачи в работу

Работу начинаем не с кода, а с разбора того, откуда приходят данные и что именно складывается в дельту. Индикатор ломается не на формуле, а на стыках: расхождение объёмов между источниками, пропуски в потоке, разная трактовка агрессивных сделок. Порядок этапов выстроен так, чтобы каждый следующий опирался на проверенный предыдущий — иначе ошибку в расчёте находят уже на живой торговле.

  1. Аудит данных и требований. Сверяем источники: какие сделки доступны, на какую глубину отдаётся история, как приходит поток. Фиксируем расхождения между площадками и выбираем основной источник, с которым будем сверяться дальше.
  2. Схема расчёта. Описываем формулу словами и псевдокодом: какие сделки идут в покупку, какие в продажу, как накапливается дельта за сессию и по какому событию обнуляется — смена торгового дня, рестарт или разрыв связи.
  3. Настройка сбора данных. Поднимаем подписку на поток, добавляем переподключение после обрывов, отбрасывание дублей и локальный архив сделок. Архив нужен, чтобы любой участок можно было пересчитать и получить тот же результат.
  4. Проверка на истории. Прогоняем схему на накопленных данных и сверяем значения с независимым расчётом. Отдельно смотрим волатильные участки, низколиквидные часы и моменты смены дня — там расхождения вылезают чаще всего.
  5. Вывод в терминал. Подключаем индикатор к рабочему месту трейдера: панель со значением дельты, перерисовка в реальном времени, понятное поведение при потере связи — последнее известное значение вместо пустого экрана.
  6. Передача в эксплуатацию. Отдаём схему расчёта, конфигурацию сбора, журнал проверок и регламент на сбои. Держим сопровождение: правки формулы и порогов идут через тот же прогон на истории, без изменений «на живую».

Ключевой принцип — любое изменение сначала проходит проверку на архиве и только потом попадает в терминал.

Состав поставки: конфигурации, схемы, регламенты

Индикатор кумулятивной дельты — это не только расчётная логика, но и весь контур, который её питает, наблюдает и обслуживает. Поэтому в поставку входит не набор файлов, а комплект, по которому ваша команда сможет развернуть систему заново, отладить расхождение и передать работу другому подрядчику без восстановления контекста с нуля.

  • Рабочие конфигурации — перечень торговых пар, окон агрегации, порогов фильтрации аномальных сделок и адресов источников, вынесенные в отдельные файлы настроек: добавление пары не требует правки кода.
  • Схемы потоков данных — путь от приёма биржевых сделок и обновлений стакана до агрегации дельты, построения кумулятивной кривой и отдачи в панель, с отмеченными точками отказа и буферами на случай разрыва соединения.
  • Документация по расчёту — формула дельты, обработка незакрытых свечей, моменты сброса кумулятивной суммы, поведение при пропусках и расхождении с эталонным источником.
  • Регламент перезапуска — порядок запуска компонентов, восстановление состояния из снапшота, проверка целостности данных после рестарта и действия при рассинхроне.
  • Правила доступа — матрица ролей от администратора до режима только чтение, порядок хранения ключей к торговым сервисам, ограничения по адресам и ротация секретов.
  • Инструкция по развёртыванию — сборочные файлы, переменные окружения, порядок обновления схемы хранения и настройка оповещений о сбоях.
  • Комплект сопровождения — чек-лист выпуска версии, журнал изменений и карта ответственных за каждый узел.

Все артефакты передаются в вашем репозитории с историей правок, а не архивом — дальше систему можно развивать своими силами.

Кейс: сведение сигналов и метрики до и после

Что расходилось до переработки

Клиент — команда алгоритмической торговли: индикатор кумулятивной дельты считался в браузере из потока сделок биржевого канала. При разрыве соединения подписка пересоздавалась, часть сделок приходила повторно, дедупликации по идентификатору не было — накопленное значение «уезжало» и к концу сессии расходилось с эталоном на 6-11%.

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

Что изменили и что получили

Расчёт перенесли на серверную сторону: один нормализованный поток сделок с Binance, дедупликация по идентификатору, догон пропущенного окна запросом истории после разрыва, чекпоинты накопленного значения. Все таймфреймы строятся из одного ряда, поэтому дельта на минуте, часе и дне всегда согласована.

После переработки расхождение с эталоном держится в десятых долях процента, разрыв канала закрывается автоматическим догоном за секунды, а доля сессий с заметным расхождением снизилась с 7% до 0,2%. Объём хранимой истории вырос умеренно: храним агрегаты и чекпоинты, а не полный поток тиков, и пересчёт от любой точки остаётся возможным.

Что делать, если терминал уже считает похожий показатель?

Встроенный в терминал показатель и наш расчёт почти никогда не совпадают до последней цифры — и это не обязательно ошибка. Расхождение даёт разница в правилах агрегации: источник данных, определение стороны инициатора сделки, момент обнуления накопления и наличие сглаживания. Пока эти правила не выписаны, спорить о величине отклонения бессмысленно.

Сверка идёт на одном инструменте и одном интервале: оба расчёта прогоняются на идентичной истории, а расхождения раскладываются по причинам. Типовых точек три — границы торговой сессии, где один алгоритм начинает накопление заново, а второй тянет его дальше; пропуски в потоке сделок, которые заполняются по-разному; пересчёт объёма между единицами инструмента. Каждое расхождение либо объясняется правилом, либо уходит в доработку.

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

Свой расчёт запускаем параллельно на тех же данных: история пересчитывается, расхождения пишутся в журнал с указанием интервала и инструмента, торговля идёт на прежнем показателе. Переключение — только после того, как отклонение сойдётся на всей истории. Если эталон пришёл из TradingView или другого терминала, его формулы и настройки фиксируем в документации — тогда следующая сверка занимает часы, а не дни.

Сомнения по расчёту: пропуски, нагрузка, история

Считать кумулятивную дельту на ровной истории несложно — сложности начинаются в потоке. Обрыв канала к бирже, перезапуск сборщика, плановые работы на площадке: в ленте сделок появляется окно, которое нельзя просто залить нулями. От того, как индикатор ведёт себя в этих местах, зависит, можно ли принимать по нему решения.

Ниже — вопросы, которые чаще всего снимаем до старта работ.

Что произойдёт при пропусках данных в потоке сделок?

Разрыв помечается в хранилище как разрыв, а не заполняется нулями или интерполяцией — иначе дельта на этом участке становится вымышленной. После восстановления канала пропущенные сделки подтягиваются из архива площадки, а если архив недоступен, участок остаётся явно помеченным до следующей сверки. Расчёт продолжается от накопленного значения, без обнуления, поэтому индикатор не «перезапускается» посреди сессии.

Как индикатор переносит нагрузку на инфраструктуру?

На всплесках активности число сделок растёт на порядок, и запись «одна сделка — одна строка» перестаёт работать. Поток буферизуется и пишется окнами фиксированного интервала, при этом сохраняются объём, знак и число сделок — для дельты этого достаточно. Буфер ограничен: при переполнении данные сбрасываются на диск, а не теряются, поэтому задержка сигнала остаётся предсказуемой и не растёт вместе с очередью.

Насколько глубока история и как проверяется корректность?

Глубина определяется тем, какие интервалы нужны стратегии: для дневных графиков достаточно агрегатов, для работы на отдельных сделках — сырая лента. Храним оба слоя и держим их согласованными: агрегат всегда пересобирается из сырых сделок, это даёт независимую сверку. Проверка корректности — контрольные точки: сумма дельт по интервалам сходится с дельтой за период, объёмы покупок и продаж сходятся с объёмом из свечей, а на известных рыночных событиях значения совпадают с эталонным расчётом.

Обсудим задачу и вернёмся с планом работ

Чтобы оценка опиралась на факты, а не на общие пожелания, разбираем задачу до старта разработки. Ниже — то, что нужно от вас при обсуждении задачи; с этими вводными мы вернёмся с планом работ, где зафиксированы схема расчёта, сроки и критерии приёмки.

  • Требования к данным: нужны только биржевые сделки или ещё стакан и лента заявок; тиковый или агрегированный формат, глубина истории, число площадок.
  • Доступы к источникам: ключи к биржевым сервисам и архивам, режим чтения к вашему хранилищу, проверка лимитов запросов — расчёт не должен упираться в ограничения на длинной истории.
  • Инструменты и интервалы: список торговых пар, рабочие таймфреймы, окно накопления кумулятивной дельты и правило перезапуска при разрыве соединения.
  • Целевые метрики: что считаем полезным сигналом — расхождение дельты с ценой, всплеск объёма, смена знака; по ним сверяем выдачу индикатора.
  • Точки интеграции: куда отдаём значения — терминал, дашборд, торговый робот или внешний сервис; в каком виде и с какой задержкой нужны числа.
  • Формат приёмки: как проверяем результат — сверка с эталонным расчётом, тестовый период, журнал сигналов и порядок разбора расхождений.

Опишите задачу в свободной форме: что уже есть, какие данные доступны, что должно получиться на выходе. Обсудим задачу и вернёмся с оценкой и планом работ — с конкретными этапами, а не с общими обещаниями.

Направления блокчейн-разработки

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1140