在当今快速变化的金融环境中,实时数据已成为开发高效应用的关键要素。借助 WebSocket 技术,开发人员能够建立双向、低延迟的数据通信通道,为股票、ETF 和加密货币等多种资产提供持续更新的信息流,从而打造流畅且响应迅速的用户体验。
WebSocket 支持服务端与客户端之间的全双工通信,避免了传统轮询方式的延迟与资源浪费,特别适合对实时性要求极高的金融场景。
WebSocket 连接与授权
建立 WebSocket 连接时,需通过 apikey 参数进行身份验证。只需在连接地址中附加有效的 API 密钥,即可获得数据访问权限。
示例连接地址格式如下:
wss://ws.finazon.io/v1?apikey=你的API密钥连接成功后,即可开始订阅各类金融市场数据。
服务限制说明
使用 WebSocket 接口时,需注意以下默认限制:
- 每个工作区最多允许 3 个活跃连接
- 每个连接每分钟最多处理 100 条事件消息
- 单条事件消息的最大尺寸为 100KB
- 可订阅的交易对数量无上限,除非在配置中自行设定
若您的应用需要更高限制,可联系技术支持申请调整。
快速开始:订阅实时数据
以下是一个使用 Python 连接并订阅实时数据的示例。该示例演示了如何订阅 OKX 数据集上的 BTC/USDT 交易对的分钟 K 线数据。
首先,确保安装必要的库:
pip install websocket-client rel随后,使用以下代码建立连接并订阅数据:
import json
import rel
import websocket
dataset = 'okx'
tickers = ['BTC/USDT']
api_key = '你的API密钥'
def on_message(wsapp, message):
print(f'收到消息: {message}')
def on_error(wsapp, error):
print(f'发生错误: {error}')
def on_close(wsapp, close_status_code, close_msg):
print('连接已关闭')
def on_open(wsapp):
print('连接已开启')
subscribe(wsapp, dataset, tickers)
def subscribe(wsapp, dataset, tickers):
sub_request = {
'event': 'subscribe',
'dataset': dataset,
'tickers': tickers,
'channel': 'bars',
'frequency': '1s',
'aggregation': '1m'
}
wsapp.send(json.dumps(sub_request))
if __name__ == '__main__':
ws = websocket.WebSocketApp(f'wss://ws.finazon.io/v1?apikey={api_key}',
on_open=on_open,
on_message=on_message,
on_error=on_error)
ws.run_forever(dispatcher=rel, reconnect=5, ping_interval=30, ping_timeout=10)
rel.signal(2, rel.abort)
rel.dispatch()订阅参数详解
发起订阅时,需在请求体中配置以下关键参数:
- dataset: 数据源代码,例如
okx - tickers: 要订阅的交易对数组,例如
['BTC/USDT', 'ETH/USDT'] - channel: 频道类型,例如
bars表示订阅 K 线数据 - frequency: 数据推送频率,可选
1s、10s或1m - aggregation: 数据聚合周期,例如
1m表示生成 1 分钟 K 线 - request_id: 可选请求 ID,服务器将在响应中原样返回
订阅请求示例
{
"event": "subscribe",
"dataset": "okx",
"tickers": ["BTC/USDT", "INX/USDT"],
"channel": "bars",
"frequency": "1s",
"aggregation": "1m",
"request_id": 106
}订阅成功响应
服务器返回成功响应,表示已接受订阅请求。
{
"status": "success",
"code": "SUCCESS_SUBSCRIPTION",
"data": ["BTC/USDT", "INX/USDT"],
"request_id": 106
}K 线数据推送示例
订阅成功后,将收到如下格式的实时 K 线数据更新:
{
"d": "okx",
"p": "okx",
"ch": "bars",
"f": "1s",
"aggr": "1m",
"s": "BTC/USDT",
"t": 1699540020,
"o": 220.06,
"h": 220.13,
"l": 219.92,
"c": 219.96,
"v": 4572
}各字段含义如下:
d: 数据集代码p: 数据发布方代码ch: 频道名称f: 数据频率aggr: 聚合周期s: 交易对符号t: K 线开始时间戳o: 开盘价h: 最高价l: 最低价c: 收盘价v: 成交量
取消订阅与连接管理
如需取消订阅特定交易对的数据,可发送 unsubscribe 事件请求。
取消订阅请求
{
"event": "unsubscribe",
"dataset": "okx",
"tickers": ["BTC/USDT"],
"channel": "bars",
"frequency": "1s",
"aggregation": "1m",
"request_id": 107
}取消订阅响应
{
"status": "success",
"code": "SUCCESS_UNSUBSCRIPTION",
"data": ["BTC/USDT"],
"request_id": 107
}心跳检测与连接保活
为确保连接活跃,客户端可定期向服务器发送心跳消息:
心跳请求
{
"event": "heartbeat",
"request_id": 108
}心跳响应
{
"event": "heartbeat",
"status": "success",
"request_id": 108
}此外,WebSocket 协议本身支持 Ping/Pong 控制帧(操作码 0x9 和 0xA),可用于底层连接保活。客户端发送 Ping 帧后,服务器将回复一个包含相同数据负载的 Pong 帧。
重置所有订阅
发送 reset 事件可清除当前连接上的所有活跃订阅,服务器不会对此消息作出回复。
{
"event": "reset",
"request_id": 109
}常见问题
WebSocket 连接是否支持历史数据获取?
WebSocket 主要用于传输实时数据流。如需获取历史数据,通常需配合使用专门的 RESTful API 接口。
连接意外断开后如何自动恢复?
示例代码中的 reconnect=5 参数设置了 5 秒重连延迟。在实际应用中,建议实现重连逻辑并处理连接状态变更,以确保业务的连续性。
如何选择合适的数据频率和聚合周期?frequency 决定数据推送的频率,而 aggregation 决定如何聚合生成 K 线。例如,设置 frequency='1s' 和 aggregation='1m' 表示每秒接收一次数据,但这些数据会被聚合计算为每分钟一根的 K 线。
订阅的交易对数量会影响性能吗?
从连接层面的消息数限制来看,订阅更多交易对会消耗更多消息额度。建议根据实际需求精选交易对,并优化客户端的数据处理逻辑。
除了K线,还能订阅哪些类型的数据?
除了 bars (K线),通常还可以订阅实时成交(trades)、订单簿深度(depth)等频道。具体可用的频道类型需查阅相应数据集的文档。
WebSocket 技术为金融应用提供了强大的实时数据基础。通过稳定、高效的连接,开发者能够构建出高度响应、用户体验卓越的金融产品,实时捕捉市场变化。