量化交易系统
技术标签:Golang / Spring Boot / React / MySQL / Redis / 阿里云
项目角色:资深研发工程师
面向中心化交易所的策略执行与运营平台,支持多交易所行情分析、策略配置、自动化交易执行和收益统计。管理后台负责配置与运营,Golang 交易机器人负责行情检测、机会识别、订单执行、任务调度及交易状态维护。
文档依据项目负责人提供的项目描述与技术亮点整理,尚未核验该系统源码。下文中的模块能力来自项目描述;接口边界、细化状态、数据字段及异常处理细节作为设计说明和核验建议,不代表已确认的代码实现。未提供的性能数值、消息队列产品和云服务部署细节不作推定。
阅读导航
- 项目概述
- 系统架构与模块职责
- 管理后台与运营流程
- Golang 机器人框架
- 策略任务调度
- 价格触发与订单状态机
- 交易所接入层
- 消息队列与订单持久化
- 利润统计与对账
- 密钥管理、日志与告警
- 部署、恢复与验证
- 项目角色与技术价值
一、项目概述
系统把策略配置转化为持续运行的交易任务,并将行情判断、挂撤单、成交记录与收益统计连接起来。运营人员通过后台管理交易所授权与策略参数,机器人根据任务状态启动或停止策略实例,执行过程产生的订单事件异步进入持久化与统计链路。
核心功能包括:
- 密钥配置:管理不同交易所 API Key,支持账户资产查询和订单操作所需授权。
- 币种分析:对比交易对价格、盘口和潜在利润空间,为机会判断提供输入。
- 策略配置:配置交易阈值、任务启停和仓位规则,适应不同市场条件。
- 利润统计:查看历史交易、收益与策略结果,支持复盘和参数调整。
行情价差只是机会线索,实际执行结果还受手续费、成交深度、滑点、订单部分成交等因素影响。文档中的“套利机会”表示策略识别结果,不代表确定收益。
二、系统架构与模块职责
React 管理界面
→ Spring Boot 管理服务
→ 密钥配置 / 币种分析 / 策略配置 / 任务管理 / 利润统计
→ MySQL、Redis
Golang 交易机器人
→ 生命周期与依赖装配
→ 数据库任务轮询 → 策略实例 / 插件式 Runner
→ 行情检测 → 价格判断 → 订单状态机
→ 交易所接入层 → OKX / Binance 等交易所
→ 订单事件 → 消息队列 → 批量落库 → 统计与对账
→ 结构化日志 / Telegram 告警
这是逻辑架构,消息生产、消费与持久化服务的实际部署位置需要结合源码确认。
| 模块 | 主要职责 | 关键边界 |
|---|---|---|
| React 界面 | 展示配置、任务与交易结果 | 展示状态应区分请求已提交与机器人已生效 |
| Spring Boot 后台 | 配置管理、运营入口、统计查询 | 校验权限、参数与配置版本 |
| Golang 框架 | 生命周期、依赖装配、调度与 Runner 管理 | 控制策略实例数量与退出过程 |
| 策略 Runner | 检测行情、判断阈值、推进订单执行 | 避免重复动作,维护执行上下文 |
| 交易所接入层 | 余额、盘口、下单、撤单和查单 | 保留交易所差异和原始错误信息 |
| 订单持久化链路 | 消费订单事件并批量落库 | 处理重复、乱序与写入失败 |
| 日志与告警 | 关联任务、订单与异常 | 避免暴露凭证,控制重复通知 |
三、管理后台与运营流程
从配置到运行
运营人员选择交易所并配置授权,查看币种与盘口分析结果,配置策略参数和仓位规则,创建任务并请求启动。机器人检测到待运行任务后装配策略实例,持续回写运行状态和交易结果,后台再展示实际执行进度。
配置与运行态分开
建议区分策略定义、参数版本、任务期望状态和机器人实际状态。后台点击停止后,先展示“待停止”;机器人完成收尾后再显示已停止。运行过程中调整阈值或阶梯仓位,需要明确立即生效、下一轮生效或重启生效,避免同一轮交易使用混合参数。
币种分析
对比多交易所同一资产时,先确认交易对、计价币、数量精度与盘口时间。机会分析应结合可成交深度及执行成本,保留行情快照时间,防止旧盘口推动新的交易。
四、自研 Golang 机器人框架
框架封装应用生命周期、依赖装配、守护调度、优雅停机与插件式 Runner 接入,让不同策略复用运行基础设施。
生命周期
启动阶段加载配置并装配数据库、Redis、交易所客户端、事件生产器和告警组件;运行阶段由调度器管理策略实例;退出阶段停止领取新任务,向运行实例传播取消信号,处理在途订单状态并释放资源。
Runner 边界
Runner 负责一类策略的执行循环,接收稳定的配置、取消上下文和公共依赖。行情获取、交易所调用、订单记录与告警不应在每个策略中重复实现。实际 Runner 接口、注册方式和依赖容器实现待源码核验。
守护与退出
守护机制应区分可恢复的运行异常和需要人工处理的交易异常。实例崩溃后先恢复订单上下文,再决定是否继续。优雅停机表示有序结束本地工作;已在交易所生效的订单仍需查单、撤单或由恢复流程继续管理。
五、策略任务调度
项目以数据库状态轮询驱动“待运行 / 运行 / 待停止”的任务流转,并使用协程隔离不同策略实例。
| 状态 | 调度行为 | 需要核对的执行结果 |
|---|---|---|
| 待运行 | 校验参数和依赖,尝试领取并创建实例 | 确认实例启动后推进到运行 |
| 运行 | 维护实例与任务对应关系 | 持续观察心跳、错误及订单状态 |
| 待停止 | 通知实例退出,处理在途工作 | 收尾完成后写入实际停止结果 |
最终停止态、失败态和恢复态的具体枚举未提供,应与数据库定义对齐。
实例隔离与领取
一个任务对应独立执行上下文,慢策略不阻塞其他策略。若部署多个机器人进程,仅靠“查到待运行任务”不能保证唯一执行;建议采用条件更新、版本或租约确认领取权,并记录任务所属实例。
资源与恢复
轮询间隔、并行任务数和交易所请求并发需要分别限制。应用重启时核对数据库任务与交易所活跃订单,再恢复实例,避免将进程退出前已提交的订单重复下单。
六、价格触发与订单状态机
项目使用“价格触发 + 订单状态机”模型,支持秒级行情检测、阈值挂撤单、基准价更新、阶梯仓位、超时撤单与异常告警。“秒级检测”为项目描述中的能力目标,具体延迟与吞吐未提供测量数据。
价格触发链路
读取盘口 → 检查行情时效 → 对照基准价与阈值
→ 计算本阶梯目标仓位 → 检查余额和交易规则
→ 创建订单意图 → 下单 / 查单 / 撤单
→ 汇总已成交数量与费用 → 更新策略上下文
基准价应在明确定义的业务节点更新,例如某一成交条件达成后。它的具体更新规则需以策略实现为准,不能把下单成功直接等同于完成一次仓位调整。
建议订单状态划分
以下为说明性状态,不代表项目现有枚举:
| 状态 | 含义 | 后续动作 |
|---|---|---|
| 待提交 | 已生成订单意图 | 校验执行权与参数后提交 |
| 提交中 | 下单请求进行中 | 按响应记录已受理、拒绝或未知 |
| 活跃 / 部分成交 | 订单仍有未成交量 | 查单、等待或触发撤单 |
| 待撤销 | 已发送撤单请求 | 继续查询最终成交与撤单状态 |
| 已成交 / 已撤销 / 已拒绝 | 已知终态 | 更新订单记录与策略上下文 |
| 结果未知 | 无法确认是否受理或完成 | 查询原订单并保留待处理上下文 |
阶梯仓位与超时撤单
每个阶梯关联目标数量、实际成交数量和活跃订单。部分成交后继续下单时,按剩余目标计算,避免重复计算原目标。超时撤单必须考虑撤单与成交同时发生:撤单响应后仍应核对最终成交量,再更新基准价及仓位。
七、交易所接入层
统一封装余额查询、盘口获取、下单、撤单、查单,支持 OKX、Binance 等交易所扩展。公共层表达业务动作,具体实现负责参数转换、错误映射、超时与限流处理。
| 公共能力 | 需要保留的差异 |
|---|---|
| 余额查询 | 可用、冻结、账户类型与更新时间 |
| 盘口查询 | 交易对命名、深度档位与时间戳 |
| 下单 | 价格精度、数量步长、最小金额与订单类型 |
| 撤单与查单 | 订单标识、最终状态和部分成交明细 |
| 错误处理 | 限流、业务拒绝、网络失败和结果未知 |
这些是接入核验项,具体规则以实际交易所接口及代码为准。
超时与重试
只读查询可以在总预算内退避重试;下单超时需要先查原订单。建议保留客户端订单标识,并在对应交易所支持的范围内用于关联查询,避免通用重试器重复下单。撤单失败也要区分请求未送达、订单已成交和明确拒绝。
多交易所执行
跨交易所的多笔订单不会天然原子完成。策略应明确一侧成交、另一侧失败或部分成交时的后续动作及暴露上限;这属于策略规则,当前描述未提供具体对冲或补偿算法。
八、消息队列与订单持久化
通过消息队列解耦交易执行与订单落库,消费端批量写入订单事件。MySQL 与 Redis 共同支撑策略配置、任务状态、收益数据和交易记录,具体表结构、Redis Key 与消息队列产品未提供。
建议事件内容
关联事件 ID、任务 ID、策略版本、交易所、账户逻辑标识、客户端订单号、交易所订单号、状态、成交数量、费用和观测时间。记录结构应支持追踪同一订单的多次状态变化。
批量写入与重复事件
批量落库需要处理部分失败和重放。建议用唯一事件标识防重复写入,并对状态更新作版本或顺序检查,避免迟到事件把已成交订单覆盖为早期状态。成交明细与订单快照应分开理解:同一订单可能产生多笔成交。
持久化失败窗口
“消息已发送”与“交易所已接收”是不同事实。发送失败、消费后未确认、数据库提交后消费者退出都需要恢复规则。若执行端不能保证事件可靠投递,应通过交易所查单与对账补齐,不能单靠异步队列宣称没有遗漏。
九、利润统计与对账
后台展示历史交易、收益和策略执行结果。统计首先需要定义范围:按策略任务、交易所账户、交易对和时间窗口分别统计,明确统计使用成交时间还是订单创建时间。
建议区分的指标
- 已实现收益:基于可匹配的实际成交与成本口径计算。
- 持仓浮动结果:按选定估值时间和价格展示,与已实现部分区分。
- 手续费:记录原币种与换算依据,避免直接累加不同币种。
- 运行指标:任务运行时间、成交次数、拒单及异常次数。
具体盈亏算法、成本分摊方式和汇率来源未提供,不能直接以订单价格差替代净收益。
结果对账
将本地订单、成交明细与交易所查询结果核对,再核对费用和账户变化。处理部分成交撤单、费用使用第三方币种、人工交易及资金划转时,应区分策略收益与账户总资产变化。异步批量落库期间标明统计更新时间,避免把短时延迟误认为数据丢失。
十、密钥管理、日志与 Telegram 告警
项目集成密钥加解密、结构化日志和 Telegram 告警,为授权管理、执行追踪与异常响应提供支持。
密钥配置
API Key 和 Secret 的存储与使用需要加解密机制配合访问权限。建议界面只显示脱敏值,机器人按任务权限读取;加密主密钥与密文分开管理。具体加密算法、密钥轮换和权限模型未提供,不把技术标签等同于安全验证结论。
结构化日志
用任务 ID、策略版本、交易所、订单标识、状态变化、耗时和错误类别连接运行链路。不要记录 Secret、完整签名参数或认证请求头。排查下单异常时保留业务错误码与可复现的非敏感参数。
Telegram 告警
对机器人异常退出、任务长时间待停止、下单结果未知、撤单失败、持久化积压和对账差异发送明确告警。建议按任务与故障类型合并重复通知,附上时间、任务、订单和下一步检查入口;告警发送失败不得影响交易状态保存。
十一、部署、恢复与验证
项目使用阿里云;具体计算实例、数据库、缓存、消息服务和网络拓扑未提供。本章按逻辑组件说明运行检查,不指定未经确认的云产品或容量。
启动与退出
启动时确认配置、数据库、Redis、消息通道与交易所连接可用,再开始领取任务。退出时停止接收新任务,通知 Runner 收尾,保存可恢复上下文,等待订单事件提交并关闭连接。未完成订单交由恢复流程继续核对。
验证场景
| 场景 | 重点检查 |
|---|---|
| 两个机器人同时发现待运行任务 | 同一任务是否只产生一个有效执行实例 |
| 行情停止更新或盘口过旧 | 是否暂停新的价格触发动作 |
| 下单已受理但响应丢失 | 是否查询原订单而非重复下单 |
| 部分成交后触发撤单 | 最终成交量与剩余仓位是否一致 |
| 实例退出时仍有活跃订单 | 是否保留订单并在恢复后继续追踪 |
| 消息重复或乱序 | 订单状态与成交明细是否正确收敛 |
| 批量落库失败后恢复 | 是否补齐事件且没有重复统计收益 |
| 策略参数在运行期间调整 | 是否使用明确的配置版本 |
| Telegram 不可用 | 是否保留日志与可恢复的告警记录 |
先以模拟交易所响应验证状态分支,再在适用的测试环境验证接口;本文档尚未代表真实账户集成测试结果。
十二、项目角色与技术价值
项目角色为资深研发工程师。技术工作围绕 Golang 机器人框架、数据库驱动的任务调度、价格触发与订单状态机、交易所接口抽象、异步订单持久化,以及密钥与运维追踪能力展开。
框架复用减少策略重复开发;协程隔离让策略独立运行;统一接入层降低交易所扩展时的重复工作;订单事件和统计链路便于复盘与运营。这些是设计目的与能力说明,服务器资源降低、执行效率提升等效果需要以实际对照测量补充。
与多链策略系统相比,本系统主要围绕中心化交易所的账户、行情与订单 API 组织执行;两者可以复用任务编排和可观测性的设计思路,具体交易协议与状态语义分别实现。