Техническая интеграция: как собирать котировки и считать маржу по IOST–XPR

Для связки IOST–XPR (внутри одной биржи, кросс-биржево или через «круговые» маршруты) критично иметь корректные котировки с минимальной задержкой и единый расчёт маржи (валовой/чистой) с учётом комиссий, сетевых издержек и проскальзывания. Ниже — практическое руководство по архитектуре, источникам данных (REST/WebSocket), валидациям (checksums, sequence), синхронизации времени и формулам для PnL/edge, пригодное для production.

Архитектура потока данных (высокоуровнево)

  1. Маркет-датчики (Market Data Ingest):

    • WebSocket-подписки на топ книги цен (Level-1) и/или глубину (Level-2/Level-3) по IOST/… и XPR/… на целевых площадках.

    • Параллельно периодические REST-снапшоты для начальной и внеплановой ресинхронизации книги.

  2. Нормализация:

    • Приведение тикеров к унификаторам (например, IOST/USDT, XPR/USDT), единиц и знаков после запятой, времени к UTC.

  3. Валидации:

    • Контроль sequence/ lastUpdateId, сверка checksum (если биржа публикует), дедупликация и упорядочивание дельт.

  4. Калькуляторы:

    • Расчёт mid, best bid/ask, спрэда, VWAP на требуемом объёме, теоретической цены обмена по маршруту.

    • Расчёт валовой маржи (на «грязном» спреде) и чистой маржи с учётом всех издержек.

  5. Хранилище:

    • Временной ряд (TSDB) для котировок/метрик, журналы исполнения, журналы сетевых транзакций (мосты/выводы).

  6. Алертинг и оркестрация:

    • Триггеры на наблюдаемый edge > порог безубыточности + подушка, контроль рассинхронизаций и «застывших» книг.

Источники данных и частоты обновления

WebSocket (основной слой)

  • Order Book Level-2 (агрегированные цены/объёмы по уровням) с частотой дельт реального времени.

  • Trades/Ticker: подтверждение принтов, контроль адекватности книги.

  • Heartbeat/Пинг-поны: поддержание соединения и измерение RTT (косвенная оценка задержки).

Рекомендации по частоте обработки:

  • Обрабатывать дельты как приходят; агрегация для расчётов — каждые 50–200 мс (в зависимости от задержек и нагрузки).

  • Для алертов по edge достаточно 200–500 мс окна, для исполнения — стремиться к «tick-by-tick» с локальным батчингом ≤50 мс.

REST (резерв/снапшот)

  • /depth для инициализации книги и периодической ресинхронизации (например, каждые 30–60 сек или по событию «checksum mismatch»).

  • /exchangeInfo /symbols /filters для точных шагов цены/количества, минимумов и лимитов.

  • /klines (опционально) для бэктестов и sanity-check (но не для онлайна).

Сбор и поддержание книги цен (snapshot + deltas)

Алгоритм (классический, близкий к Binance/OKX-паттерну)

  1. Получить snapshot книги через REST: список bid/ask уровней + lastUpdateId/U.

  2. Начать слушать WebSocket-дельты (пока грузим снапшот — буферизуем дельты в памяти).

  3. Отфильтровать дельты: применяем только те, у которых U/u > lastUpdateId снапшота и без пропусков по sequence.

  4. Применять UPDATE:

    • Если объём на уровне > 0 — обновить/добавить уровень.

    • Если объём = 0 — удалить уровень.

  5. Периодически сверять checksum (если биржа передаёт) либо выполнять REST-ресинк, если обнаружены:

    • пропуски sequence,

    • негативные тесты на монотонность лучших цен,

    • застой книги (>N секунд без апдейтов при наличии принтов).

Важные детали

  • Очередность: применяйте дельты строго в порядке sequence; при разрыве — full resync.

  • Размер книги: для маржинальных расчётов по объёму имеет смысл хранить до 50–100 уровней.

  • Отдельные книги по каждой площадке: не смешивайте до слоя агрегации (cross-venue).

