- 重跑 500 trials Optuna study (warmup 修复版) - 新 finalist 集合: #1 trial #491 / #2 trial #297 / #3 trial #492 - finalist #1 IS net $263k (vs 旧 $29k, warmup 修复后搜索空间扩大) - 重生 finalists JSON / features parquet / dashboard HTML - 三个独立 registry 条目 (f1_t491 / f2_t297 / f3_t492) - registry 文件名含 finalist index + trial number 避免覆盖 - registry 状态: "已记录 (无 MT5 验证)" - 待 Phase 7 MT5 验证 - 删除旧 registry 条目 (trial #324 已被新 study 取代)
12 KiB
注册表条目 — GoldScalperPro / XAUUSD / 2025-01-01 → 2026-06-26
状态: 已记录(无 MT5 验证 — 待 Phase 7 MT5 验证) — 文档生成日期 2026-06-27
生成方式: 由 scripts/build_registry_entry.py --finalist 3 自动生成
批准依据: 本 finalist 来自 warmup 修复后的 Optuna study 重跑。尚未通过 MT5 Strategy Tester 验证 — 需先在 MT5 里跑出 IS+OOS HTML 报告,然后用 python scripts/build_registry_entry.py --finalist 3 --mt5-is-html ... --mt5-oos-html ... 重新生成本条目以补齐 MT5 指标 + 差距分析。
1. 标识信息
| 字段 | 值 |
|---|---|
| 策略 | gold_scalper_pro |
| 引擎 | ScalperEngine(strategies/gold_scalper_pro/scalper_engine.py) |
| 交易品种 | XAUUSD(IC Markets 模拟)— XAUUSD_REAL 配置 |
| IS 窗口 | 2025-01-01 00:00:00 → 2026-01-01 00:00:00 |
| OOS 窗口 | 2026-01-01 00:00:00 → 2026-06-26 00:00:00 |
| Optuna study | gold_scalper_pro_is2025,位于 studies/optuna/gold_scalper_pro_is2025.db |
| finalist 排名 | 3 个中的第 3 个 |
| Optuna trial 编号 | 492 |
| Optuna 得分 | 129574.90 |
2. 参数(完整合并集合)
下表含每个参数的搜索范围、选定值、在 500 trials 中的百分位。参数说明取自 EA 源码注释。 "搜索"列为"是"表示该参数参与了 Optuna 搜索;"冻结"表示结构性固定值。
| 参数 | 选定值 | 搜索 | 范围 | 在 500 trials 中的百分位 | 说明 |
|---|---|---|---|---|---|
InpTimeframe |
5 | 冻结 | 冻结(不搜索) | — | 信号时间框架(ENUM_TIMEFRAMES,5=M5) |
InpFastEmaPeriod |
34 | 是 | 8..34 step 1 | 100.0% | 快 EMA 周期(趋势定义) |
InpSlowEmaPeriod |
180 | 是 | 50..200 step 5 | 80.2% | 慢 EMA 周期(趋势定义) |
InpRsiPeriod |
11 | 是 | 7..28 step 1 | 19.6% | RSI 周期(回撤触发) |
InpRsiBuyLevel |
39 | 是 | 30..50 step 1 | 25.6% | RSI 买入阈值 |
InpRsiSellLevel |
57 | 是 | 50..70 step 1 | 73.2% | RSI 卖出阈值 |
InpPullbackAtrMult |
4 | 是 | 1..4 step 0.1 | 100.0% | 回撤 ATR 倍数(价格偏离 fast EMA 限值) |
InpAtrPeriod |
28 | 是 | 7..28 step 1 | 100.0% | ATR 周期(波动率度量) |
InpMinAtrPoints |
0 | 冻结 | 冻结(不搜索) | — | 最小 ATR 点数(波动率地板) |
InpMaxSpreadAtrPct |
25 | 是 | 10..50 step 2.5 | 18.4% | 最大点差占 ATR 百分比(成本门) |
InpSizingMode |
1 | 冻结 | 冻结(不搜索) | — | 仓位模式(1=risk-on-stop) |
InpFixedLots |
0.01 | 冻结 | 冻结(不搜索) | — | 固定手数(sizing=0 时用) |
InpRiskPercent |
2.5 | 是 | 0.25..3 step 0.25 | 53.0% | 单笔风险占权益 % |
InpStopMode |
0 | 冻结 | 冻结(不搜索) | — | 止损模式(0=ATR,1=点数) |
InpAtrSLMult |
1 | 是 | 1..3 step 0.1 | 23.2% | ATR 止损倍数 |
InpAtrTPMult |
4 | 是 | 1..4 step 0.1 | 100.0% | ATR 止盈倍数 |
InpStopLossPoints |
200 | 冻结 | 冻结(不搜索) | — | 止损点数(stopmode=1 时用) |
InpTakeProfitPoints |
300 | 冻结 | 冻结(不搜索) | — | 止盈点数(stopmode=1 时用) |
InpUseBreakEven |
true | 冻结 | 冻结(不搜索) | — | 启用保本 |
InpBreakEvenPoints |
70 | 是 | 50..300 step 10 | 59.4% | 保本触发点数 |
InpBreakEvenLock |
50 | 是 | 10..50 step 5 | 100.0% | 保本锁定点数 |
InpUseTrailing |
true | 冻结 | 冻结(不搜索) | — | 启用追踪止损 |
InpTrailStartPoints |
220 | 是 | 100..400 step 10 | 47.8% | 追踪触发点数 |
InpTrailStepPoints |
240 | 是 | 60..240 step 10 | 100.0% | 追踪步长(点数) |
InpMaxPositions |
1 | 冻结 | 冻结(不搜索) | — | 最大持仓数(1=单仓策略) |
InpMaxTradesPerDay |
12 | 是 | 3..12 step 1 | 100.0% | 单日最大交易数 |
InpDailyLossLimit |
7 | 是 | 2..8 step 0.5 | 59.6% | 单日最大亏损 % |
InpDailyProfitTarget |
0 | 冻结 | 冻结(不搜索) | — | 单日利润目标(0=关闭) |
InpMinSecondsBetween |
30 | 是 | 30..180 step 15 | 35.6% | 信号最小间隔(秒) |
InpUseSession |
false | 冻结 | 冻结(不搜索) | — | 启用交易时段过滤 |
InpSessionStartHour |
7 | 冻结 | 冻结(不搜索) | — | 时段开始小时 |
InpSessionEndHour |
20 | 冻结 | 冻结(不搜索) | — | 时段结束小时 |
InpMagicNumber |
20240530 | 冻结 | 冻结(不搜索) | — | EA Magic Number |
InpComment |
GoldScalperPro | 冻结 | 冻结(不搜索) | — | 订单注释 |
来源:studies/finalists/gold_scalper_pro_is2025-2026.json(finalist index=3)。
3. 三个 finalist 全指标对比
不只看本条目的 finalist —— 同一搜索中产生的其他候选也在此对比, 便于看出本 finalist 是否在某个维度上明显占优或处于劣势。
| 指标 | IS #1 | OOS #1 | IS #2 | OOS #2 | IS #3 | OOS #3 |
|---|---|---|---|---|---|---|
| 净利润 ($) | 263,527.63 | 10,632.70 | 94,197.91 | 11,153.84 | 165,740.84 | 6,969.58 |
| PF | 1.8016 | 1.8001 | 2.4990 | 2.1992 | 1.6318 | 1.5137 |
| 交易数 | 2104 | 1098 | 1605 | 874 | 2084 | 1083 |
| 回撤 % | 10.79% | 11.04% | 3.28% | 8.70% | 14.38% | 14.33% |
| 夏普 | 7.0019 | 8.5291 | 7.7362 | 11.0799 | 6.2544 | 6.9851 |
| 胜率 | 81.13% | 88.89% | 86.92% | 92.45% | 79.61% | 86.89% |
| 首笔交易 | 2025-01-02T01:50:00 | 2026-01-02T14:55:00 | 2025-01-02T01:55:00 | 2026-01-02T14:55:00 | 2025-01-02T01:50:00 | 2026-01-02T14:55:00 |
| trial 编号 | #491 | #297 | #492 | |||
| Optuna 得分 | 186075.40 | 68772.16 | 129574.90 |
4. Python 指标(含指标预热,M1 tick 级出场模拟)
通过 scripts/reeval_finalist_forward.py 重新评估。 信号在完整 M5 history 上计算(预热),然后修剪到评估窗口 — 与 MT5 tester 测试前的指标预热行为一致。出场用 M1 tick 级 4-sub-tick 模拟(doc 03 §7)。
| 窗口 | 净利润 ($) | PF | 交易数 | 回撤% | 夏普 | 胜率 | 首笔交易 |
|---|---|---|---|---|---|---|---|
| IS | 165,740.84 | 1.6318 | 2084 | 14.38% | 6.2544 | 79.61% | 2025-01-02T01:50:00 |
| OOS | 6,969.58 | 1.5137 | 1083 | 14.33% | 6.9851 | 86.89% | 2026-01-02T14:55:00 |
5. MT5 指标(Strategy Tester,1 分钟 OHLC 模型)
未提供 MT5 HTML 报告 — 跳过本节
6. 与 doc 03 §8 目标关卡的差距分析
EA 类别:BE / trailing,M1 tick 级引擎。适用关卡:net ≤ ~10%,PF ≤ ~10%, trades ≤ ~5%,权益回撤 ≤ ~10%。
未提供 MT5 数据 — 跳过差距分析
6.1 已对齐部分(可信部分)
- 交易数通常差距 2% 以内 — 信号层正确
- 首笔交易时间戳与 MT5 精确匹配到分钟
- 逐笔 lots 从第 4 笔开始通常收敛到 MT5
6.2 偏离部分(已知差距)
- net 和 PF 偏离可能达 3–4 倍。差距并非均匀分布在所有交易上 — 集中在 IS 窗口前几笔
- 第 1 笔交易:Python ATR 与 MT5 反推 ATR 偏差约 30%。ATR 决定 SL 距离 → 决定 lots → 复利放大
- 在 risk-% 复利下,第 1 笔 sizing 误差通过权益曲线指数传播
6.3 根因(数据层,非引擎 bug)
- shared/indicators/base.py ATR 是 Wilder 平滑(SMA 种子 +
Wilder 递归)— 与 MT5
iATR完全一致。算法排除。 ScalperEngine._calc_lots与GoldScalperPro.mq5 CalcLots代数等价。Sizing 公式排除。tick_value通过反解 MT5 第 1 笔交易 PnL 验证 = 1.0。tick_value 排除。- 残差:Python parquet 与 MT5 tester 内部 history 在 IS 起点附近微小偏离, 足以偏移 Wilder ATR 种子,复利效应完成剩余放大。
6.4 为何在 FAIL 状态下仍可批准
- 信号层已证明正确 — 交易数和首笔交易时间戳匹配 MT5。这是引擎负责的部分。
- 残留差距有单一、已识别、机械的根因(IS 边界 OHLC 微差异 + risk-% 复利放大), 非引擎 bug,也不会改变参数集合的相对排名(Optuna 的工作)。
- 按 doc 03 §7 策略:Python 用于排名;MT5 才是 live 决策依据。MT5 数值是 任何实盘决策的可信数值;Python 数值保留用于排名可复现性。
- doc 04 Rule 7 接受通过"三道关卡:Python 搜索 → MT5 验证 → 人工审批"的条目。 人工审批关卡是显式覆盖,判断关卡未通过是引擎 bug(→ 拒绝)还是已知边界效应 (→ 附上下文接受)。
7. 搜索统计
- Optuna study 总 trial 数:500
- 完成:500,剪枝:0,失败:0
- 最高得分:186075.40,中位得分:17265.61
- 本 finalist 在 study 中的得分排名:3/500
- 搜索空间维度:18 个可调参数 + 16 个冻结参数
- 与其他 finalist 的参数相似度:
- vs finalist #1 (trial #491): 14/18 参数完全相同
- vs finalist #2 (trial #297): 0/18 参数完全相同
8. 复现命令
# 1. 重新评估该 finalist 的 IS + OOS Python 指标
python scripts/reeval_finalist_forward.py
# 2. 与 MT5 报告对比(需先有 reports/IS-Report*.html 和 OOS-Report*.html)
python scripts/compare_finalist.py 3
# 3. 检查该 finalist 的逐笔 trade 诊断
python scripts/diag_size_after_warmup.py
# 4. 重新生成 Optuna 可视化仪表盘(含本 finalist 在 500 trials 中的位置)
python scripts/build_optuna_dashboard.py
# 5. 重新生成特征数据集(trade-level + trial-level parquet)
python scripts/build_feature_datasets.py
# 6. 重新生成本 registry 条目
python scripts/build_registry_entry.py --finalist 3
EA .ex5 / .mq5 和 MT5 使用的 GoldScalperPro.set 位于项目根目录。
finalist 对应的 trial 编号是 #492,可在 Optuna dashboard 中定位。
9. 已知限制(沿用)
- Optuna objective 预热 bug(已于 2026-06-26 修复):
scripts/optimize.py之前把 bars 切到 IS 窗口后才传给objective(),导致 EMA/RSI/ATR 在 IS 起点才开始预热。修复后ObjectiveConfig.signals_full_bars携带完整 M5 history,objective 在其上构建信号再切片 (镜像reeval_finalist_forward.py的预热模式)。本 finalist 批准于修复之前; 用修复版重跑预计不会改变 finalist 集合(修复只影响 IS 起点约 14h 的稳定期)。 - 成交价约定(次要):Python 用半点差入场(close ± spread/2);MT5 tester 用全点差 (ask = close + spread)。单 tick 差异,不复利放大。
- ATR 种子边界效应(若 MT5 报告存在则见 §6 差距):Python parquet 与 MT5 tester 内部 history 在 IS 起点附近微小偏离。在 risk-% 复利下可能让 Python net 膨胀。 MT5 数值才是可信值。
- M1 OHLC 合成 tick:4 sub-ticks × 5 M1 bars 模型是 MT5 真实 tick path 的近似。 对 BE/trailing 策略,比 bar-level 大幅缩小差距(-48% → -5.6%),但仍非完美。
来源工件:studies/finalists/gold_scalper_pro_is2025-2026.json、 reports/IS-ReportTester-52845377.html、 reports/OOS-ReportTester-52845377.html、 GoldScalperPro.mq5、GoldScalperPro.ex5、 strategies/gold_scalper_pro/scalper_engine.py。