edit | blame | history | raw

OKX量化交易模块技术文档

1. 包结构

com.xcong.excoin.modules.okxNewPrice
├── OkxWebSocketClientManager.java      # WebSocket客户端管理器
├── OkxNewPriceWebSocketClient.java     # 公共价格WebSocket客户端
├── OkxQuantWebSocketClient.java        # 多账号量化交易WebSocket客户端
├── README.md                           # 模块说明文档
├── celue/                              # 策略执行层
│   ├── CaoZuoService.java              # 策略执行接口
│   └── CaoZuoServiceImpl.java          # 策略执行实现
├── okxWs/                              # OKX WebSocket通信层
│   ├── AccountWs.java                  # 账户信息处理
│   ├── BalanceAndPositionWs.java       # 余额和仓位处理
│   ├── LoginWs.java                    # 登录处理
│   ├── OrderInfoWs.java                # 订单信息处理
│   ├── PositionsWs.java                # 仓位信息处理
│   ├── TradeOrderWs.java               # 交易订单处理
│   ├── enums/                          # 枚举定义
│   └── wanggeList/                     # 网格策略配置
│       ├── WangGeListEnum.java         # 网格参数枚举
│       └── WangGeListServiceImpl.java  # 网格策略服务
├── okxpi/                              # OKX API工具
└── utils/                              # 工具类
    ├── SSLConfig.java                  # SSL配置
    ├── WsMapBuild.java                 # Map构建工具
    └── WsParamBuild.java               # WebSocket参数构建工具

2. 核心组件说明

2.1 WebSocket客户端管理

OkxWebSocketClientManager

  • 功能:管理所有OKX WebSocket客户端实例,包括价格客户端和多账号量化客户端
  • 核心特性
  • 统一初始化、连接和销毁管理
  • 多账号客户端映射(accountName → OkxQuantWebSocketClient)
  • 单一价格客户端管理
  • 关键方法
  • init():初始化所有客户端
  • destroy():销毁所有客户端
  • getAllClients():获取所有账号客户端

2.2 WebSocket客户端

OkxNewPriceWebSocketClient

  • 功能:连接OKX公共WebSocket接口,获取实时标记价格
  • 核心特性
  • 心跳检测和自动重连
  • 价格数据解析和Redis存储
  • 价格变化触发策略执行
  • 关键流程
  • init()connect()subscribeChannels() → 接收价格数据 → processPushData()triggerQuantOperations()

OkxQuantWebSocketClient

  • 功能:连接OKX私有WebSocket接口,处理账号相关数据
  • 核心特性
  • 账号登录认证
  • 订阅账号、订单、仓位等私有频道
  • 处理私有数据推送
  • 关键流程
  • init()connect()websocketLogin() → 订阅私有频道 → 接收数据

2.3 策略执行层

CaoZuoService

  • 功能:执行量化交易策略,决定买卖操作方向
  • 核心方法
  • caoZuo(String accountName):根据账号执行策略
  • caoZuoLong(String accountName, String markPx):多头策略执行
  • caoZuoShort(String accountName, String markPx):空头策略执行
  • 策略逻辑
  • 根据当前价格确定所在网格位置
  • 结合网格方向参数决定操作方向
  • 考虑仓位状态和风险控制

2.4 数据管理

PositionsWs

  • 功能:管理账户仓位数据,支持多空方向分离
  • 核心特性
  • 双层Map存储:accountName → dataKey → value
  • 支持多空方向分离(accountName_posSide)
  • 数据就绪状态标记
  • 关键方法
  • initAccountName(String accountName, String posSide):初始化带多空方向的账号名
  • handleEvent(JSONObject response, String accountName):处理仓位数据推送

2.5 网格策略

WangGeListEnum

  • 功能:定义网格策略参数
  • 核心参数
  • jiage_shangxian:价格上限
  • jiage_xiaxian:价格下限
  • fang_xiang:操作方向(long/short)
  • jian_ju:网格间距
  • 关键方法
  • getGridByPrice(BigDecimal price):根据当前价格获取匹配的网格

3. 业务流程

3.1 系统初始化流程

1. Spring容器启动,OkxWebSocketClientManager初始化
2. 创建OkxNewPriceWebSocketClient实例并初始化
3. 遍历ExchangeInfoEnum,为每个账号创建OkxQuantWebSocketClient实例
4. 所有客户端建立WebSocket连接并进行认证
5. 订阅相应的WebSocket频道

3.2 价格触发交易流程

1. OkxNewPriceWebSocketClient接收价格数据
2. 调用`processPushData()`处理价格数据
3. 调用`triggerQuantOperations()`触发策略执行
4. 遍历所有账号客户端:
   a. 获取账号名称
   b. 调用`CaoZuoService.caoZuo(accountName)`确定操作方向
   c. 调用`TradeOrderWs.orderEvent()`执行订单操作

