我正在try 实现一个websocket客户端,该客户端连接到流行的加密交换FTX.我已将问题简化为以下示例代码:

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())

整个程序的输出与预期一样,但有一个主要问题:将输出到控制台的累计交易量太低.它应该大约大1000x-10000x.通过从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相关问答推荐

是否有使用纯霍夫曼编码的现代图像格式?

用ctype构建指针链

从多行文本中提取事件对

如何在Power Query中按名称和时间总和进行分组

GEKKO:已知延迟的延迟系统的参数估计

收件箱转换错误- polars.exceptions. ComputeHelp- pandera(0.19.0b3)带有polars

使用from_pandas将GeDataFrame转换为polars失败,ArrowType错误:未传递numpy. dype对象

优化在numpy数组中非零值周围创建缓冲区的函数的性能

在内部列表上滚动窗口

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

两个pandas的平均值按元素的结果串接元素.为什么?

如何在Python脚本中附加一个Google tab(已经打开)

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

海上重叠直方图

使用Python更新字典中的值

Odoo 16使用NTFS使字段只读

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

Pandas Data Wrangling/Dataframe Assignment

如何使用Numpy. stracards重新编写滚动和?

lityter不让我输入左边的方括号,'