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

在现代金融科技领域,实时数据的获取和处理显得尤为重要。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. 步骤1 :ctms-admin 向 ctms-gateway 发起WebSocket连接请求,调用 ws() 方法。
  2. 步骤1.1 :ctms-gateway 接收到请求后,进一步向 ccxt 库发起客户端连接请求,调用 client() 方法。
  3. 步骤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 订阅消息

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

3.3 接收消息

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

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

3.5 关闭连接

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

4. 客户端请求

5.服务器端响应

6. 总结

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

7. 联系方式

  • 公众号:ScienceStudio
相关推荐
北城笑笑2 分钟前
Vue 106 ,上篇:前端桌面端应用实现方案( Electron 框架详细介绍,Vue + Electron )
前端·javascript·vue.js·python·electron
青少儿编程课堂26 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:分层图最短路解析
c++·python·算法·bfs·信息学竞赛
全栈练习生1 小时前
大模型原理之自适应推理
python·ai
实名上网宋凯宣9 小时前
Django
后端·python·django
如若12310 小时前
【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
人工智能·python
利威尔xu11 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
逃逸线LOF12 小时前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
砚底藏山河12 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
慢云智慧空间12 小时前
从设备智能到空间理解,空间智能终端解决方案商如何重新定义行业标准
后端