在 websocket 客户端中缺少一些消息?

missing some messages in websocket client?

我正在尝试实现一个连接到流行的加密货币交易所 FTX 的 websocket 客户端。我已将我的问题简化为以下示例代码:

import asyncio
import websockets
import json
async def consumer() -> None:
    async with websockets.connect("wss://ftx.com/ws/") as websocket:
        await websocket.send(json.dumps({
            "op":"subscribe",
            "channel":"trades",
            "market":"BTC-PERP"
        }))
        totalVol = 0
        async for message in websocket:
            message = json.loads(message)
            # print("message: " + str(message))
            if message["type"]=="update":
                result = message["data"]
                for record in result:
                    totalVol += float(record["size"])
                    print("totalVol: " + str(totalVol))


asyncio.run(consumer())

程序的总体输出符合预期,但有一个主要问题:输出到控制台的累计交易量太低了。它应该大大约 1,000 到 10,000 倍。我可以通过从 webscoekt 数据构建蜡烛并与历史 API 中的相同分辨率进行比较来更严格地展示这一点。但是,如果您只是去访问 ftx 网站并看到 BTC-PERP 市场的 1 分钟交易量往往是每分钟数百万,那么很容易让自己相信这一点,而这是打印出的交易量每分钟数百个。

我做了一些研究,最好的答案似乎是问题不在使用消息处理的异步实现。但我相信上面的实现是异步的。

有人可以帮我理解为什么我没有看到预期的行为,我该如何解决它?

谢谢,

保罗

如果我正确理解服务器的结果,您应该将“尺寸”乘以“价格”:

import asyncio
import websockets
import json


async def consumer() -> None:
    async with websockets.connect("wss://ftx.com/ws/") as websocket:
        await websocket.send(
            json.dumps(
                {"op": "subscribe", "channel": "trades", "market": "BTC-PERP"}
            )
        )
        totalVol = 0
        async for message in websocket:
            message = json.loads(message)
            if message["type"] == "update":
                result = message["data"]
                for record in result:
                    totalVol += record["size"] * record["price"]

                print("totalVol:", totalVol)


asyncio.run(consumer())

打印更“真实”的值:

...

totalVol: 1420555.7282999994
totalVol: 1436185.2012999994
totalVol: 1436278.1292999994
totalVol: 1441894.4652999996

...