[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
相关推荐
无责任此方_修行中16 分钟前
不止是 AI 热潮:AWS 2025 技术峰会带给我的思考
后端·架构·aws
lang2015092832 分钟前
Apache Ignite 与 Spring Boot 集成
spring boot·后端·apache·ignite
Asthenia041242 分钟前
深入剖析 Spring Boot 请求处理链路与 Servlet 的本质
后端
旧时光巷43 分钟前
【Flask 基础 ①】 | 路由、参数与模板渲染
后端·python·零基础·flask·web·模板渲染·路由系统
小醉你真好1 小时前
Spring Boot 数据源配置中为什么可以不用写 driver-class-name
spring boot·后端·源代码管理
java1234_小锋1 小时前
【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博评论IP地图可视化分析实现
python·自然语言处理·flask
golitter.1 小时前
python的异步、并发开发
开发语言·python
SirLancelot11 小时前
数据结构-Set集合(一)Set集合介绍、优缺点
java·开发语言·数据结构·后端·算法·哈希算法·set
追逐时光者1 小时前
2 款 .NET 开源、简洁、高效的 PDF 文档操作库
后端·.net
陈敬雷-充电了么-CEO兼CTO1 小时前
强化学习三巨头PK:PPO、GRPO、DPO谁是大模型训练的「王炸」?
人工智能·python·机器学习·chatgpt·aigc·ppo·grpo