在现代金融科技领域,实时数据的获取和处理显得尤为重要。CTMS(Crypto Trading Management System)系统通过WebSocket服务实现实时数据的推送和接收,以提高交易管理的效率和准确性。本文将详细介绍CTMS系统如何通过ccxt库构建WebSocket服务的流程。
1. 概述
CTMS系统是一个综合性的合约交易管理系统,旨在为交易者提供实时的市场数据和交易管理功能。为了实现这一目标,系统需要与多个组件进行交互,包括ctms-admin
、ctms-gateway
、ccxt
库和okx
交易所。
2. 序列图
下图展示了CTMS系统通过ccxt库构建WebSocket服务的详细流程:
rust
sequenceDiagram
participant ctms-admin
participant ctms-gateway
participant ccxt
participant okx
ctms-admin->>ctms-gateway: 1: ws()
activate ctms-gateway
ctms-gateway->>ccxt: 1.1: client()
activate ccxt
ccxt->>okx: 1.1.1:
okx-->>ccxt: 1.1.1:
deactivate ccxt
ctms-admin->>ctms-gateway: 2: send()
activate ctms-gateway
ctms-gateway->>ccxt: 2.1: watch()
activate ccxt
ccxt->>okx: 2.1.1: subscribe()
okx-->>ccxt: 2.1.1.1: Message10()
okx-->>ccxt: 2.1.1.1: Message11()
okx-->>ctms-gateway: 2.1.1.1: Message12()
ctms-gateway-->>ctms-admin: 2.1.1.1: Message12()
deactivate ctms-gateway
ctms-admin->>ctms-gateway: 3: send()
activate ctms-gateway
ctms-gateway->>ccxt: 3.1: close()
activate ccxt
ccxt->>okx: 3.1.1: unsubscribe()
okx-->>ccxt: 3.1.1:
deactivate ccxt
deactivate ctms-gateway
3. 序列图解析
3.1 初始化WebSocket连接
- 步骤1 :
ctms-admin
向ctms-gateway
发起WebSocket连接请求,调用ws()
方法。 - 步骤1.1 :
ctms-gateway
接收到请求后,进一步向ccxt
库发起客户端连接请求,调用client()
方法。 - 步骤1.1.1 :
ccxt
库接收到请求后,向okx
交易所发起WebSocket连接请求。
python
@app.websocket("/public")
async def message_endpoint(
websocket: WebSocket,
token: str = Depends(validate_ws_token),
market: CryptoMarket = Depends(crypto_market_getter)):
if token:
await websocket.accept()
try:
while True:
# 接收客户端发送的交易对信息
data = await websocket.receive_text()
# 使用协程调度任务,避免阻塞会话
asyncio.create_task(market.dispatch_subscribe(data, websocket))
except WebSocketDisconnect as e:
......
finally:
del websocket
3.2 订阅消息
- 步骤2 :
ctms-admin
向ctms-gateway
发送订阅请求,调用send()
方法。 - 步骤2.1 :
ctms-gateway
接收到订阅请求后,向ccxt
库发送watch()
请求,以订阅特定市场数据。 - 步骤2.1.1 :
ccxt
库接收到订阅请求后,向okx
交易所发送subscribe()
请求,订阅所需的市场数据。
3.3 接收消息
- 步骤2.1.1.1 :
okx
交易所接收到订阅请求后,开始推送市场数据。 - 步骤2.1.1.1: Message10 :
okx
交易所推送第一条市场数据。 - 步骤2.1.1.1: Message11 :
okx
交易所推送第二条市场数据。 - 步骤2.1.1.1: Message12 :
okx
交易所推送第三条市场数据。
python
class CryptoMarket(object):
......
async def dispatch_subscribe(self, data, websocket: WebSocket):
# 解析JSON数据
parsed_data = json.loads(data)
pprint(parsed_data)
channel = parsed_data['channel']
args = parsed_data['args']
if channel == 'ohlcv':
exchange = args['exchange']
symbol = args['symbol']
timeframe = args['timeframe']
await self.subscribe_to_ohlcv(exchange, symbol, timeframe, websocket)
# 订阅K线数据的函数
async def subscribe_to_ohlcv(self, exchange: str, symbol: str, timeframe: str, websocket: WebSocket):
client = self._exchanges.get(exchange, None)
websocket_connected = True # 初始化连接状态为已连接
while websocket_connected and self._live:
try:
ohlcv = await client.watch_ohlcv(symbol, timeframe)
print(ohlcv)
# 检查WebSocket连接状态
if websocket.client_state == WebSocketState.DISCONNECTED:
websocket_connected = False # 设置连接状态为已断开
break
reply = {
'channel': 'ohlcv',
'symbol': symbol,
'timeframe': timeframe,
'exchange': exchange,
'data': ohlcv
}
await websocket.send_text(json.dumps(reply))
except WebSocketDisconnect as e:
websocket_connected = False # 设置连接状态为已断开
except Exception as e:
print(f"获取K线数据时出错: {e}")
await asyncio.sleep(10) # 如果出错,等待10秒后重试
3.4 发送消息
- 步骤3 :
ctms-admin
向ctms-gateway
发送消息,调用send()
方法。
3.5 关闭连接
- 步骤3.1 :
ctms-admin
向ctms-gateway
发送关闭连接请求,调用close()
方法。 - 步骤3.1.1 :
ctms-gateway
接收到关闭请求后,向ccxt
库发送unsubscribe()
请求,取消订阅市场数据。
4. 客户端请求
5.服务器端响应
6. 总结
通过上述流程,CTMS系统利用ccxt库成功构建了WebSocket服务,实现了与okx交易所的实时数据交互。这一流程不仅提高了数据获取的实时性,还增强了系统的稳定性和可靠性。
7. 联系方式
- 公众号:ScienceStudio
- Github: github.com/KandyYe
- 知乎:www.zhihu.com/people/kand...