Синхронизация времени (time sync)

  • Источник времени — UTC; синхронизация NTP со «стековыми» серверами; проверка дрейфа каждые 30–60 сек.

  • Локально храните смещение между временем биржи (из заголовков REST/пинга WS) и вашим; учитывайте его в метках.

  • Все расчёты edge/маржи логируйте с точностью до миллисекунд, чтобы сопоставлять с принтами и исполнением.

Контрольные суммы и валидации

  • Если биржа публикует CRC32 checksum для первых X уровней книги, считайте её после каждого батча обновлений и сравнивайте.

  • При несовпадении — сигнал предупреждения и инициируйте быстрый full resync (REST-снапшот → реплей буфера дельт).

  • Без checksum используйте суррогаты:

    • контроль монотонности цен и знаков объёма;

    • «оживаемость» книги (если trades идут, а best bid/ask не меняются дольше T — риск застывшей книги/сети);

    • сверка с альтернативным источником (второй дата-провайдер) по best-of-book.

Расчёт котировок для маршрутов и валовой маржи

Базовые метрики

  • Best Bid (BB) и Best Ask (BA) по каждой площадке.

  • Mid: mid=BB+BA2\text{mid} = \frac{\text{BB} + \text{BA}}{2}mid=2BB+BA​.

  • Спред: spread=BA−BBmid\text{spread} = \frac{\text{BA} — \text{BB}}{\text{mid}}spread=midBA−BB​.

Объём-чувствительные цены (VWAP)

Для объёма сделки QQQ используйте VWAP по книге:

  • Покупка (taker-buy): суммируете объёмы на стороне ask до накопления QQQ; VWAP — объёмно-взвешенная цена.

  • Продажа (taker-sell): аналогично по стороне bid.

Это даст реалистичную «грязную» цену исполнения при агрессивной стороне. Для maker-логики используйте цена-таргет (join к лучшему уровню) и вероятностную модель частичного исполнения/ребейта.

Конструирование маршрута IOST–XPR

Частые варианты:

  1. Внутри одной биржи: IOST/USDT ↔ XPR/USDT.

  2. Кросс-биржевой: покупка IOST на площадке A, продажа XPR на площадке B (через обмен/мост).

  3. Круговой: IOST/USDT ↔ XPR/USDT ↔ IOST/USDT (или через бету к BTC/ETH).

Для каждого шага получите VWAP-цены на нужном объёме и сложите их в маршрутную формулу Gross:

Gross=Q⋅(Psell, eff−Pbuy, eff)\text{Gross} = Q\cdot(P_{\text{sell, eff}} — P_{\text{buy, eff}})Gross=Q⋅(Psell, eff​−Pbuy, eff​)

где Pbuy, effP_{\text{buy, eff}}Pbuy, eff​ и Psell, effP_{\text{sell, eff}}Psell, eff​ — эффективные VWAP-цены соответствующих шагов маршрута, приведённые к одной базе (например, USDT).

Чистая маржа: комиссии, сети, ребейты, проскальзывание

Переменные

  • fbuy/sellexf^{ex}_{buy/sell}fbuy/sellex​ — биржевые комиссии как доля от денежного оборота на ноге (учтите maker/taker).

  • RRR — ребейт (отрицательная комиссия) в денежном выражении, приведённый к базе.

  • CnetC_{net}Cnet​ — сетевые/мостовые издержки (выводы, депозиты, газ, wrap/unlock).

  • CmktC_{mkt}Cmkt​ — доп. рыночные издержки: остаточный slippage (над VWAP-моделью), market impact.

  • CopsC_{ops}Cops​ — операционные накладные (амортизированные на сделку).

  • CfundC_{fund}Cfund​ — фандинг/проценты (если деривативы/маржа).

Формулы

Комиссии бирж:

