Книга заказов Binance WebSocket - глубина меняется каждый раз

Ниже приведен скрипт на Python, который подписывает информацию о книге заказов через Biance Websocket API (Документация здесь).

В обоих запросах (btcusdt@depth и btcusdt@depth@100ms) каждая полезная нагрузка json передается с разной глубиной.
Пожалуйста, поясните, что может быть причиной этого? Я делаю что-то неправильно? Или у них могут быть определенные критерии относительно того, сколько глубин книги заказов нужно извлечь?

import json
import websocket

socket='wss://stream.binance.com:9443/ws'

def on_open(self):
    print("opened")
    subscribe_message = {
        "method": "SUBSCRIBE",
        "params":
        [
         "btcusdt@depth@100ms"
         ],
        "id": 1
        }

    ws.send(json.dumps(subscribe_message))

def on_message(self, message):
    print("received a message")

    ###### depths of bid/ask ######
    d = json.loads(message)
    for k, v in d.items():
        if k == "b":
            print(f"bid depth : {len(v)}")
        if k == "a":
            print(f"ask depth : {len(v)}")

def on_close(self):
    print("closed connection")

ws = websocket.WebSocketApp(socket,
                            on_open=on_open,
                            on_message=on_message,
                            on_close=on_close)

ws.run_forever()

btcusdt @ глубина @ 100 мс

opened
received a message
received a message
bid depth : 3
ask depth : 12
received a message
bid depth : 14
ask depth : 12
received a message
bid depth : 17
ask depth : 24
received a message
bid depth : 14
ask depth : 16
received a message
bid depth : 3
ask depth : 5
received a message
bid depth : 16
ask depth : 6
.
.
.

btcusdt @ глубина

opened
received a message
received a message
bid depth : 135
ask depth : 127
received a message
bid depth : 125
ask depth : 135
received a message
bid depth : 95
ask depth : 85
received a message
bid depth : 68
ask depth : 88
received a message
bid depth : 119
ask depth : 145
received a message
bid depth : 127
ask depth : 145
.
.
.

person koyamashinji    schedule 31.05.2021    source источник


Ответы (1)


Ваш код считывает длину разницы за последние 100 или 1000 мс (значение по умолчанию, если вы не укажете таймфрейм). Т.е. удаленный API отправляет только разницу, а не полный список.

Ожидается различная длина разницы.


Пример:

В книге заказов есть 2 заявки и 2 заявки:

  • цена предложения 1.02, сумма 10
  • цена предложения 1.01, сумма 10
  • цена заявки 0,99, сумма 10
  • цена заявки 0,98, сумма 10

В течение таймфрейма добавляется еще один бид и обновляется один аск. Итак, сообщение возвращается:

"b": [
    [ // added new bid
        0.97,
        10
    ]
],
"a": [
    [ // updated existing ask
        1.01,
        20
    ]
]

И ваш код читает это сообщение как

bid depth: 1
ask depth: 1

В другой период обновляются две ставки.

"b": [
    [ // updated existing bid
        0.98,
        20
    ],
    [ // updated existing bid
        0.99,
        20
    ]
],
"a": [] // no changes

Итак, ваш код читается как

bid depth: 2
ask depth: 0
person Petr Hejda    schedule 31.05.2021