[CTMS]通过CCXT库构建CTMS系统的WebSocket服务流程解析

在现代金融科技领域,实时数据的获取和处理显得尤为重要。CTMS(Crypto Trading Management System)系统通过WebSocket服务实现实时数据的推送和接收,以提高交易管理的效率和准确性。本文将详细介绍CTMS系统如何通过ccxt库构建WebSocket服务的流程。

1. 概述

CTMS系统是一个综合性的合约交易管理系统,旨在为交易者提供实时的市场数据和交易管理功能。为了实现这一目标,系统需要与多个组件进行交互,包括ctms-adminctms-gatewayccxt库和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. 步骤1ctms-adminctms-gateway 发起WebSocket连接请求,调用 ws() 方法。
  2. 步骤1.1ctms-gateway 接收到请求后,进一步向 ccxt 库发起客户端连接请求,调用 client() 方法。
  3. 步骤1.1.1ccxt 库接收到请求后,向 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 订阅消息

  1. 步骤2ctms-adminctms-gateway 发送订阅请求,调用 send() 方法。
  2. 步骤2.1ctms-gateway 接收到订阅请求后,向 ccxt 库发送 watch() 请求,以订阅特定市场数据。
  3. 步骤2.1.1ccxt 库接收到订阅请求后,向 okx 交易所发送 subscribe() 请求,订阅所需的市场数据。

3.3 接收消息

  1. 步骤2.1.1.1okx 交易所接收到订阅请求后,开始推送市场数据。
  2. 步骤2.1.1.1: Message10okx 交易所推送第一条市场数据。
  3. 步骤2.1.1.1: Message11okx 交易所推送第二条市场数据。
  4. 步骤2.1.1.1: Message12okx 交易所推送第三条市场数据。
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 发送消息

  1. 步骤3ctms-adminctms-gateway 发送消息,调用 send() 方法。

3.5 关闭连接

  1. 步骤3.1ctms-adminctms-gateway 发送关闭连接请求,调用 close() 方法。
  2. 步骤3.1.1ctms-gateway 接收到关闭请求后,向 ccxt 库发送 unsubscribe() 请求,取消订阅市场数据。

4. 客户端请求

5.服务器端响应

6. 总结

通过上述流程,CTMS系统利用ccxt库成功构建了WebSocket服务,实现了与okx交易所的实时数据交互。这一流程不仅提高了数据获取的实时性,还增强了系统的稳定性和可靠性。

7. 联系方式

  • 公众号:ScienceStudio
相关推荐
剑桥折刀s29 分钟前
Python打卡:Day46
python
巴里巴气1 小时前
Python爬虫图片验证码和滑块验证码识别总结
爬虫·python
wuxuanok1 小时前
Web后端开发-分层解耦
java·笔记·后端·学习
sword devil9001 小时前
PYQT实战:智能家居中控
python·智能家居·pyqt
NetX行者1 小时前
FastMCP:用于构建MCP服务器的开源Python框架
服务器·python·开源
超龄超能程序猿1 小时前
(3)机器学习小白入门 YOLOv: 解锁图片分类新技能
python·numpy·pandas·scipy
31535669132 小时前
ClipReader:一个剪贴板英语单词阅读器
前端·后端
ladymorgana2 小时前
【Spring Boot】HikariCP 连接池 YAML 配置详解
spring boot·后端·mysql·连接池·hikaricp
waynaqua2 小时前
FastAPI开发AI应用一:实现连续多轮对话
python·openai