Для связки IOST–XPR (внутри одной биржи, кросс-биржево или через «круговые» маршруты) критично иметь корректные котировки с минимальной задержкой и единый расчёт маржи (валовой/чистой) с учётом комиссий, сетевых издержек и проскальзывания. Ниже — практическое руководство по архитектуре, источникам данных (REST/WebSocket), валидациям (checksums, sequence), синхронизации времени и формулам для PnL/edge, пригодное для production.
Архитектура потока данных (высокоуровнево)
-
Маркет-датчики (Market Data Ingest):
-
WebSocket-подписки на топ книги цен (Level-1) и/или глубину (Level-2/Level-3) по IOST/… и XPR/… на целевых площадках.
-
Параллельно периодические REST-снапшоты для начальной и внеплановой ресинхронизации книги.
-
-
Нормализация:
-
Приведение тикеров к унификаторам (например, IOST/USDT, XPR/USDT), единиц и знаков после запятой, времени к UTC.
-
-
Валидации:
-
Контроль sequence/ lastUpdateId, сверка checksum (если биржа публикует), дедупликация и упорядочивание дельт.
-
-
Калькуляторы:
-
Расчёт mid, best bid/ask, спрэда, VWAP на требуемом объёме, теоретической цены обмена по маршруту.
-
Расчёт валовой маржи (на «грязном» спреде) и чистой маржи с учётом всех издержек.
-
-
Хранилище:
-
Временной ряд (TSDB) для котировок/метрик, журналы исполнения, журналы сетевых транзакций (мосты/выводы).
-
-
Алертинг и оркестрация:
-
Триггеры на наблюдаемый 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-паттерну)
-
Получить snapshot книги через REST: список bid/ask уровней + lastUpdateId/U.
-
Начать слушать WebSocket-дельты (пока грузим снапшот — буферизуем дельты в памяти).
-
Отфильтровать дельты: применяем только те, у которых U/u > lastUpdateId снапшота и без пропусков по sequence.
-
Применять UPDATE:
-
Если объём на уровне > 0 — обновить/добавить уровень.
-
Если объём = 0 — удалить уровень.
-
-
Периодически сверять 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
Частые варианты:
-
Внутри одной биржи: IOST/USDT ↔ XPR/USDT.
-
Кросс-биржевой: покупка IOST на площадке A, продажа XPR на площадке B (через обмен/мост).
-
Круговой: 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, effCex+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, effPsell, 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}DepthkQ (отношение к глубине первых 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Δ.
Итоги и практические советы
-
WS для онлайна, REST для ресинка: классический «snapshot + deltas» с контролем sequence/checksum.
-
Нормализуйте всё: тикеры, шаги, время, валюту базы — иначе маржа «поплывёт» на округлениях.
-
VWAP-модель по объёму обязательна — простого mid недостаточно даже на «толстых» стаканах.
-
Чистая маржа = валовой edge минус весь «хвост» издержек: комиссии, сети, ребейты (дисконтируйте волатильные), slippage, оперрасходы.
-
Сигналы показывайте только при Edge_obs ≥ Edge_min + подушка и зелёном статусе датчиков качества данных.
-
Логи и метрики — ваш «чёрный ящик»: без них нельзя ни доказать, ни улучшить стратегию.
-
Резервная стратегия: при деградации потока данных — остановка сигналов, форс-ресинк, снижение объёма, алерт инженеру.
Следуя этим правилам, вы превратите сбор котировок и расчёт маржи для IOST–XPR из «набора виджетов» в надёжный конвейер, на выходе которого — проверяемые метрики и управляемые решения об исполнении.
Данный материал не является инвестиционной, финансовой, налоговой или юридической рекомендацией. Информация носит образовательный характер. Рынки волатильны, риски на стороне читателя; нет гарантий доходности. Перед принятием решений проконсультируйтесь со специалистом.












Оставить коммент.