refactor: RatioSizer 经 _data_feeder 取价对齐组件边界 (#3877)#6431
Conversation
Code reviewNo issues found(5 agent 审查 + 竞争 PR 核查 + 接口契约验证,全部 clean)。核心重构正确:RatioSizer.cal LONG 分支取价从直访 核查要点(均通过):
🤖 Generated with Claude Code - If this code review was useful, please react with 👍. Otherwise, react with 👎. |
Code reviewNo issues found. Checked for bugs and CLAUDE.md compliance. One out-of-scope same-root issue noted below (non-blocking, follow-up recommended). Verified(#3877:RatioSizer LONG 分支取价从
https://github.com/Kaoruha/GinkGO/blob/master/src/ginkgo/trading/sizers/atr_sizer.py#L77-L80 #3877 issue body 与 CLAUDE.md 组件边界规则适用于全部 Sizer,本 PR 标题/body 明确限定 ratio_sizer,atr_sizer 是独立文件不构成本 PR 缺陷。但为彻底闭环"Sizer 不直访 data 层",建议:要么本 PR 扩展范围一并改 atr_sizer(同款 🤖 Generated with Claude Code - If this code review was useful, please react with 👍. Otherwise, react with 👎. |
LONG 分支不再直访 container.bar_service().get(),改用注入的 _data_feeder.get_historical_data(symbols, start_time, end_time), 对齐 FixedSizer 范式。删 container import,加 _data_feeder None 守卫。 违反组件边界单向流动(Sizer 不应直访 data 层)。 Co-Authored-By: Claude <noreply@anthropic.com>
c9daa7a to
ae52d0b
Compare
Summary
RatioSizer.calLONG 分支直访container.bar_service().get()取历史价格,绕过注入的_data_feeder接口,违反组件边界单向流动(Selector → Strategy → Sizer → Risk,Sizer 不应直访 data 层 Service)。对齐FixedSizer范式改走_data_feeder.get_historical_data。根因
container.bar_service().get(code, start_date, end_date)取价,而非用 SizerBase 提供的self._data_feeder。RatioSizer.calL110 →container.bar_service().get(...)→ 直访 data 层 Service(绕过注入的_data_feeder)。FixedSizer范式(self._data_feeder.get_historical_data(symbols, start_time, end_time))。bind_data_feeder注入控制;(3) 实盘拿不到回测 feeder 的缓存价格。修改
src/ginkgo/trading/sizers/ratio_sizer.py:container.bar_service().get(...)→self._data_feeder.get_historical_data(symbols=[code], start_time=..., end_time=...),去掉result.success/result.data.to_dataframe(),直接用返回的 DataFrame。if self._data_feeder is None: GLOG.ERROR(...); return None守卫(对齐 FixedSizer L115)。from ginkgo.data.containers import container(修复后无引用)。Test plan
TDD RED→GREEN(
tests/unit/trading/sizers/test_ratio_sizer.py,2 测试):test_long_uses_data_feeder_not_container:双重锁——正向feeder.get_historical_data被调用 + 反向container.bar_service不被调用(patch 单例源对象属性,对任意 import 方式成立);端到端断言订单生成。test_long_no_data_feeder_returns_none:未绑定 feeder 时 ERROR 返回 None 不崩。三层冒烟全绿:
Closes #3877
🤖 Generated with Claude Code