phase 7-8 完成 + warmup 修复 + 产物结构化重组

主要内容:
- Phase 8 PROMOTE: finalist #1 (trial #324) registry 条目,自动生成
- Optuna objective warmup bug 修复 (shared/optimizer/objective.py)
- studies/ 目录按用途重组为 optuna/ + finalists/ + features/ 三层
- reports/ 加入 Optuna 中文 dashboard (5 主图 + 18 slice + 15 contour)
- 新增 PROJECT_GUIDE.md 项目说明文档
- 新增 build_registry_entry.py / build_optuna_dashboard.py / build_feature_datasets.py
- .gitignore: 允许提交 studies/*.db (Optuna DB) 和 reports/*.html (MT5 + dashboard)
This commit is contained in:
2026-06-27 00:28:07 +08:00
parent 0dcbfe0781
commit 63a829cc46
45 changed files with 7240 additions and 9 deletions
@@ -0,0 +1,251 @@
{
"windows": {
"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"
]
},
"finalists": [
{
"index": 1,
"trial_number": 324,
"score": 858.47,
"params": {
"InpFastEmaPeriod": 25,
"InpSlowEmaPeriod": 160,
"InpRsiPeriod": 16,
"InpRsiBuyLevel": 50.0,
"InpRsiSellLevel": 56.0,
"InpPullbackAtrMult": 3.4000000000000004,
"InpAtrPeriod": 27,
"InpMaxSpreadAtrPct": 37.5,
"InpRiskPercent": 2.25,
"InpAtrSLMult": 1.9,
"InpAtrTPMult": 3.1,
"InpBreakEvenPoints": 50.0,
"InpBreakEvenLock": 25,
"InpTrailStartPoints": 400.0,
"InpTrailStepPoints": 70.0,
"InpMaxTradesPerDay": 12,
"InpDailyLossLimit": 5.0,
"InpMinSecondsBetween": 75
},
"merged_params": {
"InpTimeframe": 5,
"InpFastEmaPeriod": 25,
"InpSlowEmaPeriod": 160,
"InpRsiPeriod": 16,
"InpRsiBuyLevel": 50.0,
"InpRsiSellLevel": 56.0,
"InpPullbackAtrMult": 3.4000000000000004,
"InpAtrPeriod": 27,
"InpMinAtrPoints": 0,
"InpMaxSpreadAtrPct": 37.5,
"InpSizingMode": 1,
"InpFixedLots": 0.01,
"InpRiskPercent": 2.25,
"InpStopMode": 0,
"InpAtrSLMult": 1.9,
"InpAtrTPMult": 3.1,
"InpStopLossPoints": 200,
"InpTakeProfitPoints": 300,
"InpUseBreakEven": true,
"InpBreakEvenPoints": 50.0,
"InpBreakEvenLock": 25,
"InpUseTrailing": true,
"InpTrailStartPoints": 400.0,
"InpTrailStepPoints": 70.0,
"InpMaxPositions": 1,
"InpMaxTradesPerDay": 12,
"InpDailyLossLimit": 5.0,
"InpDailyProfitTarget": 0.0,
"InpMinSecondsBetween": 75,
"InpUseSession": false,
"InpSessionStartHour": 7,
"InpSessionEndHour": 20,
"InpMagicNumber": 20240530,
"InpComment": "GoldScalperPro"
},
"IS": {
"net": 28983.81,
"PF": 1.7053,
"trades": 2396,
"DD%": 0.103408,
"sharpe": 6.9717,
"win_rate": 0.8998,
"first_trade_ts": "2025-01-02T01:55:00"
},
"OOS": {
"net": 4213.78,
"PF": 2.3636,
"trades": 1161,
"DD%": 0.078049,
"sharpe": 9.457,
"win_rate": 0.9518,
"first_trade_ts": "2026-01-02T08:50:00"
}
},
{
"index": 2,
"trial_number": 39,
"score": 159.38,
"params": {
"InpFastEmaPeriod": 24,
"InpSlowEmaPeriod": 65,
"InpRsiPeriod": 23,
"InpRsiBuyLevel": 30.0,
"InpRsiSellLevel": 51.0,
"InpPullbackAtrMult": 2.4000000000000004,
"InpAtrPeriod": 9,
"InpMaxSpreadAtrPct": 37.5,
"InpRiskPercent": 0.75,
"InpAtrSLMult": 1.2,
"InpAtrTPMult": 2.1,
"InpBreakEvenPoints": 70.0,
"InpBreakEvenLock": 45,
"InpTrailStartPoints": 140.0,
"InpTrailStepPoints": 80.0,
"InpMaxTradesPerDay": 3,
"InpDailyLossLimit": 7.5,
"InpMinSecondsBetween": 120
},
"merged_params": {
"InpTimeframe": 5,
"InpFastEmaPeriod": 24,
"InpSlowEmaPeriod": 65,
"InpRsiPeriod": 23,
"InpRsiBuyLevel": 30.0,
"InpRsiSellLevel": 51.0,
"InpPullbackAtrMult": 2.4000000000000004,
"InpAtrPeriod": 9,
"InpMinAtrPoints": 0,
"InpMaxSpreadAtrPct": 37.5,
"InpSizingMode": 1,
"InpFixedLots": 0.01,
"InpRiskPercent": 0.75,
"InpStopMode": 0,
"InpAtrSLMult": 1.2,
"InpAtrTPMult": 2.1,
"InpStopLossPoints": 200,
"InpTakeProfitPoints": 300,
"InpUseBreakEven": true,
"InpBreakEvenPoints": 70.0,
"InpBreakEvenLock": 45,
"InpUseTrailing": true,
"InpTrailStartPoints": 140.0,
"InpTrailStepPoints": 80.0,
"InpMaxPositions": 1,
"InpMaxTradesPerDay": 3,
"InpDailyLossLimit": 7.5,
"InpDailyProfitTarget": 0.0,
"InpMinSecondsBetween": 120,
"InpUseSession": false,
"InpSessionStartHour": 7,
"InpSessionEndHour": 20,
"InpMagicNumber": 20240530,
"InpComment": "GoldScalperPro"
},
"IS": {
"net": 471.1,
"PF": 1.5311,
"trades": 555,
"DD%": 0.040607,
"sharpe": 3.65,
"win_rate": 0.8234,
"first_trade_ts": "2025-01-03T12:35:00"
},
"OOS": {
"net": 265.82,
"PF": 1.8351,
"trades": 276,
"DD%": 0.029001,
"sharpe": 4.0478,
"win_rate": 0.8841,
"first_trade_ts": "2026-01-07T11:10:00"
}
},
{
"index": 3,
"trial_number": 391,
"score": 794.99,
"params": {
"InpFastEmaPeriod": 25,
"InpSlowEmaPeriod": 165,
"InpRsiPeriod": 14,
"InpRsiBuyLevel": 50.0,
"InpRsiSellLevel": 58.0,
"InpPullbackAtrMult": 3.5,
"InpAtrPeriod": 27,
"InpMaxSpreadAtrPct": 45.0,
"InpRiskPercent": 1.5,
"InpAtrSLMult": 1.9,
"InpAtrTPMult": 3.0,
"InpBreakEvenPoints": 60.0,
"InpBreakEvenLock": 20,
"InpTrailStartPoints": 400.0,
"InpTrailStepPoints": 70.0,
"InpMaxTradesPerDay": 12,
"InpDailyLossLimit": 2.5,
"InpMinSecondsBetween": 75
},
"merged_params": {
"InpTimeframe": 5,
"InpFastEmaPeriod": 25,
"InpSlowEmaPeriod": 165,
"InpRsiPeriod": 14,
"InpRsiBuyLevel": 50.0,
"InpRsiSellLevel": 58.0,
"InpPullbackAtrMult": 3.5,
"InpAtrPeriod": 27,
"InpMinAtrPoints": 0,
"InpMaxSpreadAtrPct": 45.0,
"InpSizingMode": 1,
"InpFixedLots": 0.01,
"InpRiskPercent": 1.5,
"InpStopMode": 0,
"InpAtrSLMult": 1.9,
"InpAtrTPMult": 3.0,
"InpStopLossPoints": 200,
"InpTakeProfitPoints": 300,
"InpUseBreakEven": true,
"InpBreakEvenPoints": 60.0,
"InpBreakEvenLock": 20,
"InpUseTrailing": true,
"InpTrailStartPoints": 400.0,
"InpTrailStepPoints": 70.0,
"InpMaxPositions": 1,
"InpMaxTradesPerDay": 12,
"InpDailyLossLimit": 2.5,
"InpDailyProfitTarget": 0.0,
"InpMinSecondsBetween": 75,
"InpUseSession": false,
"InpSessionStartHour": 7,
"InpSessionEndHour": 20,
"InpMagicNumber": 20240530,
"InpComment": "GoldScalperPro"
},
"IS": {
"net": 5171.29,
"PF": 1.5425,
"trades": 2260,
"DD%": 0.061668,
"sharpe": 5.4414,
"win_rate": 0.8885,
"first_trade_ts": "2025-01-02T01:55:00"
},
"OOS": {
"net": 1614.25,
"PF": 1.9341,
"trades": 1131,
"DD%": 0.053726,
"sharpe": 7.5916,
"win_rate": 0.9416,
"first_trade_ts": "2026-01-02T08:15:00"
}
}
]
}