使用Binance WebSocket交易流每分钟统计做市商/taker交易总价值的问题咨询
问题排查与修复方案
核心问题定位
- 全局变量
minute被反复重置:你在on_message函数内每次处理消息时都会执行minute = 0,导致逻辑永远只会命中if minute == 0的分支,直接把minute赋值为当前分钟值,永远走不到后续判断分钟切换的elif分支。 - 做市商标识判断错误:Binance接口返回的
content['m']是布尔类型值,不是字符串,你用ismaker == 'True'判断的结果永远为False,所有做市商的交易数据都会被误归类到吃单者统计中。 - 分钟标识存在冲突风险:仅提取
%M分钟数作为判断依据,跨小时节点会出现重复的分钟值(比如14:00和15:00的分钟数都是00),会触发逻辑误判。 - 统计逻辑效率低下:无需存储所有交易的数量和价格列表,直接累计每笔交易的价值即可,既节省内存也降低计算开销。
修复后完整代码
import websocket import json from datetime import datetime socket = 'wss://stream.binance.com:9443/ws/btcusdt@trade' # 全局统计变量 total_maker_val = 0.0 total_taker_val = 0.0 current_minute = None def on_message(ws, message): global total_maker_val, total_taker_val, current_minute content = json.loads(message) is_maker = content['m'] price = float(content['p']) qty = float(content['q']) trade_ts = int(content['T']) / 1000 # 取整分钟时间戳作为判断依据,避免跨小时冲突 trade_minute = int(trade_ts // 60) # 统计当前交易价值 trade_val = price * qty if is_maker: total_maker_val += trade_val else: total_taker_val += trade_val # 分钟切换判断 if current_minute is None: # 首次运行初始化 current_minute = trade_minute return if trade_minute != current_minute: # 输出上一分钟统计结果 print(f"做市商总交易额: {total_maker_val:.2f} USDT") print(f"吃单者总交易额: {total_taker_val:.2f} USDT") # 清零统计值 total_maker_val = 0.0 total_taker_val = 0.0 current_minute = trade_minute def on_error(ws, error): print(error) def on_close(ws, close_status_code, close_msg): print('Socket closed') if __name__ == "__main__": ws = websocket.WebSocketApp(socket, on_message=on_message, on_error=on_error, on_close=on_close) ws.run_forever()
内容的提问来源于stack exchange,提问作者gmorissette
相关产品推荐
相关产品推荐

