做实时行情接入时,我一直在关注 BTC/USDT 的盘口深度数据。相比单一价格点,这类数据更像是一种结构化的行情快照,用来反映当前买卖挂单分布。在加密货币api的使用场景里,只要涉及实时数据展示或者流式计算,WebSocket 通常都是核心方式。
BTC/USDT 深度数据一般由买卖两侧组成,结构比较稳定:
|
{
"bids"
: [
[
"67000"
,
"1.20"
],
[
"66990"
,
"2.05"
]
],
"asks"
: [
[
"67010"
,
"1.10"
],
[
"67020"
,
"3.40"
]
]
}
|
买盘代表当前买入挂单分布,卖盘代表卖出挂单分布,两侧数据组合起来可以形成完整的盘口结构视图。在做实时展示或者数据处理时,这类结构比单点价格信息更完整。
WebSocket 订阅通常围绕交易对进行,BTC/USDT 属于更新频率较高的标的之一。订阅结构一般比较直接:
|
{
"action"
:
"subscribe"
,
"symbols"
: [
"BTC/USDT"
],
"depth"
: 10
}
|
不同档位的深度数据会影响返回数据量,档位越深,数据密度越高,对连接稳定性和处理能力要求也越明显。
在实际接入过程中,WebSocket 通常分为三个部分:连接建立、订阅发送、数据解析处理。以常见行情 WebSocket 服务为例(如 AllTick API 的行情通道),可以直接获取 BTC/USDT 深度数据流:
|
import
websocket
import
json
import
threading
import
time
url =
"wss://apis.alltick.co/ws/transaction-quote"
orderbook = {
"BTC/USDT"
: {
"bids"
: [],
"asks"
: []}}
def
on_message
(ws, message):
data = json.loads(message)
if
"depth"
in
data:
orderbook[
"BTC/USDT"
][
"bids"
] = data[
"depth"
].get(
"bids"
, [])
orderbook[
"BTC/USDT"
][
"asks"
] = data[
"depth"
].get(
"asks"
, [])
if
orderbook[
"BTC/USDT"
][
"bids"
]
and
orderbook[
"BTC/USDT"
][
"asks"
]:
bid = float(orderbook[
"BTC/USDT"
][
"bids"
][0][0])
ask = float(orderbook[
"BTC/USDT"
][
"asks"
][0][0])
print(
"spread:"
, ask - bid)
def
on_open
(ws):
ws.send(json.dumps({
"action"
:
"subscribe"
,
"symbols"
: [
"BTC/USDT"
]
}))
def
heartbeat
(ws):
while
True
:
try
:
ws.send(json.dumps({
"action"
:
"ping"
}))
except
:
break
time.sleep(8)
ws = websocket.WebSocketApp(url, >
threading.Thread(target=heartbeat, args=(ws,), daemon=
True
).start()
ws.run_forever()
|
运行一段时间后,连接层的稳定性会逐渐变得明显。长连接模式下,一些因素会影响数据连续性,比如心跳缺失、网络波动、订阅数据量过大等,这些都会导致数据流出现中断或延迟累积。
心跳机制用于保持连接活跃状态:
|
def
heartbeat
(ws):
while
True
:
try
:
ws.send(json.dumps({
"action"
:
"ping"
}))
except
:
break
time.sleep(10)
|
当连接异常中断时,可以通过循环方式重新建立连接,保证数据流持续:
|
while
True
:
try
:
ws.run_forever()
except
:
time.sleep(5)
|
在数据处理层面,通常不会逐条处理推送数据,而是维护一个本地结构,用最新数据覆盖旧状态,这样可以保证数据一致性:
|
orderbook = {
"BTC/USDT"
: {
"bids"
: [],
"asks"
: []
}
}
|
UI 层面一般也不会跟随每条数据刷新,而是采用周期性更新方式,避免界面频繁变化导致性能波动。
盘口数据在持续流动之后,会逐渐形成连续的结构化数据流。买卖盘的分布变化、深度变化以及价差变化,都可以在同一数据流中观察到。在实时数据系统中,这种连续性往往比单次数据精度更重要。
在一些成熟的行情数据服务中,这类 WebSocket 行情能力已经做了较多封装,接入时只需要关注订阅与数据处理逻辑即可,整体开发复杂度会明显降低。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048654/viewspace-3174202/
,如需转载,请注明出处,否则将追究法律责任。