最近在折腾一个实时股票看板,原本以为最麻烦的是前端画图,结果做到行情这一块的时候反而卡住了。
一开始我想得特别简单,页面上放几十只股票,实时显示价格和涨跌幅就完事了。结果真的开始接数据以后,发现“实时”这两个字其实还挺容易把事情搞复杂的。
比如我一开始觉得,定时请求一下最新价格就行:
AAPL 257.84 +1.23%
MSFT 509.70 -0.42%
NVDA 177.23 +2.15%
这种当然没什么问题。
但如果页面变成这种感觉:
AAPL
257.81 → 257.83 → 257.82 → 257.87 → ...
那我就开始觉得 HTTP 轮询有点别扭了。
我这次拿 AllTick 的股票 WebSocket 随便测了一下,订阅最新成交价大概这样:
import json
import websocket
TOKEN = "YOUR_TOKEN"
url = (
"wss://quote.alltick.co/"
f"quote-stock-b-ws-api?token={TOKEN}"
)
def on_open(ws):
ws.send(json.dumps({
"cmd_id": 22004,
"seq_id": 123,
"trace": "stock-dashboard-demo",
"data": {
"symbol_list": [
{"code": "AAPL"},
{"code": "MSFT"},
{"code": "NVDA"}
]
}
}))
def on_message(ws, message):
data = json.loads(message)
if data.get("cmd_id") == 22998:
quote = data.get("data", {})
print(
quote.get("code"),
quote.get("price"),
quote.get("volume")
)
ws = websocket.WebSocketApp(
url,
on_open=on_open,
on_message=on_message
)
ws.run_forever()
这种接起来确实挺顺,数据来了就更新。
但做到这里我又有点犹豫了。
因为我这个看板其实也没想做成什么专业交易终端,可能就几十只股票,显示价格、涨跌、成交量,再加一张分时图。
这种情况下,真的有必要搞 Tick 吗?
我感觉很多时候是自己先被“实时行情”这几个字带跑偏了。
比如页面只是想知道:
现在 AAPL 是多少?
那最新价格就够了。
但如果想知道:
这几秒内到底发生了什么?
那 Tick 就开始有意义了。
再往后,如果还要做盘口:
卖 5
卖 4
卖 3
卖 2
卖 1
------
买 1
买 2
买 3
买 4
买 5
又是另一回事。
所以我现在开发的时候,反而经常在纠结一件事:
到底是需求驱动数据,还是最后变成了数据驱动需求。
有时候接了一个数据很全的接口,最后页面就用了一个 price。
这就挺尴尬的。
还有一个之前没太注意的问题,就是断线。
本地测试的时候完全感觉不到,连上以后数据一直往下刷,看起来很舒服。结果模拟一下网络抖动,页面直接停在最后那个价格,才发现重连、重新订阅、心跳这些东西都不能偷懒。
我现在大概会把它做成:
历史数据
↓
画初始图表
WebSocket
↓
持续更新最新行情
↓
前端刷新
至于要不要再加 Tick 、盘口这些,我还在犹豫。
主要也是怕最后为了一个简单看板,搞了一套自己都嫌麻烦的行情系统。
所以想问问这里做过行情 Dashboard 的朋友:
几十只股票的实时看板,你们一般会怎么选?
是最新价格 + K 线就够了,还是会直接上 WebSocket + Tick ?
还有一个问题我挺好奇的:
你们一般是先确定页面需要什么,再去找数据源,还是会先把能拿到的数据都接进来再说?