# 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`硬编码配置: ```java 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 **维护人**:开发团队