[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
相关推荐
WenGyyyL13 分钟前
研读论文——《RepFace:通过渐进式标签校正来改善面部的闭集噪声识别》
人工智能·python·深度学习·机器学习·计算机视觉
计算机毕设指导61 小时前
基于Springboot旅游网站系统【附源码】
java·开发语言·spring boot·后端·mysql·spring·旅游
code_shenbing1 小时前
python常用科学计算库及使用示例
开发语言·python
●^●1 小时前
Python 部分内置函数及其用法详解
开发语言·python
caihuayuan52 小时前
关于vue+iview中tabs嵌套及实际应用
java·大数据·spring boot·后端·课程设计
大模型铲屎官2 小时前
【深度学习-Day 2】图解线性代数:从标量到张量,理解深度学习的数据表示与运算
人工智能·pytorch·python·深度学习·线性代数·机器学习·llm
a181001_2 小时前
python下载
开发语言·后端·python·青少年编程
蹦蹦跳跳真可爱5892 小时前
Python----卷积神经网络(LeNet-5的手写体识别)
人工智能·python·深度学习·神经网络·cnn
MarsBighead4 小时前
openGauss DB4AI与scikit-learn模块对比探究
人工智能·python·scikit-learn·opengauss·db4ai
CHNMSCS4 小时前
PyTorch_阿达玛积
人工智能·pytorch·python