Cex=fbuyex⋅Q⋅Pbuy, eff+fsellex⋅Q⋅Psell, eff−RC_{ex} = f^{ex}_{buy}\cdot Q \cdot P_{\text{buy, eff}} + f^{ex}_{sell}\cdot Q \cdot P_{\text{sell, eff}} — RCex​=fbuyex​⋅Q⋅Pbuy, eff​+fsellex​⋅Q⋅Psell, eff​−R

Итоговая чистая маржа (в деньгах):

PNLnet=Q⋅(Psell, eff−Pbuy, eff)−(Cex+Cnet+Cmkt+Cfund+Cops)\text{PNL}_{net} = Q\cdot(P_{\text{sell, eff}} — P_{\text{buy, eff}}) — (C_{ex}+C_{net}+C_{mkt}+C_{fund}+C_{ops})PNLnet​=Q⋅(Psell, eff​−Pbuy, eff​)−(Cex​+Cnet​+Cmkt​+Cfund​+Cops​)

Минимальный спред безубыточности (в долях от Pbuy, effP_{\text{buy, eff}}Pbuy, eff​):

Edgemin≈Cex+Cnet+Cmkt+Cfund+CopsQ⋅Pbuy, eff\text{Edge}_{min} \approx \frac{C_{ex}+C_{net}+C_{mkt}+C_{fund}+C_{ops}}{Q\cdot P_{\text{buy, eff}}}Edgemin​≈Q⋅Pbuy, eff​Cex​+Cnet​+Cmkt​+Cfund​+Cops​​

Наблюдаемый edge:

Edgeobs=Psell, eff−Pbuy, effPbuy, eff\text{Edge}_{obs} = \frac{P_{\text{sell, eff}} — P_{\text{buy, eff}}}{P_{\text{buy, eff}}}Edgeobs​=Pbuy, eff​Psell, eff​−Pbuy, eff​​

Триггер допуска сделки:

Edgeobs≥Edgemin+Δ\text{Edge}_{obs} \ge \text{Edge}_{min} + \DeltaEdgeobs​≥Edgemin​+Δ

где Δ\DeltaΔ — «подушка» (например, +0,15–0,25 п.п.) на ошибки моделирования и задержки.

Модель проскальзывания (slippage)

  • Детерминированная: фиксированный процент от спрэда/цены (консервативно 10–30% видимого спрэда).

  • Эмпирическая: функция от QDepthk\frac{Q}{\text{Depth}_k}Depthk​Q​ (отношение к глубине первых k уровней), калибруется на истории исполнения.

  • Стохастическая: добавьте шум (например, нормальный с σ\sigmaσ по истории разницы «ожидание→факт»).

Контроль качества данных и устойчивость

Падение качества / стагнация книги

  • Триггер, если нет апдейтов best bid/ask более T секунд при наличии новых trades → вероятно, вы потеряли дельты.

  • Триггер по аномалиям спрэда (вырос > p-квантили исторического распределения) — возможно, отвалилась одна сторона книги.

Потери дельт / sequence-дыры

  • Если nextSeq ≠ lastSeq+1 → немедленный resync.

  • Ведите метрику частоты ресинков и флаг «degraded mode» для блокировки торговых сигналов.

Сводные метрики мониторинга (каждые 1–5 сек)

  • Latency (EWMA) по WS-сообщениям и REST-ответам.

  • Коэффициент «живости»: апдейты L2 за интервал / ожидаемое среднее.

  • Доля пропусков sequence.

  • Доля невалидных checksum.

  • Расхождение BOO с альтернативным провайдером.

Комиссии/ребейты и лимиты: автоматическая подгрузка

  • Регулярно (раз в 5–15 мин) обновляйте ставки maker/taker, VIP-уровни, требования по стейку токенов через служебные эндпоинты.

  • Храните временную шкалу ставок: пересчёт маржи за исторический интервал должен учитывать, какой тариф действовал в момент сделки.

  • Для сетей: кэшьте минимумы вывода, комиссию сети и требуемые подтверждения; логируйте фактические delays по блокам, чтобы конвертировать их в временную стоимость (opportunity cost).

