CVD + ИИ подсказки: инструмент, который сам подсвечивает расхождения на графике цены и объёма

от автора

При выборе инструментов для анализа Order Flow быстро обнаруживается, что профессиональные терминалы (ATAS, VolFix, Tiger) стоят как хороший VPS, а в бесплатных версиях или задержка, или нет истории — только текущая свеча. Этого недостаточно для нормального анализа.

Ссылка на описание программы: Cumulative Volume Delta (CVD) Analyzer

Каждый, кто пробовал Order Flow, упирался в одну и ту же проблему: как именно считаются индикаторы? Что там вообще внутри? И если график вдруг начал показывать странные данные, непонятно, где искать причину — на уровне приёма данных, расчёта дельты или отрисовки.

Я немного изменил подход. Инструмент запрашивает готовые свечи с Binance через REST API и считает CVD (Cumulative Volume Delta) прямо в браузере. Никаких посредников, никаких скрытых преобразоваций. Данные обновляются при каждом запросе — вы всегда видите актуальную картину.

Расскажу, как всё работает: от получения свечей до готового графика с подсказками.

Почему не React и не сборщики

Рассматривался вариант с использованием современных фреймворков (Vite, React, Redux Toolkit), однако от него решено было отказаться. Основные причины: требование к мгновенному запуску без установки дополнительного ПО — инструмент должен открываться из локальной папки без подготовки окружения.

В итоге сделал просто HTML-файлы. Открываешь index.html — и погнали. Никаких npm install, никаких ошибок сборки.

Главная страница

Главная страница

Структура элементарная:

  • index.html — выбор пары и таймфрейма.

  • Cumulative Volume Delta (CVD).html — главный мозг. Там загружаются свечи с Binance, считается дельта и строятся индикаторы.

  • CVD charts.html — отдельный файл для детальной визуализации. Вынес его, чтобы отрисовка не мешала расчётам.

  • deepseek_analysis_CVD.html — болталка с ИИ, чтобы иногда подсвечивать странные моменты на графике.

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

Статистика кирптовалюты

Статистика кирптовалюты

Главная боль: как определить, кто покупал, а кто продавал?

Биржа в свечном API не пишет «здесь пришёл покупатель». Она присылает готовые бары: время, цену открытия, максимум, минимум, закрытие и объём. И в каждом баре есть отдельное поле — объём покупок по рыночным ордерам (taker buy volume).

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

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

Считаем дельту и накопление

Вот основная логика. Без лишней красоты, просто то, что работает при загрузке свечей:

function computeIndicators(candles) {  const delta = [];  const cvd = [];  let acc = 0;  for (let i = 0; i < candles.length; i++) {    const buyVol = candles.buyVol[i] || 0;    const totalVol = candles.volume[i] || 0;    const sellVol = totalVol - buyVol;    const currentDelta = buyVol - sellVol;    acc += currentDelta;    delta.push(currentDelta);    cvd.push(acc);  }  return { delta, cvd };}

currentDelta — это разница между объёмом покупок и продаж внутри свечи. CVD накапливается с начала сессии и обнуляется в полночь по UTC, чтобы синхронизироваться с биржевым днём.

Таблица свечного анализа

Таблица свечного анализа

Сглаживание, чтобы глаза не ломались

Сначала я выводил сырую дельту. Это было просто ужасно: один крупный маркет-ордер на 100 BTC рисовал красный столб на весь экран, и весь график превращался в иголку.

Я добавил простое экспоненциальное сглаживание (EMA с альфой 0.2) исключительно для отображения гистограммы. Сам CVD при этом считается строго по сырым данным без сглаживания, чтобы не терять накопленный объём.

const alpha = 0.2;smoothedDelta = previousSmoothed * (1 - alpha) + currentCandleDelta * alpha;

На графике теперь видны локальные всплески, но без «палок в потолок».

Табличный анализ CVD дивергенций

Табличный анализ CVD дивергенций

Зачем я прикрутил DeepSeek (и не жалею)

Идея родилась спонтанно. Вместе с графиком я решил выводить короткий текстовый комментарий к последним 15 свечам. Модуль анализирует последние 15 свечей и формирует JSON с изменениями цены, CVD и экстремумами дельты, после чего отправляет запрос в DeepSeek API. Модель возвращает краткий комментарий: например, фиксирует расхождение между движением цены и накопленным объёмом (классическая дивергенция), что помогает замечать странности без круглосуточного наблюдения.

Модуль собирает JSON с изменениями цены, CVD и максимумами дельты, шлёт в DeepSeek API, и модель возвращает 1–2 предложения.

Запрос к DeepSeek AI

Запрос к DeepSeek AI

Звучит как перебор? Возможно. Но на практике это помогает не пялиться в график 8 часов подряд — модель обращает внимание на аномалии. При этом я чётко написал в интерфейсе, что это не торговый сигнал, а вспомогательный комментарий.

Мини-ликбез для себя и коллег

Я добавил отдельную вкладку-шпаргалку (_Lesson.html), где расписал, что вообще означают эти разноцветные столбики на моём графике:

  • Дивергенция: цена обновила максимум, а CVD нет — жди коррекции.

  • Поглощение: дельта зелёная, а цена стоит на месте — значит, лимитники держат уровень.

  • Исчерпание: объёмы падают на сильном движении — возможно, это конец импульса.

Учебное пособие: Cumulative Volume Delta (CVD)

Учебное пособие: Cumulative Volume Delta (CVD)

Эта теория не новая, но когда она лежит прямо рядом с графиком и анимирована (отдельный файл с анимацией), новичкам проще вкатиться.

Что не так с моим решением

Это не замена ATAS:

  • Я не строю полноценный кластерный профиль (там объём по ценам), потому что не хочу тащить весь стакан на клиент.

  • Сброс CVD в ноль каждый день режет историю, и межсессионный анализ я не веду.

  • localStorage — не самый надёжный способ хранения при больших объёмах данных, но для этих задач хватает.

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

ссылка на оригинал статьи https://habr.com/ru/articles/1048902/