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

标签 python json python-3.x websocket python-asyncio

我正在尝试实现一个连接到流行的加密货币交易所 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

...

关于python - websocket 客户端中缺少一些消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72354326/

相关文章:

python - ProcessPoolExecutor 使用 map 卡在大负载上

Python:将 pandas 导入到主模块和模块中?

python - 带有数字和大写字母的字符串的正则表达式匹配失败

python - "ALTER TABLE"使用 Pony ORM 添加数据库列

java - CodeNameOne ,无需 root 读取 JSON

java - 如何使用 Jackson JSON 将 K/V 的 json 数组转换为 Java HashMap

python - Fastai - 如何在 cpu 中使用 load_learner 后进行预测

Python:PyCharm 通过 "shape"显示 "mouse over"

java - 如何使用gson将对象转换为数组

python - 当为变量定义内置函数时,del 对内置函数做了什么?