58 个测试 + 保证金硬阻断:给做空策略上双保险
今天很忙。两个独立模块同时推进:MT Rank Snipe 的 58 个测试,和 MARGIN_HARDLOCK 的保证金硬阻断。
你可能会问:做空排行信号和保证金硬阻断有什么关系?关系在于——它们都是防止策略”杀红眼”的机制。 一个从信号质量角度,一个从账户安全角度。
MT Rank Snipe: 58 个测试
微趋势做空排行(MicroTrend Short Rank)是一个新信号源:扫描所有标的,按做空信号强度排序,把最强的推送给执行引擎。
为什么要 58 个测试?因为这个系统有三个容易出错的地方:
1. 多策略并发
同一个标的可能被多个策略同时盯上。测试覆盖:
- 策略 A 做空、策略 B 做多同一个标的 → 不应该两边都开
- 策略 A 已持仓、策略 B 再开同方向 → 合并还是拒绝?
2. 数据异常
排行依赖外部数据源(微趋势分数、资金费率)。测试覆盖:
- 数据源返回空 → fallback 到默认值
- 数据源返回异常值(999999)→ 不参与排行
- 数据源超时 → 用上一次的缓存
3. 订单异常
排行推荐 → 执行引擎下单 → 可能被交易所拒绝。测试覆盖:
- 下单被拒 → 从排行中移除,不重试
- 部分成交 → 剩下的不追
MARGIN_HARDLOCK:1000% 红线
同一天实现了 MARGIN_HARDLOCK——当保证金比例(mgnRatio)低于 1000% 时,方向性硬阻断所有开仓。不是 DENY(可 override),是 HARD BLOCK(不可 override)。
为什么是 1000%?不是拍脑袋的。
期货账户的保证金比例 = 权益 / 持仓保证金。1000% 意味着你有 10 倍于保证金的权益缓冲——即使持仓同时亏损 10%,也不会爆仓。低于这个线,就是杠杆过高。
这跟广告系统的预算硬阻断一样:预算消耗到 100% 时,不再出价——不是降出价,是直接停。因为继续出价只会超预算。
MARGIN_HARDLOCK 也写了 30 个单元测试,覆盖所有 gate path。
元结构映射
| 概念 | 广告系统 | 交易系统 |
|---|---|---|
| 信号质量 | 广告相关性分数 | 微趋势做空排行 |
| 数据异常保护 | 曝光日志缺失 → 用历史 CTR | 数据源超时 → 用缓存 |
| 硬阻断 | 预算耗尽 → 停止出价 | 保证金 < 1000% → HARD BLOCK |
| 可 override 阻断 | 预算预警 → 降出价 | DENY → 人工可 override |
一句话
58 个测试不是追求覆盖率,是覆盖”出错了会亏钱”的路径。MARGIN_HARDLOCK 不是保守,是在你杀红眼之前把你按住。