You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Binance WebSocket交易流每分钟统计做市商/taker交易总价值的问题咨询

问题排查与修复方案

核心问题定位

  1. 全局变量minute被反复重置:你在on_message函数内每次处理消息时都会执行minute = 0,导致逻辑永远只会命中if minute == 0的分支,直接把minute赋值为当前分钟值,永远走不到后续判断分钟切换的elif分支。
  2. 做市商标识判断错误:Binance接口返回的content['m']是布尔类型值,不是字符串,你用ismaker == 'True'判断的结果永远为False,所有做市商的交易数据都会被误归类到吃单者统计中。
  3. 分钟标识存在冲突风险:仅提取%M分钟数作为判断依据,跨小时节点会出现重复的分钟值(比如14:00和15:00的分钟数都是00),会触发逻辑误判。
  4. 统计逻辑效率低下:无需存储所有交易的数量和价格列表,直接累计每笔交易的价值即可,既节省内存也降低计算开销。

修复后完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:06:07