106 lines
4.4 KiB
Markdown
106 lines
4.4 KiB
Markdown
# 信号计算器完全移植评估
|
||
|
||
- 日期:2026-06-23
|
||
- 前置:混合迁移(SignalEngine + SignalOrchestrator)已完成
|
||
|
||
## 1. 当前差距
|
||
|
||
### 1.1 未移植的 Python 信号函数(7/8)
|
||
|
||
| 函数 | 文件 | 行数 | 复杂度 | 移植工时 |
|
||
|------|------|------|--------|----------|
|
||
| `bar_zdt_V230331` | demo.py | 38 | 极低 | ~1h |
|
||
| `macd_金叉` | demo.py | 56 | 低 | ~1-2h |
|
||
| `tas_macd_direct_V221106` | demo.py | 55 | 低 | ~1-2h |
|
||
| `tas_ma_base_V230313` | demo.py | 57 | 低-中 | ~2-3h |
|
||
| `cxt_停顿分型_V230106` | demo.py | 49 | 低-中 | ~3-5h |
|
||
| `cxt_bi_end_V230222` | demo.py | 74 | 中 | ~4-8h |
|
||
| `模板_V日期` | _template.py | 28 | 模板 | 不需要 |
|
||
|
||
**总计:约 12-21 小时**
|
||
|
||
> 已移植的只有 `youwukuncheng_中枢第三买卖点_V230602`(1/8)。
|
||
|
||
### 1.2 可移除的 Python 组件
|
||
|
||
| 组件 | 文件 | 替换方案 |
|
||
|------|------|----------|
|
||
| `SignalsParser` 类 | chan_external.py:102-293 | 不再需要——配置由 Rust 注册表直接生成 |
|
||
| `get_signals_config()` | chan_external.py:296-310 | `list_signals()` + 直接构造配置 |
|
||
| `从信号列表提取配置()` | chan_external.py:522-530 | `list_signals()` + `get_signal_template()` |
|
||
| `create_single_signal()` | chan_external.py:312-319 | 不再需要(Rust 信号函数使用 `Signal::new_empty`) |
|
||
| `chanlun.signals` 包 | signals/*.py | 所有函数已移植到 Rust |
|
||
| `chanlun.parse` | parse.py | 仅被 `SignalsParser` 使用 |
|
||
| `chan.py` 中的副本 | chan.py:7394+ | 内部副本,可单独处理 |
|
||
|
||
## 2. 关键依赖链
|
||
|
||
```
|
||
strategies.py
|
||
└→ get_signals_config(position.unique_signals, signals_module)
|
||
└→ SignalsParser(signals_module).parse(signal_strings)
|
||
└→ 遍历 chanlun.signals 模块的所有函数
|
||
└→ 读取文档字符串 → 正则提取参数模板
|
||
└→ parse 库反向格式化 → 配置字典
|
||
```
|
||
|
||
完全移植后,这个链简化为:
|
||
```
|
||
strategies.py
|
||
└→ 直接构造 config = [{name, freq, params}] 从 Rust list_signals()
|
||
```
|
||
|
||
## 3. 建议:分两阶段执行
|
||
|
||
### 阶段 1:移植剩余信号函数(~12-21h)
|
||
|
||
按复杂度递增顺序:
|
||
|
||
| 子任务 | 内容 |
|
||
|--------|------|
|
||
| 1.1 | 移植 `bar_zdt_V230331` → `chanlun/src/signal/functions/demo.rs` |
|
||
| 1.2 | 移植 `macd_金叉` → `demo.rs` |
|
||
| 1.3 | 移植 `tas_macd_direct_V221106` → `demo.rs` |
|
||
| 1.4 | 移植 `tas_ma_base_V230313` → `demo.rs`(需要均线计算辅助) |
|
||
| 1.5 | 移植 `cxt_停顿分型_V230106` → `demo.rs` |
|
||
| 1.6 | 移植 `cxt_bi_end_V230222` → `demo.rs` |
|
||
|
||
每个子任务:
|
||
- 编写 Rust 函数 + `#[signal]` 注册
|
||
- 编写 Rust 单元测试
|
||
- 编写 Python 对比测试(Rust vs Python 输出)
|
||
|
||
### 阶段 2:移除 Python 回退路径(~4-6h)
|
||
|
||
| 子任务 | 内容 |
|
||
|--------|------|
|
||
| 2.1 | 简化 `SignalOrchestrator` → 仅使用 `SignalEngine` |
|
||
| 2.2 | 移除 `SignalsParser`、`get_signals_config`、`从信号列表提取配置` |
|
||
| 2.3 | 移除 `chanlun.signals` 包(demo.py/youwukuncheng.py/_template.py) |
|
||
| 2.4 | 移除 `chanlun.parse`(vendored parse 库) |
|
||
| 2.5 | 更新 `strategies.py` 使用直接配置构造 |
|
||
| 2.6 | 更新测试文件 |
|
||
|
||
## 4. 收益
|
||
|
||
| 收益 | 说明 |
|
||
|------|------|
|
||
| 代码量减少 | 移除 ~1,200 行 Python(SignalsParser + signals 包 + parse.py + chan.py 副本) |
|
||
| 统一执行路径 | 不再有 Rust/Python 双路径,消除维护成本 |
|
||
| 编译时安全 | 所有信号函数编译时注册,不会运行时 `import_by_name` 失败 |
|
||
| 性能提升 | 批量 Rust 执行 vs 逐个 Python 调用 |
|
||
| 依赖精简 | 移除 vendored `parse` 库和 `chanlun.signals` 包 |
|
||
|
||
## 5. 风险
|
||
|
||
| 风险 | 缓解 |
|
||
|------|------|
|
||
| `cxt_bi_end_V230222` 依赖笔/分型序列指针比较 | Rust 已有 `分型`/`笔` 结构,使用 `Arc` 指针 |
|
||
| `cxt_停顿分型_V230106` 依赖 `与MACD柱子分型匹配` | 需要确认 Rust 侧是否有该方法或等效逻辑 |
|
||
| `tas_ma_base_V230313` 依赖均线按需计算 | Rust 已有 `指标计算器::计算并挂载` 和 `k.ma(key)` |
|
||
| `strategies.py` 默认信号配置为空时依赖 `get_signals_config` | 切换到 `list_signals()` + 直接构造 |
|
||
|
||
## 6. 结论
|
||
|
||
**完全移植可行,建议执行。** 总工作量约 16-27 小时。7 个未移植信号函数按复杂度递增顺序逐个移植(阶段 1),然后移除 Python 回退路径(阶段 2)。完成后信号框架为纯 Rust 核心 + Python 薄绑定,不再有 Python 动态导入路径。
|