01学完这一课,你能做到什么
学完这一课,你应该能:
- 把一次晨报改造成按周期运行的监测主循环;
- 分清后端、控制台和通知模块的职责;
- 设计事实状态、控制意图、心跳和分级告警;
- 处理断网、超时、部分成交、重启和重复信号;
- 在模拟环境里验收系统,而不是把“页面能打开”当成系统可用。
本课讨论的是面向真实执行的系统架构,不等于已经部署、授权或适合直接交易。
一句话记住先保证状态一致,再恢复交易。
02从一次晨报变成持续监测
晨报只在固定时间运行一次;持续系统则按周期读取行情、账户和信号。假设每 60 秒运行一轮,但周期要按策略和风险要求配置。服务全天在线,也不等于全天允许交易:必须区分交易日、交易时段、休市、集合竞价,以及日线或分钟线是否已经完成。
一轮主循环可以按这个顺序组织:
- 读取暂停、恢复和状态;
- 检查行情与交易连接;
- 刷新持仓、现金、可卖数量和盈亏;
- 检查账户级日内亏损是否触发熔断;
- 检查持仓、退出和到期条件;
- 遍历 watchlist(关注清单),计算每个标的的信号;
- 对拟议订单运行风控;
- 进入模拟执行,或进入已授权的审批与真实执行流程;
- 保存状态、信号、订单、事件和心跳。
暂停买入、全局暂停、强制熔断、解除熔断和清仓必须有不同语义。停止新增风险时,账户刷新和风险监测仍应继续。
- 1读控制状态暂停/熔断
- 2查连接和账户行情/持仓/现金
- 3算信号并过风控只用有效数据
- 4执行并记录订单/事件/心跳
一句话记住在线不等于可交易,先检查时间和数据。
03后端、控制台和通知各做什么
后端负责数据、信号、风控和订单;控制台负责展示状态并提交人的控制意图;通知模块按严重程度传递事件。页面卡顿不应该拖住风险处理。
环境检查也属于系统边界:数据库、MiniQMT 本地路径、资金账号、模型接口、Python 和依赖版本,都应从实际配置与日志确认。".env.sample"只是配置示例,密钥不能放入课程或公共仓库。"0.0.0.0"表示监听本机所有接口,不是浏览器访问地址,也不代表可以安全地暴露到公网。涉及账户的控制台应认证并限制权限。
、模拟账户、策略对比、投研对话和晨会可以接入同一控制台,但各模块的状态和失败要可追踪。历史展示中的年化约 9.31%、 约 5.59%等数字,只能视为特定样本的展示,不能据此承诺某标的或策略长期有效。
一句话记住界面是观察和控制层,不是交易逻辑本身。
04共享状态:事实和意图必须分开
共享状态可以暂存在 "live_state.json",但字段要分成两类:
- 事实:权益、现金、持仓数量和成本、最新价、盈亏、信号、订单、健康度和事件;
- 意图:暂停、恢复、阈值修改等人的控制请求。
事实应由后端从可信数据源写入,网页只读;人的操作写入控制通道,由后端验证、执行并回报。前端不能直接把一个数字改成“真实余额”。每类数据还要明确唯一写入者、格式版本和保留策略。页面可以只展示最近 200 条事件,审计记录则应追加保存,不能因为界面有限就丢失历史。
模拟账户可以从 100 万元初始资金和可配置初始持仓开始,但模拟成交、排队、、部分成交、拒单、和延迟可能被简化,不能把模拟状态当成真实账户。
一句话记住事实由数据源确认,意图由后端执行。
05原子写能防半个文件,但防不了所有并发
写 JSON 时,可以先在目标目录附近写临时文件,完整写入并关闭后,再用合适的原子替换操作替换正式文件。这样读者不会看到只写了一半的 JSON;需要断电后仍可靠保存时,还要考虑 flush 和 fsync。
但原子可见性不等于多写入者安全。控制台和后端如果都读到旧版本,再分别写入新版本,仍可能互相覆盖。更稳妥的方案包括单写入者、文件锁、版本比较或数据库事务。文件轻量,数据库便于历史查询和事务;两者都需要明确并发边界。
原子替换
避免读到半个文件。
并发控制
避免多个写入者互相覆盖。
一句话记住不读半个文件,不等于不会丢更新。
06五级事件:越严重,越少自动冒险
可以把事件按严重程度分为五级:
| 等级 | 示例 | 处理方向 |
|---|---|---|
| L1 轻微 | 单次拉取失败 | 记录并有限重试,不用缺失数据下单 |
| L2 信息 | 信号产生、正常风控拒绝 | 记录并聚合通知 |
| L3 警告 | 委托失败、可恢复错误 | 核对状态后有限处理 |
| L4 严重 | 连接失效、行情停滞 | 暂停新增交易并即时告警 |
| L5 紧急 | 进程退出、重大熔断 | 保持安全状态,人工处置 |
订单回报超时,不能直接重试:订单可能已经被接受,必须先用唯一订单号核对。普通信息可以约 30 分钟聚合一批,严重事件不能等待聚合。通知发送成功也不代表问题解决。
一句话记住超时先查订单,严重先停新增风险。
07三处心跳,分别回答三个问题
心跳是定期写出的“我还活着、数据还新鲜”的信号:交易连接可以约 30 秒更新,行情可以约 1 分钟检查,主循环写自己的最新时间戳。三者必须分开显示。
主循环没有更新,可能是进程卡住;行情没有更新,可能是数据源失效;交易连接没有更新,可能无法查询或提交订单。对 60 秒循环,直接把“30 分钟没有更新”当成死锁阈值可能太迟,阈值要按风险设置。监控进程不能和被监控进程一起卡住,关键守护应独立。自动重启后,先核对账户和外部订单,再决定是否恢复交易。
交易连接
还能查账户和订单吗?
行情连接
价格和时间戳新鲜吗?
主循环
程序按周期运行吗?
一句话记住进程活着,不代表行情新鲜。
08策略注册、信号去重与模拟验收
策略实现负责算法,YAML 等配置负责给某个标的选择已有策略和参数;配置里新增名称,不会自动生成算法。新策略还要完成实现、注册、界面暴露和测试,运行中不能在没有版本记录和验证的情况下悄悄替换。
同一根日 K 在每分钟轮询时可能反复满足条件。应使用信号编号、信号时间戳和去重,让同一信号最多产生预期的一次动作。回测与实盘尽量共用指标和信号函数,把成交模拟与真实执行适配器分开。
模拟盘可以用 100 万元虚拟资金和 mock 持仓运行,不需要券商模拟账号;一次展示中的约 107 万元净值或约 7.27%变化,只代表那次模拟状态,不代表真实收益。执行适配器必须在模拟模式下禁止真实发送。
一句话记住配置选择算法,不能凭名字创造算法。
系统异常判断
面对断网、重复请求、部分成交和重启等情景,判断系统应如何安全处理。
你是持续运行系统的值班工程师。判断异常时,优先保护账户和数据一致性:先核对状态,再决定重试、暂停或人工处置。
行情连接断开
主循环发现行情连接失效,最新行情已经超过有效期,账户连接仍可用。策略刚产生一条买入信号。
09持续运行的验收,不是把进程启动起来
阻塞式调度器本身没有守护能力。Linux 可以使用 systemd,Windows 可以使用任务或服务管理,但要按实际环境验证;调度还要考虑交易日、午休、时区和集合竞价,不能把 9:30—15:00当成连续可成交区间。
先在完全隔离真实发送的模式运行 "run_once",再连续运行多个周期,制造数据失败、重复信号、断网、重启、磁盘满、文件损坏、审批超时和未成交订单。最终至少拿出三类证据:主循环持续更新、告警按等级处理、模拟订单与账户对账一致。持续观察一周可以作为演练起点,不是生产高可用的充分条件。
一句话记住验收看证据,不看页面是否热闹。
4 道小题
全部答对,这一课就算真正读懂了。答错了会告诉你为什么。
这一课,浓缩成一张卡
学完可以保存或分享给朋友。保存成图片的功能会在下一版加上。
让状态可见、故障可控、恢复不重复下单。
- 事实和意图隔离
- 三种心跳独立
- 异常先核对再动作
记住这 5 句话
- 01持续系统要区分交易时间、数据有效性和服务在线状态。
- 02主循环按控制状态、连接、账户、风险、信号、风控、执行、记录的顺序运行。
- 03事实状态与人的控制意图分开,原子替换不等于并发安全。
- 04超时、部分成交、重启和重复信号都要先核对外部状态,不能盲目重试。
- 05模拟、告警和一周观察只能提供验收证据,不能替代真实授权与生产验证。
完成这一课
读完讲义、动手做一次实验、答对小题,这一课就算学完了。
- 读完讲义
- 完成一轮系统异常判断
- 通过随堂自测
实验数据AI+金融投资训练营教学样本。固定教学样本
固定教学样本只用于解释量化研究方法,不代表任何真实标的未来表现,也不构成投资建议。