Торговля¶
В данном разделе описан полный жизненный цикл ордера: от получения тикерной информации через Gateway до размещения ордера непосредственно в Exchange API и исполнения в торговом движке.
Архитектура торгового потока¶
Торговля в Univex разделена на два уровня:
- Тикерная информация — предоставляется через Gateway → TradesAggregator: котировки, цены, объёмы.
- Торговые операции — выполняются напрямую через Exchange API (
/api/v1/) по подписанным запросам с API-ключом (HMAC-SHA256). Gateway не участвует в размещении ордеров.
Получение тикерной информации¶
Перед размещением ордера пользователь получает актуальные рыночные данные:
- Пользователь обращается к Gateway (например,
GET /tickers). - Gateway проксирует запрос в TradesAggregator.ListTickerInfo.
- TradesAggregator возвращает текущие цены, объёмы и спреды по торговым парам.
Размещение ордера¶
Шаги процесса¶
- Пользователь отправляет запрос POST /api/v1/orders/place/ непосредственно в Exchange API с подписью API-ключа (HMAC-SHA256).
- Exchange API выполняет валидацию:
- Проверка временного окна (
RecvWindow). - Верификация HMAC-SHA256 подписи API-ключа.
- Проверка лимита запросов (rate limit).
- Проверка статуса аккаунта и наличия достаточного баланса.
- Проверка временного окна (
- Exchange API вызывает Engine.AddOrder (gRPC) с деталями ордера.
- Exchange Engine выполняет матчинг в L3-ордербуке:
- При совпадении с противоположной заявкой — создаются сделки (trades).
- Балансы покупателя и продавца обновляются атомарно.
- Engine публикует обновления через gRPC-стримы.
- Exchange API рассылает обновления подписчикам через WebSocket.
Диаграмма: Торговый поток¶
sequenceDiagram
actor U as Пользователь
participant GW as Gateway
participant TA as TradesAggregator
participant API as Exchange API
participant ENG as Exchange Engine
participant WS as WebSocket клиенты
U->>GW: GET /tickers
GW->>TA: ListTickerInfo()
TA-->>GW: Тикеры (цены, объёмы, спреды)
GW-->>U: Рыночные данные
Note over U,API: Размещение ордера — напрямую в Exchange API
U->>API: POST /api/v1/orders/place/\n(API Key + HMAC-подпись)
API->>API: Валидация RecvWindow
API->>API: Верификация HMAC-подписи
API->>API: Проверка rate limit
API->>API: Проверка статуса аккаунта и баланса
API->>ENG: AddOrder(gRPC)\n{pair, side, type, price, amount}
ENG->>ENG: Матчинг в L3-ордербуке
alt Ордер исполнен (полностью или частично)
ENG->>ENG: Создать Trade-записи
ENG->>ENG: Атомарное обновление балансов
end
ENG-->>API: OrderResponse (order_id, status, fills)
API-->>U: HTTP 200 OK + данные ордера
ENG--)API: gRPC stream: обновления ордербука/сделок
API--)WS: WebSocket push: обновления подписчикам
Ордербук¶
Получение снимка ордербука¶
Публичные пользователи могут получить текущее состояние ордербука:
- REST:
GET /api/v1/exchange/orderbook/?pair=BTC_USDT&depth=20 - WebSocket: подключение к
wss://.../exchange/ws/orderbook/
При REST-запросе API обращается к Engine.GetOrderbook (gRPC) и возвращает массивы bid/ask с ценами и объёмами.
При WebSocket-подключении API вызывает Engine.SubscribeOrderbookSnapshots — движок отправляет снимки ордербука с заданным интервалом или при каждом изменении.
Формат ответа ордербука¶
{
"pair": "BTC_USDT",
"bids": [
["65000.00", "0.5"],
["64990.00", "1.2"]
],
"asks": [
["65010.00", "0.3"],
["65020.00", "0.8"]
],
"timestamp": 1712345678901
}
Отмена ордера¶
Шаги процесса¶
- Пользователь отправляет POST /api/v1/orders/cancel/ с указанием
order_id(подпись API-ключа обязательна). - Exchange API проверяет принадлежность ордера пользователю.
- API вызывает Engine.CancelOrder (gRPC).
- Engine удаляет ордер из ордербука.
- Зарезервированные средства возвращаются в доступный баланс.
sequenceDiagram
actor U as Пользователь
participant API as Exchange API
participant ENG as Exchange Engine
U->>API: POST /api/v1/orders/cancel/\n{order_id}
API->>API: Проверка принадлежности ордера
API->>ENG: CancelOrder(gRPC) {order_id}
ENG->>ENG: Удалить ордер из ордербука
ENG->>ENG: Освободить зарезервированный баланс
ENG-->>API: OK
API-->>U: HTTP 200 OK
Типы ордеров¶
| Тип | Описание |
|---|---|
LIMIT |
Ордер по указанной цене или лучше |
MARKET |
Исполняется немедленно по лучшей доступной цене |
LIMIT_MAKER |
Только добавляет ликвидность (отклоняется, если исполнился бы сразу) |
Статусы ордера¶
| Статус | Описание |
|---|---|
NEW |
Ордер принят и добавлен в ордербук |
PARTIALLY_FILLED |
Частично исполнен |
FILLED |
Полностью исполнен |
CANCELLED |
Отменён пользователем или системой |
REJECTED |
Отклонён при валидации |
Связанные разделы¶
- Управление балансами — резервирование средств при создании ордеров и расчёт при исполнении.
- Регистрация и аутентификация — создание API-ключей и подпись запросов.
- P2P-торговля — альтернативный торговый процесс через P2P-сервис.