59 lines
3.2 KiB
Markdown
59 lines
3.2 KiB
Markdown
# 子项目 4:Position.update 状态机迁移到 Rust — 设计文档
|
||
|
||
- 日期:2026-06-23
|
||
- 所属:「全 Rust 信号计算迁移」第 4 个子项目(共 4 个)
|
||
- 前置:子项目 1-3 已完成(注册表、信号函数、计算引擎)
|
||
|
||
## 1. 背景与目标
|
||
|
||
子项目 1-3 交付了完整的信号计算链路:`#[signal]` 注册表 → 信号函数 → 计算引擎。Position.update 状态机是信号框架中最后一个仍留在 Python 中的核心逻辑(~135 行),将其迁移到 Rust 后,信号框架的纯 Rust 核心部分全部就位。
|
||
|
||
子项目 4 交付:
|
||
1. Position 状态字段(pos, operates, holds, last_event...)→ Rust 核心
|
||
2. update() 状态机算法 → Rust 核心(与 Python 版 1:1 对应)
|
||
3. pairs() 开平配对计算 → Rust 核心
|
||
4. PyO3 绑定:update(), 状态 getter, dump/load 带状态
|
||
|
||
## 2. 设计决策
|
||
|
||
| 决策 | 选择 | 理由 |
|
||
|------|------|------|
|
||
| 状态字段位置 | 直接加在 Position 结构体 | backtrader 在 GIL 下单线程访问;不需要额外锁 |
|
||
| update 签名(Rust) | `fn update(&mut self, dt: i64, price: f64, bid: i64, signals: &信号字典)` | 核心不依赖 Python 类型;OHLCV 由 PyO3 层提取 |
|
||
| PyDict → 信号字典 | 排除 OHLCV 键后调用 字典转核心 | 复用已有转换逻辑 |
|
||
| dt 类型兼容 | 支持 datetime/i64/f64 → 统一转为 i64 Unix 秒 | 兼容三种常见输入格式 |
|
||
| 时间戳 → Python datetime | `datetime.datetime.fromtimestamp(ts, UTC)` | 保持 operates/holds 元素类型与旧版一致 |
|
||
| Python 向后兼容 | 保留 Python 子类,__init__ 简化为空;update/pairs/dump 由 Rust 提供 | 不破坏 strategies.py 等下游代码 |
|
||
| Operate 枚举映射 | `核心Operate → OperatePy` 一对一转换函数 | 类型安全,无运行时开销 |
|
||
|
||
## 3. 新增 Rust 类型
|
||
|
||
```rust
|
||
pub struct 操作记录 { symbol, dt, bid, price, op: Operate, op_desc, pos }
|
||
pub struct 持仓记录 { dt, pos, price }
|
||
pub struct 开平配对 { 标的代码, 策略标记, 交易方向, 开仓时间, 平仓时间, 开仓价格, 平仓价格, 持仓K线数, 事件序列, 持仓天数, 盈亏比例 }
|
||
pub struct 最近事件 { dt, bid, price, op, op_desc }
|
||
```
|
||
|
||
Position 新增 7 个状态字段:`pos, pos_changed, operates, holds, last_event, last_lo_dt, last_so_dt, end_dt`
|
||
|
||
## 4. update() 状态机
|
||
|
||
与 Python `Position.update(s)` 1:1 对应:
|
||
|
||
1. 时间校验:`dt <= end_dt` → 日志警告,跳过
|
||
2. 事件匹配:遍历 events,调用 `event.is_match(signals)`
|
||
3. 开仓处理:LO → 间隔检查 → 开多/平空;SO → 间隔检查 → 开空/平多
|
||
4. 多头出场:LE 信号 / 止损(price/last_price - 1 < -stop_loss/10000)/ 超时(bid - last_bid > timeout)
|
||
5. 空头出场:SE 信号 / 止损(方向反转)/ 超时
|
||
6. 记录持仓快照 holds
|
||
|
||
## 5. 文件结构
|
||
|
||
```
|
||
chanlun/src/signal/position.rs ← 操作记录/持仓记录/开平配对/最近事件 类型 + 状态字段 + update/pairs
|
||
chanlun-py/src/signal_py.rs ← PositionPy: update(PyDict), 状态 getter, dump(with_data), load, 时间戳转datetime
|
||
chanlun-py/chanlun/chan_external.py ← Python Position 子类简化(__init__ → pass)
|
||
chanlun-py/tests/test_position_update.py ← 集成测试(24 用例)
|
||
```
|