继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

手把手教你用 Python 处理贵金属 WebSocket 行情,分清黄金白银不再难

慕盖茨9520025
关注TA
已关注
手记 75
粉丝 0
获赞 3

大家好,我是一名常年和金融数据打交道的分析师。之前在做贵金属实时看板的时候,遇到了一个特别头疼的问题:WebSocket 推送的数据包里,黄金、白银、铂金都挤在同一个通道里,如果不做区分,前端展示的 K 线会完全乱掉。今天就把我的解决思路分享出来,希望能帮到同样踩坑的同学。

场景:我想搭建一个个人贵金属行情监控小工具,需要同时显示 XAUUSD 和 XAGUSD 的实时价格。
需求:在同一个 WebSocket 连接里,准确地把不同金属的价格更新到对应的 UI 组件。
数据痛点:服务端推送的是一个扁平的 JSON,里面除了价格就是 symbol 字段,新手很容易直接在回调里全部刷新,导致黄金和白银的价格相互覆盖。

第一步:读懂数据结构,建立资产映射

我们先看一条典型的推送消息:

{"symbol": "XAUUSD", "price": 1920.55, "timestamp": 1716960000}

里面的 symbol 就是资产的“身份证”。我们可以创建一个字典,把代码翻译成我们内部的名字:

asset_map = {
    "XAUUSD": "gold",
    "XAGUSD": "silver",
    "XPTUSD": "platinum"
}

有了这张表,任何一条消息进来,我们都能立刻知道它是哪种金属。

第二步:用缓存分离数据处理

我不建议收到一条价格就立刻更新数据库或 UI,因为推送频率可能高达每秒几十次。更好的做法是先存到内存的字典里,用 symbol 做键,存最新价:

cache = {"gold": {}, "silver": {}, "platinum": {}}

def on_message(msg):
    symbol = msg['symbol']
    price = msg['price']
    asset_type = asset_map.get(symbol, "unknown")
    cache[asset_type][symbol] = price

然后定时(比如每秒一次)从缓存中取出各品种的最新价,统一刷新界面或写入数据库。这样各资产之间的更新逻辑完全独立,不会互相影响。

第三步:按需订阅,减少无效数据

如果我们只关心黄金和白银,就不要订阅铂金和钯金。很多贵金属 API 支持在建立 WebSocket 连接时传入订阅参数。以某实时行情服务为例,我们可以这样写:

import websocket
import json

def on_message(ws, message):
    data = json.loads(message)
    symbol = data['symbol']
    print(f"{symbol} 实时价格: {data['price']}")

ws = websocket.WebSocketApp("wss://api.alltick.co/ws",
                            on_message=on_message)
ws.run_forever()

连接后发送订阅指令,只订阅 XAUUSDXAGUSD,这样服务器就只会推送这两种,流量和数据清洗压力都小很多。

第四步:加入重连和异常防护

WebSocket 偶尔会断,尤其是网络波动时。我习惯在 on_erroron_close 中实现重连逻辑,并且每次重连成功后重新订阅。另外,对收到的每条数据都检查 symbolprice 是否存在,避免程序崩溃。

按这个流程走下来,资产混淆的问题基本就解决了。代码量不大,但能让整个行情系统的稳定性提升一个档次。希望这个小教程能帮你少走一些弯路。
图片描述

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP