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