Перейти к содержанию

Торговля

В данном разделе описан полный жизненный цикл ордера: от получения тикерной информации через Gateway до размещения ордера непосредственно в Exchange API и исполнения в торговом движке.

Архитектура торгового потока

Торговля в Univex разделена на два уровня:

  • Тикерная информация — предоставляется через GatewayTradesAggregator: котировки, цены, объёмы.
  • Торговые операции — выполняются напрямую через Exchange API (/api/v1/) по подписанным запросам с API-ключом (HMAC-SHA256). Gateway не участвует в размещении ордеров.

Получение тикерной информации

Перед размещением ордера пользователь получает актуальные рыночные данные:

  1. Пользователь обращается к Gateway (например, GET /tickers).
  2. Gateway проксирует запрос в TradesAggregator.ListTickerInfo.
  3. TradesAggregator возвращает текущие цены, объёмы и спреды по торговым парам.

Размещение ордера

Шаги процесса

  1. Пользователь отправляет запрос POST /api/v1/orders/place/ непосредственно в Exchange API с подписью API-ключа (HMAC-SHA256).
  2. Exchange API выполняет валидацию:
    • Проверка временного окна (RecvWindow).
    • Верификация HMAC-SHA256 подписи API-ключа.
    • Проверка лимита запросов (rate limit).
    • Проверка статуса аккаунта и наличия достаточного баланса.
  3. Exchange API вызывает Engine.AddOrder (gRPC) с деталями ордера.
  4. Exchange Engine выполняет матчинг в L3-ордербуке:
    • При совпадении с противоположной заявкой — создаются сделки (trades).
    • Балансы покупателя и продавца обновляются атомарно.
  5. Engine публикует обновления через gRPC-стримы.
  6. 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
}

Отмена ордера

Шаги процесса

  1. Пользователь отправляет POST /api/v1/orders/cancel/ с указанием order_id (подпись API-ключа обязательна).
  2. Exchange API проверяет принадлежность ордера пользователю.
  3. API вызывает Engine.CancelOrder (gRPC).
  4. Engine удаляет ордер из ордербука.
  5. Зарезервированные средства возвращаются в доступный баланс.
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 Отклонён при валидации

Связанные разделы