80 lines
3.3 KiB
Markdown
80 lines
3.3 KiB
Markdown
# 子项目 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`
|
||
|
||
- [x] 新增类型:`操作记录`、`持仓记录`、`开平配对`、`最近事件`
|
||
- [x] Position 结构体新增 7 个状态字段(pos, pos_changed, operates, holds, last_event, last_lo_dt, last_so_dt, end_dt)
|
||
- [x] `新建()` 构造函数适配(状态字段初始化为默认值)
|
||
- [x] 实现 `push_operate()` 内部辅助方法
|
||
- [x] 实现 `update(&mut self, dt, price, bid, signals) -> Result<(), 缺键错误>` — 核心状态机
|
||
- [x] 实现 `pairs() -> Vec<开平配对>` — 开平配对计算
|
||
- [x] 实现 `dump_config()` / `load_config()` — 序列化辅助
|
||
- [x] 内部辅助函数:`同一交易日`、`间隔检查`、`允许操作`
|
||
- [x] Rust 单元测试(28 用例)
|
||
|
||
## 任务 1:更新 PyO3 绑定
|
||
|
||
**文件:** `chanlun-py/src/signal_py.rs`
|
||
|
||
- [x] 新增 helper:`核心op转pyop()`、`时间戳转datetime()`
|
||
- [x] 新增状态 getter:`pos`, `pos_changed`, `operates`, `holds`, `pairs`
|
||
- [x] 实现 `update(PyDict)` — 提取 dt/close/bid + 转换 信号字典 + 调用核心
|
||
- [x] dt 类型兼容:支持 datetime / int / float
|
||
- [x] dump(with_data) — 支持附带 pairs/holds
|
||
- [x] load() 静态方法
|
||
- [x] 新增 `取事件列表` 辅助函数
|
||
- [x] 更新 `__repr__` 包含 pos
|
||
|
||
## 任务 2:更新 Python 子类
|
||
|
||
**文件:** `chanlun-py/chanlun/chan_external.py`
|
||
|
||
- [x] `__init__` 简化为 `pass`(状态由 Rust 初始化)
|
||
- [x] 删除 `update()`(Rust 提供)
|
||
- [x] 删除 `pairs` property(Rust 提供)
|
||
- [x] `dump()` 委托给 Rust `super().dump(with_data=...)`
|
||
- [x] `load()` 使用 `cls(...)` 构造(保持子类类型)
|
||
- [x] 保留 `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 用例)
|
||
|
||
- [x] 基础开多/开空/平多/平空
|
||
- [x] 间隔限制
|
||
- [x] 止损(多头/空头)
|
||
- [x] 超时
|
||
- [x] 时间倒退容错
|
||
- [x] 空事件列表容错
|
||
- [x] 无匹配事件容错
|
||
- [x] 缺键错误
|
||
- [x] T0 模式
|
||
- [x] pairs 盈亏计算(多头/空头)
|
||
- [x] pairs 持仓天数
|
||
- [x] dump/load with/without data
|
||
- [x] dt 类型兼容(datetime / int / float)
|
||
|
||
## 任务 4:文档
|
||
|
||
- [x] 创建设计文档 `docs/superpowers/specs/2026-06-23-position-update-state-machine-design.md`
|
||
- [x] 创建实现计划 `docs/superpowers/plans/2026-06-23-position-update-state-machine.md`
|
||
- [x] 更新 `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 用例更新
|