fix(paper): PositionGuard 加固集成(承接 #88 全部 CR 修复)#93
Conversation
main 经 d12 已并入早期 PositionGuard,但缺 #88 七轮 CR 的加固。本次把缺的补齐: - 风控(major):风控豁免改 is_protective_order 三因子(side=SELL+tag+guard 前缀), 防策略 Order(tag="stop_loss") 仿冒绕 enforce;保护性出场同时豁免 notional 硬上限 (价涨/累积建仓后止损 SELL 必超单笔上限,否则止损静默失效) - 观测(major):report.protective_exits 改按 FillRecord.is_guard 计数,不再混入策略 自带 stop_loss tag(成交侧 is_protective_signature 算出 is_guard) - 架构:PROTECTIVE_EXIT_TAGS/GUARD_ORDER_PREFIX/is_protective_* 移到 model.orders 中立层, 消除 engine↔execution 循环依赖 - 一致性:末根 bar 触发的保护单收尾按 close 兜底成交(flush_protective_at_close),对齐 live - trailing 改自峰值【价格】回撤口径(非成本收益率降幅) - add_strategy 启用 guard 时多策略显式 RuntimeError;live 出单日志区分 guard/策略 - TS BacktestReport.protective_exits 改非 optional - 测试:并入 #88 全部回归(三因子仿冒/BUY 仿冒/is_guard 计数/末根/多策略)+ 保留 main 的同 bar 双 SELL 回归;保留 main 的 SharpeCI 响应与 bootstrap CI Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Deploying inalpha-web with
|
| Latest commit: |
ad4d837
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://08d33368.inalpha-web.pages.dev |
| Branch Preview URL: | https://feat-position-guard-hardenin.inalpha-web.pages.dev |
|
Review @ ad4d837 总结对照 CLAUDE.md 硬约束和通用工程维度逐一检查,核心修复逻辑正确,测试覆盖充分(762 passed),没有发现 critical/major 级别问题。以下是完整的评审记录。 必修(critical / major)无。 可选优化(medium)1.
建议:不需要改逻辑,但可以在 2. and peak_mark > avg # avg > 0 已在 evaluate() L137 守门
and peak_mark > 0 # 因 peak_mark >= mark >= avg > 0,此条件恒 True
逐维度核查记录正确性
设计 / 架构
契约 / 兼容
安全
状态 / 数据流
可测性新增 5 个聚焦测试:末根触发 / guard 拒第二策略 / 多策略无 guard / 策略自带 tag 不计入 guard 计数 / 三因子单元测试。覆盖了所有新引入的边界。 🤖 Generated with Claude Code |
背景
main 经 d12 合并已含早期版 PositionGuard(ADR-0052),但缺了 #88 七轮 CR 的加固——其中两条是真风控缺口。本 PR 是针对当前 main 的纯加固 delta(不重复已在 main 的基础实现),把 #88 的修复整合进来。#88 因 base 被 main 取代、平行实现冲突已关闭。
修的什么(main 现状 → 本 PR)
风控(major)
is_protective_order从单因子(只看order.tag)→ 三因子(side==SELL+ tag ∈ 保护集 +client_order_id以guard-前缀)。否则策略写Order(tag="stop_loss")即可仿冒、绕过enforce(熔断锁期内继续开仓)check_order_notional:价涨/累积建仓后止损 SELL 的 notional 必然超单笔上限,原先会被拒 → 持仓不动 → 每根 bar 重试又被拒 → 止损静默失效观测(major)
report.protective_exits从按 tag 计数 → 按FillRecord.is_guard(成交侧三因子算出)。否则策略自带tag="stop_loss"会被混入 → agent 误报"框架止损 N 次"架构 / 一致性 / 其它
PROTECTIVE_EXIT_TAGS/GUARD_ORDER_PREFIX/is_protective_*移到model.orders中立层 → 消除 engine↔execution 循环依赖flush_protective_at_close),对齐 liveadd_strategy启用 guard 时多策略显式RuntimeError;live 出单日志区分 guard/策略BacktestReport.protective_exits改非 optional保留 main 的内容
合并保留了 main 的 SharpeCI 响应映射、report 的 bootstrap CI、以及 main 自己的同 bar 双 SELL 回归测试——本 PR 只叠加加固,不回退 main 的工作。
验证
uv run ruff check .✅ · 全套 762 passed(确定序)· 无循环依赖(导入冒烟)🤖 Generated with Claude Code