3.3 网格策略执行流程

1. 获取当前价格
2. 调用`WangGeListEnum.getGridByPrice(price)`确定网格位置
3. 根据网格的`fang_xiang`参数确定操作方向
4. 结合当前仓位状态和市场情况,决定最终操作(买/卖/止损/初始化)
5. 返回操作方向给调用者

4. 技术架构

4.1 客户端架构

┌─────────────────────────────────────────────────────────┐
│                     应用层                               │
├─────────────────────────────────────────────────────────┤
│  OkxWebSocketClientManager                              │
├─────────────────┬───────────────────────────────────────┤
│                 │                                       │
│ OkxNewPrice     │  OkxQuantWebSocketClient (多实例)     │
│ WebSocketClient │  ┌─────────┐ ┌─────────┐ ┌─────────┐  │
│                 │  │ Account1│ │ Account2│ │ AccountN│  │
│                 │  └─────────┘ └─────────┘ └─────────┘  │
├─────────────────┴───────────────────────────────────────┤
│                     WebSocket通信层                      │
├─────────────────────────────────────────────────────────┤
│                     OKX WebSocket API                   │
└─────────────────────────────────────────────────────────┘

4.2 数据流向

1. OKX公共WebSocket → OkxNewPriceWebSocketClient → Redis存储价格
2. OKX私有WebSocket → OkxQuantWebSocketClient → 私有数据处理
3. 价格变化 → CaoZuoService策略执行 → TradeOrderWs订单执行
4. 订单结果 → OrderInfoWs处理 → 更新订单状态
5. 仓位变化 → PositionsWs处理 → 更新仓位数据

5. 关键特性

5.1 WebSocket连接管理

  • 心跳检测:定期发送ping请求,检测连接有效性
  • 自动重连:连接断开时,使用指数退避算法自动重连
  • 连接状态监控:实时监控连接状态(connected/connecting/initialized)

5.2 多账号支持

  • 独立客户端:每个账号拥有独立的WebSocket客户端实例
  • 账号隔离:账号数据隔离存储,避免数据冲突
  • 统一管理:通过OkxWebSocketClientManager统一管理所有账号客户端

5.3 网格策略

  • 多网格支持:支持设置多个网格区域
  • 方向控制:每个网格可配置独立的操作方向(long/short)
  • 动态匹配:根据当前价格自动匹配对应的网格策略

5.4 多空支持

  • 仓位分离:多头和空头仓位数据分离存储
  • 独立操作:多空方向可独立进行策略执行
  • 风险控制:针对多空方向独立设置风险控制参数

6. 配置与扩展

6.1 网格策略配置

当前网格策略通过WangGeListEnum硬编码配置:

UP("上层做空", "2", "3100", "3000", "2", "short", "3100"),
CENTER("中间指定一个方向", "2", "3000", "2950", "2", "long", "2950"),
DOWN("下层做空", "2", "2950", "2920", "2", "short", "2950"),
DOWN_ONE("下层做多", "2", "2920", "2900", "2", "long", "2900");

扩展建议
- 将网格参数迁移到数据库或配置文件
- 实现动态加载和更新网格策略
- 支持网格策略的增删改查操作

6.2 账号配置

账号信息通过ExchangeInfoEnum配置,每个枚举值对应一个交易账号。

6.3 性能优化

  • 线程池管理:合理配置线程池大小,避免资源浪费
  • 连接复用:考虑连接复用策略,减少连接数量
  • 数据缓存:合理使用缓存,减少重复计算

7. 开发与维护

7.1 开发流程

  1. 理解现有策略逻辑和数据流
  2. 根据需求修改或扩展策略
  3. 更新相关配置(如网格参数)
  4. 测试策略有效性
  5. 部署到生产环境

7.2 常见问题

问题1:WebSocket连接频繁断开
解决:检查网络环境,调整心跳间隔和重连策略

问题2:策略执行不符合预期
解决:检查网格参数配置,分析策略执行日志,调整策略逻辑

问题3:订单执行失败
解决:检查账号权限,查看订单执行日志,分析失败原因

7.3 日志与监控

  • 关键操作日志:记录WebSocket连接、策略执行、订单操作等关键事件
  • 错误日志:记录异常情况,便于问题排查
  • 性能监控:监控系统性能指标,及时发现性能瓶颈

8. 未来规划

  1. 动态策略配置:支持通过后台管理系统动态配置网格策略
  2. 策略回测:实现策略回测功能,提高策略有效性
  3. 风险控制增强:增加更完善的风险控制机制
  4. 多交易所支持:扩展支持其他交易所
  5. 数据可视化:实现交易数据可视化展示

版本:1.0
更新日期:2025-12-17
维护人:开发团队