Skip to content

Orderbook

ckatpskov edited this page Apr 14, 2022 · 5 revisions

Описание работы с ордербуком

Для получения информации о лучших ценовых предложениях необходимо подписаться на публичный поток "orderbook" через WebSocket.

В общем случае шлюз сохраняет пару цена/объем в словаре std::map< double, double > example_map. Следует отметить, что для asks и bids используются разные словари с разной сортировкой (или с одинаковой сортировкой, но тогда в процессе построения json для asks нужно использовать прямой итератор, а для bids - обратный итератор).

В случае успешной подписки от биржы придет ответ в виде json:

{"type": "subscribed", "channel": "orderbook", "market": "BTC/USDT"}

Далее последуют сообщение, в котором будет содержаться 100 лучших ценовых предложений. Фрагмент представлен ниже:

{
  "channel": "orderbook", 
  "market": "BTC/USDT", 
  "type": "partial", 
  "data": 
  {
     "time": 1649006025.0754888, 
     "checksum": 1378964119, 
     "bids": [
        [46320.0, 8.0988], 
        [46319.0, 0.2158], 
        [46294.0, 0.2158],
        ...
             ]
     "asks": [
        [46321.0, 0.1437], 
        [46328.0, 0.2893], 
        [46330.0, 0.2158],
        ...
             ],
     "action": "partial"
  }
}

Все последующие сообщения будут содержать информацию об изменениях текущего "стакана":

{
  "channel": "orderbook", 
  "market": "BTC/USDT", 
  "type": "update", 
  "data": 
  {
    "time": 1649006025.454782, 
    "checksum": 3838518087, 
    "bids": [[46294.0, 0.1001]], 
    "asks": [], 
    "action": "update"
  }
}

Как видим из примера произошли изменения объема покупки с ценой 46294.0. В этом случае шлюз обновляет ключ в массиве: example_map[46294.0] = 0.1001 (до этого момента example_map содержал ключ 46294.0 со значением 0.2158). Если данный ключ не содержится в первоначальном "стакане", то шлюз просто добавляет ключ в контейнер. Если "предложение" с ценой 46294.0 необходимо отменить, то json будет содержать что-то вроде этого: [46294.0, 0]

Если подписаться на получение ордербуков от несуществующей валютной пары, например "BTK/USDT" вместо "BTC/USDT", то вместо инфомации о ценовых предложениях биржа вернет ошибку:

{"type": "error", "code": 404, "msg": "No such market: BTK/USDT"}

После парсинга json шлюз отправляет код ошибки и содержание ошибки в лог.