Частота вычислений и агрегация

  • Для алертов edge: окно 200–500 мс с экспоненциальным сглаживанием (EWMA) по VWAP-ценам и спрэду.

  • Для backtesting/аналитики: агрегаты 1s / 5s / 1m (min/max/mean по edge, спрэду, глубине, latency).

  • Для PnL-аудита: хранить tick-точные VWAP и параметры сделки (лот, режим исполнения, комиссия/ребейт, расчёт slippage).

Управление рисками и блокировки

  • Edge-gate: сделки разрешены только при Edge_obs ≥ Edge_min + Δ и все датчики в зелёной зоне (latency, checksum, sequence).

  • Volume-gate: не брать объём > x% доступной глубины на первых k уровнях, иначе slippage «съест» edge.

  • Degraded mode: при частых ресинках/пропусках — выключать сигналы до стабилизации.

Мини-пример расчёта (концептуально)

  • В окне 300 мс калькулятор посчитал:

    • Покупка IOST (taker) VWAP на QQQ: 0,012345 USDT;

    • Продажа XPR (taker) VWAP на эквивалент: 0,012435 USDT.

  • Валовый edge: (0,012435−0,012345)/0,012345≈0,73%(0{,}012435-0{,}012345)/0{,}012345 ≈ 0{,}73\%(0,012435−0,012345)/0,012345≈0,73%.

  • Комиссии: обе ноги taker по 0,10% → Cex≈0,20%C_{ex} ≈ 0{,}20\%Cex​≈0,20% от оборота.

  • Сети/мосты/прочее: 0,18%.

  • Модельное slippage сверх VWAP: 0,12%.

  • Итого издержки: 0,50% → Edge_min = 0,50%.

  • Запас: 0,73−0,50=0,23%0,73 — 0,50 = 0,23\%0,73−0,50=0,23% < требуемой подушки 0,25 п.п. → сигнал отклонён.

Журналы и воспроизводимость

  • Trade-log: время, площадка, пара, сторона, объём, цена, комиссия, ребейт, orderId, maker/taker.

  • Book-log: снапшоты «до/после» исполнения (best 10–20 уровней) + sequence.

  • Chain-log: все on-chain tx (hash, сеть, комиссия, подтверждения, задержка).

  • Edge-log: входные котировки, рассчитанный VWAP, Edge_obs, Edge_min, причина допуска/отклонения.

Эти четыре журнала обеспечат аудит и позволяют откалибровать slippage-модель и подушку Δ\DeltaΔ.

Итоги и практические советы

  1. WS для онлайна, REST для ресинка: классический «snapshot + deltas» с контролем sequence/checksum.

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

  3. VWAP-модель по объёму обязательна — простого mid недостаточно даже на «толстых» стаканах.

  4. Чистая маржа = валовой edge минус весь «хвост» издержек: комиссии, сети, ребейты (дисконтируйте волатильные), slippage, оперрасходы.

  5. Сигналы показывайте только при Edge_obs ≥ Edge_min + подушка и зелёном статусе датчиков качества данных.

  6. Логи и метрики — ваш «чёрный ящик»: без них нельзя ни доказать, ни улучшить стратегию.

  7. Резервная стратегия: при деградации потока данных — остановка сигналов, форс-ресинк, снижение объёма, алерт инженеру.

Следуя этим правилам, вы превратите сбор котировок и расчёт маржи для IOST–XPR из «набора виджетов» в надёжный конвейер, на выходе которого — проверяемые метрики и управляемые решения об исполнении.

Данный материал не является инвестиционной, финансовой, налоговой или юридической рекомендацией. Информация носит образовательный характер. Рынки волатильны, риски на стороне читателя; нет гарантий доходности. Перед принятием решений проконсультируйтесь со специалистом.