3.3 KiB
3.3 KiB
子项目 4 Position.update 状态机迁移到 Rust 实现计划
目标:将 Position.update 状态机(~135 行 Python)从 Python 子类迁移到 Rust 核心。
设计文档: docs/superpowers/specs/2026-06-23-position-update-state-machine-design.md
任务 0:扩展 Rust 核心 Position
文件: chanlun/src/signal/position.rs
- 新增类型:
操作记录、持仓记录、开平配对、最近事件 - Position 结构体新增 7 个状态字段(pos, pos_changed, operates, holds, last_event, last_lo_dt, last_so_dt, end_dt)
新建()构造函数适配(状态字段初始化为默认值)- 实现
push_operate()内部辅助方法 - 实现
update(&mut self, dt, price, bid, signals) -> Result<(), 缺键错误>— 核心状态机 - 实现
pairs() -> Vec<开平配对>— 开平配对计算 - 实现
dump_config()/load_config()— 序列化辅助 - 内部辅助函数:
同一交易日、间隔检查、允许操作 - Rust 单元测试(28 用例)
任务 1:更新 PyO3 绑定
文件: chanlun-py/src/signal_py.rs
- 新增 helper:
核心op转pyop()、时间戳转datetime() - 新增状态 getter:
pos,pos_changed,operates,holds,pairs - 实现
update(PyDict)— 提取 dt/close/bid + 转换 信号字典 + 调用核心 - dt 类型兼容:支持 datetime / int / float
- dump(with_data) — 支持附带 pairs/holds
- load() 静态方法
- 新增
取事件列表辅助函数 - 更新
__repr__包含 pos
任务 2:更新 Python 子类
文件: chanlun-py/chanlun/chan_external.py
__init__简化为pass(状态由 Rust 初始化)- 删除
update()(Rust 提供) - 删除
pairsproperty(Rust 提供) dump()委托给 Rustsuper().dump(with_data=...)load()使用cls(...)构造(保持子类类型)- 保留
get_signals_config()
任务 3:测试
文件:
-
chanlun/src/signal/position.rs— Rust 单元测试(28 用例) -
chanlun-py/tests/test_position_update.py— Python 集成测试(24 用例) -
chanlun-py/tests/test_signal_primitives.py— 已有测试更新(4 position 用例) -
基础开多/开空/平多/平空
-
间隔限制
-
止损(多头/空头)
-
超时
-
时间倒退容错
-
空事件列表容错
-
无匹配事件容错
-
缺键错误
-
T0 模式
-
pairs 盈亏计算(多头/空头)
-
pairs 持仓天数
-
dump/load with/without data
-
dt 类型兼容(datetime / int / float)
任务 4:文档
- 创建设计文档
docs/superpowers/specs/2026-06-23-position-update-state-machine-design.md - 创建实现计划
docs/superpowers/plans/2026-06-23-position-update-state-machine.md - 更新
CLAUDE.md子项目表
自检结论
- 规格覆盖:设计 §3 新增类型 → 任务 0;§4 update 算法 → 任务 0;§5 文件结构 → 任务 0-3
- 类型一致:
update()参数使用已有信号字典类型;Operate枚举已有 Rust 版 - 向后兼容:Python 子类保留;update/pairs/operates/holds API 不变;dt 支持三种输入格式
- 测试覆盖:Rust 28 用例 + Python 24 用例 + 已有 4 用例更新