890 lines
52 KiB
Markdown
890 lines
52 KiB
Markdown
# MT5 EA 参数批量优化系统 — 最终项目计划
|
||
|
||
---
|
||
|
||
## 一、项目概述
|
||
|
||
### 1.1 项目目标
|
||
|
||
构建一套 **Python + MT5 策略测试器** 的 EA 参数批量优化系统,支持:
|
||
|
||
- **多 EA 管理**:不同 EA 有完全不同的参数配置,互不影响
|
||
- **智能搜索**:根据参数数量和组合数自动选择最优搜索策略
|
||
- **约束过滤**:处理参数间的互斥、依赖、条件关系
|
||
- **批量执行**:通过 PowerShell 脚本批量驱动 MT5 执行测试
|
||
- **结果汇总**:自动解析 HTML/XML 报告,输出最优参数推荐
|
||
- **过拟合防护**:Walk-Forward 验证 + 统计显著性检验
|
||
|
||
### 1.2 核心挑战与解决方案
|
||
|
||
```
|
||
┌─────────────────────────────────────────┬─────────────────────────────────────────┐
|
||
│ 挑战 │ 解决方案 │
|
||
├─────────────────────────────────────────┼─────────────────────────────────────────┤
|
||
│ 不同 EA 参数完全不同 │ JSON 配置文件,每个 EA 独立一套参数定义 │
|
||
│ 参数多 + 范围大 = 组合爆炸 │ 自动策略选择:Grid→拉丁超立方→遗传算法 │
|
||
│ 参数间存在互斥/依赖关系 │ ParameterConstraintEngine 约束引擎 │
|
||
│ 暴力遍历不现实 │ 遗传算法 (GA) 智能搜索 │
|
||
│ 不同 EA 需要不同测试配置 │ per-EA INI 模板 + test_config 字段 │
|
||
│ MT5 终端必须等待测试完成才能启动下一个 │ PowerShell Start-Process -Wait 机制 │
|
||
│ 优化结果过拟合严重 │ Walk-Forward 验证 + 样本外测试 │
|
||
│ 测试结果格式不统一 │ 统一 HTML/XML 解析器 │
|
||
│ 参数映射与测试结果需要关联 │ SET 文件 ID 追踪机制 │
|
||
└─────────────────────────────────────────┴─────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 二、系统架构
|
||
|
||
### 2.1 整体架构图
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────────────┐
|
||
│ EA 批量优化管理系统 │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ 配置管理层 (configs/) │ │
|
||
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
|
||
│ │ │ MA_Cross.json│ │ RSI_EA.json │ │ Grid_EA.json │ │ Breakout.json│ ... │ │
|
||
│ │ │ 6个参数 │ │ 12个参数 │ │ 25个参数 │ │ 8个参数 │ │ │
|
||
│ │ │ Grid搜索 │ │ 遗传算法 │ │ 遗传+降维 │ │ 拉丁超立方 │ │ │
|
||
│ │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │ │
|
||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||
│ │ │
|
||
│ ▼ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ 核心引擎层 (ea_batch_optimizer.py) │ │
|
||
│ │ │ │
|
||
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
|
||
│ │ │ 配置加载器 │ │ 约束引擎 │ │ 搜索策略 │ │ 任务调度器 │ │ │
|
||
│ │ │ │ │ │ │ │ │ │ │ │
|
||
│ │ │ 解析JSON │ │ 互斥关系 │ │ Grid │ │ 批量排队 │ │ │
|
||
│ │ │ 验证参数 │ │ 依赖条件 │ │ Random │ │ 进程管理 │ │ │
|
||
│ │ │ 补全默认值 │ │ 条件过滤 │ │ LatinHypercube│ │ 超时控制 │ │ │
|
||
│ │ │ │ │ │ │ Genetic │ │ │ │ │
|
||
│ │ │ │ │ │ │ (自适应) │ │ │ │ │
|
||
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
|
||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||
│ │ │
|
||
│ ┌─────────────────────┼─────────────────────┐ │
|
||
│ ▼ ▼ ▼ │
|
||
│ ┌────────────────────────┐ ┌────────────────────────┐ ┌────────────────────┐ │
|
||
│ │ SET 文件生成 │ │ INI 配置生成 │ │ PowerShell 脚本 │ │
|
||
│ │ │ │ │ │ │ │
|
||
│ │ params_00001.set │ │ EA_Name.ini │ │ run_EAName.ps1 │ │
|
||
│ │ params_00002.set │ │ (per-EA) │ │ (per-EA) │ │
|
||
│ │ ... │ │ │ │ │ │
|
||
│ │ params_10000.set │ │ Expert=... │ │ Start-Process │ │
|
||
│ │ │ │ Symbol=... │ │ -Wait │ │
|
||
│ │ → set_files/ │ │ Period=... │ │ → MT5 Terminal │ │
|
||
│ └────────────────────────┘ └────────────────────────┘ └────────────────────┘ │
|
||
│ │ │
|
||
│ ▼ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ MT5 策略测试器批量执行 │ │
|
||
│ │ │ │
|
||
│ │ terminal64.exe ──▶ 测试1 ──▶ 报告1 ─┐ │ │
|
||
│ │ terminal64.exe ──▶ 测试2 ──▶ 报告2 ─┼──▶ reports/ │ │
|
||
│ │ terminal64.exe ──▶ 测试3 ──▶ 报告3 ─┤ │ │
|
||
│ │ ... │ │ │
|
||
│ │ terminal64.exe ──▶ 测试N ──▶ 报告N ─┘ │ │
|
||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||
│ │ │
|
||
│ ▼ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ 结果分析层 │ │
|
||
│ │ │ │
|
||
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
|
||
│ │ │ HTML解析器 │ │ XML解析器 │ │ 结果合并器 │ │ 最优推荐器 │ │ │
|
||
│ │ │ │ │ │ │ │ │ │ │ │
|
||
│ │ │ BeautifulSoup│ │ xml.etree │ │ param+result│ │ 多维度排序 │ │ │
|
||
│ │ │ 提取统计指标│ │ 解析标准格式│ │ 按set_id关联│ │ 过滤条件 │ │ │
|
||
│ │ │ │ │ │ │ │ │ Walk-Forward│ │ │
|
||
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
|
||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||
│ │ │
|
||
│ ▼ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ 输出层 │ │
|
||
│ │ │ │
|
||
│ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────────┐ │ │
|
||
│ │ │ full_results.csv │ │ optimization_report.txt│ │ best_params.json │ │ │
|
||
│ │ │ (完整测试记录) │ │ (分析报告) │ │ (最优参数) │ │ │
|
||
│ │ └──────────────────┘ └──────────────────┘ └──────────────────────────┘ │ │
|
||
│ │ │ │
|
||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 2.2 目录结构
|
||
|
||
```
|
||
MT5Optimizer/
|
||
│
|
||
├── ea_batch_optimizer.py # ★ 主程序:多EA统一管理器
|
||
├── ea_config_parser.py # ★ 配置解析:EAConfig + ParameterDef
|
||
├── parameter_constraint.py # ★ 约束引擎:互斥/依赖/条件过滤
|
||
├── smart_search.py # ★ 搜索策略:Grid/Random/Latin/GA
|
||
├── analyze_results.py # ★ 结果解析:HTML/XML → DataFrame
|
||
│
|
||
├── configs/ # ★ EA 配置文件目录
|
||
│ ├── MA_Cross.json # EA1: 双MA交叉 (6参数, Grid)
|
||
│ ├── RSI_EA.json # EA2: RSI策略 (12参数, 遗传算法)
|
||
│ ├── Grid_EA.json # EA3: 网格EA (25参数, 遗传+降维)
|
||
│ └── Breakout.json # EA4: 突破EA (8参数, 拉丁超立方)
|
||
│
|
||
├── set_files/ # 生成的 .set 参数文件
|
||
│ ├── MA_Cross/ # params_00001.set ~ params_NNNNN.set
|
||
│ ├── RSI_EA/
|
||
│ ├── Grid_EA/
|
||
│ └── Breakout/
|
||
│
|
||
├── reports/ # MT5 输出的测试报告
|
||
│ ├── MA_Cross/ # *.html
|
||
│ ├── RSI_EA/
|
||
│ ├── Grid_EA/
|
||
│ └── Breakout/
|
||
│
|
||
├── results/ # 分析结果输出
|
||
│ ├── MA_Cross_param_mapping.csv
|
||
│ ├── MA_Cross_optimization_results.csv
|
||
│ ├── MA_Cross_optimization_report.txt
|
||
│ ├── all_ea_optimization_results.csv # ★ 全EA汇总
|
||
│ ├── all_ea_optimization_report.txt # ★ 全EA分析报告
|
||
│ └── best_params.json
|
||
│
|
||
├── scripts/ # PowerShell 执行脚本 (自动生成)
|
||
│ ├── run_MA_Cross.ps1
|
||
│ ├── run_RSI_EA.ps1
|
||
│ ├── run_Grid_EA.ps1
|
||
│ └── run_Breakout.ps1
|
||
│
|
||
├── logs/ # 运行日志
|
||
│ └── batch_log.txt
|
||
│
|
||
└── README.md
|
||
```
|
||
|
||
---
|
||
|
||
## 三、模块规格
|
||
|
||
### 3.1 EA 配置模型 (ea_config_parser.py)
|
||
|
||
每个 EA 对应一个 JSON 配置文件,字段说明:
|
||
|
||
```json
|
||
{
|
||
"ea_name": "MA Cross Scalper",
|
||
"ea_path": "Experts\\MA_Cross_Scalper.ex5",
|
||
"description": "双MA交叉头皮策略",
|
||
|
||
"parameters": {
|
||
"FastMA_Period": {
|
||
"type": "int", // int | double | bool | enum | string
|
||
"default": 14,
|
||
"min": 3,
|
||
"max": 100,
|
||
"step": 1,
|
||
"description": "快速MA周期",
|
||
"condition": "SlowMA_Period>FastMA_Period" // 可选:参数约束
|
||
},
|
||
"RiskPercent": {
|
||
"type": "double",
|
||
"default": 1.0,
|
||
"min": 0.1,
|
||
"max": 5.0,
|
||
"step": 0.1,
|
||
"precision": 1
|
||
}
|
||
},
|
||
|
||
"search_strategy": "auto",
|
||
// "auto" - 根据组合数自动选择
|
||
// "grid" - 网格搜索 (<1万组合)
|
||
// "latin" - 拉丁超立方 (<50万组合)
|
||
// "genetic" - 遗传算法 (>10万组合)
|
||
|
||
"optimization_criterion": "custom",
|
||
// "balance_max" | "profit_factor" | "custom" | "sharpe_ratio" ...
|
||
|
||
"test_config": {
|
||
"symbol": "EURUSD",
|
||
"period": "H1",
|
||
"from_date": "2023.01.01",
|
||
"to_date": "2024.01.01",
|
||
"model": 1, // 1=1分钟OHLC, 4=真实tick
|
||
"deposit": 10000,
|
||
"leverage": "1:100"
|
||
},
|
||
|
||
"walk_forward": {
|
||
"enabled": true,
|
||
"train_test_ratio": 0.75 // 前75%训练,后25%验证
|
||
}
|
||
}
|
||
```
|
||
|
||
**ParameterDef 数据类**:
|
||
|
||
```
|
||
参数名 ──▶ ParamType ──▶ expand_values() ──▶ 值列表
|
||
│
|
||
├── INT (int)
|
||
├── DOUBLE (float)
|
||
├── BOOL (true/false)
|
||
├── ENUM (枚举选项列表)
|
||
└── STRING (字符串)
|
||
|
||
EAConfig {
|
||
ea_name: str
|
||
ea_path: str
|
||
parameters: Dict[str, ParameterDef]
|
||
search_strategy: str
|
||
criterion: str
|
||
test_config: Dict
|
||
walk_forward: Dict
|
||
|
||
get_total_combinations() → int
|
||
estimate_search_time() → str
|
||
is_complex() → bool (>6参数 或 >100万组合)
|
||
}
|
||
```
|
||
|
||
### 3.2 约束引擎 (parameter_constraint.py)
|
||
|
||
```
|
||
输入: List[Dict] 参数组合
|
||
│
|
||
▼
|
||
┌────────────────────────────────────────┐
|
||
│ ParameterConstraintEngine │
|
||
│ │
|
||
│ ┌──────────────┐ ┌──────────────┐ │
|
||
│ │ 互斥约束 │ │ 依赖条件 │ │
|
||
│ │ A↑B↓ │ │ C==true时 │ │
|
||
│ │ │ │ D才生效 │ │
|
||
│ ├──────────────┤ ├──────────────┤ │
|
||
│ │ 范围约束 │ │ 逻辑约束 │ │
|
||
│ │ RSI: 0-100 │ │ SL<TP │ │
|
||
│ │ MA>0 │ │ MA_fast<MA_ │ │
|
||
│ │ │ │ slow │ │
|
||
│ └──────────────┘ └──────────────┘ │
|
||
│ │ │
|
||
│ ▼ │
|
||
│ filter_valid_combinations() │
|
||
│ │ │
|
||
│ ▼ │
|
||
│ 输出: 过滤后的有效组合列表 │
|
||
└────────────────────────────────────────┘
|
||
```
|
||
|
||
### 3.3 搜索策略 (smart_search.py)
|
||
|
||
```
|
||
策略选择逻辑:
|
||
|
||
total_combos ≤ 10,000 → Grid Search (暴力遍历)
|
||
total_combos ≤ 500,000 → Latin Hypercube (均匀采样)
|
||
total_combos > 500,000 → Genetic Algorithm (智能搜索)
|
||
|
||
┌──────────────────┐
|
||
│ Grid Search │ 遍历所有组合 → 全局最优
|
||
│ Random Search │ 随机采样 → 快速
|
||
│ Latin Hypercube │ 分层均匀 → 效率高
|
||
│ Genetic Algorithm │ 选择+交叉+变异 → 参数爆炸克星
|
||
└──────────────────┘
|
||
|
||
遗传算法核心参数:
|
||
- 种群大小: 50
|
||
- 进化代数: 30
|
||
- 交叉率: 0.8
|
||
- 变异率: 0.15
|
||
- 精英保留: 5
|
||
```
|
||
|
||
### 3.4 结果解析 (analyze_results.py)
|
||
|
||
```
|
||
MT5 HTML 报告 ──▶ BeautifulSoup ──▶ 正则提取 ──▶ 统计指标
|
||
│
|
||
├── Net Profit
|
||
├── Gross Profit
|
||
├── Gross Loss
|
||
├── Max Drawdown
|
||
├── Profit Factor
|
||
├── Sharpe Ratio
|
||
├── Total Trades
|
||
├── Win Rate
|
||
└── Custom Criterion (OnTester)
|
||
|
||
输出:
|
||
DataFrame {
|
||
set_id, ea_name,
|
||
params (各参数名),
|
||
total_profit, profit_factor, max_drawdown,
|
||
total_trades, sharpe_ratio, win_rate,
|
||
custom_criterion, html_report
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 四、PowerShell 执行流程
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||
│ PowerShell 批量执行流程 │
|
||
│ │
|
||
│ ┌─────────────┐ │
|
||
│ │ run_tests.ps1│ ← ea_batch_optimizer.py 自动生成 │
|
||
│ └──────┬──────┘ │
|
||
│ │ │
|
||
│ ├─▶ 读取 set_files/ 目录下的所有 params_*.set │
|
||
│ │ │
|
||
│ ├─▶ 循环读取 INI 配置模板 │
|
||
│ │ │
|
||
│ ├─▶ 修改 ExpertParameters= 指向当前 SET 文件 │
|
||
│ │ 修改 Report= 唯一报告名 │
|
||
│ │ │
|
||
│ ├─▶ 启动 MT5 │
|
||
│ │ Start-Process │
|
||
│ │ -FilePath terminal64.exe │
|
||
│ │ -ArgumentList "/portable /config:INI路径" │
|
||
│ │ -Wait ← 关键: 等待当前测试完成再启动下一个 │
|
||
│ │ -WindowStyle Normal │
|
||
│ │ │
|
||
│ ├─▶ MT5 执行回测 → 输出 HTML 报告到 reports/ │
|
||
│ │ │
|
||
│ ├─▶ MT5 关闭 (ShutdownTerminal=1) │
|
||
│ │ │
|
||
│ ├─▶ 等待 3 秒确保完全释放 │
|
||
│ │ │
|
||
│ └─▶ 下一轮循环 ──────────────────────────────────────────────────────▶ │
|
||
│ │
|
||
│ 关键机制: │
|
||
│ 1. Start-Process -Wait 确保顺序执行, 不丢任务 │
|
||
│ 2. 每次循环动态修改 INI, 不需要多个 INI 文件 │
|
||
│ 3. 唯一报告名 (含时间戳/set_id) 避免覆盖 │
|
||
│ 4. 日志记录每个任务的开始/结束/耗时 │
|
||
│ 5. 进度报告:每10个输出进度 + ETA │
|
||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 五、实施计划
|
||
|
||
### 5.1 分阶段实施
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────────────┐
|
||
│ 项目实施计划 (共5个阶段) │
|
||
│ │
|
||
│ Phase 1 ────────────────────────────────────────────────────────────────────────▶ │
|
||
│ 【基础框架搭建】 预计 1 天 │
|
||
│ │
|
||
│ □ 创建目录结构 │
|
||
│ □ 实现 ea_config_parser.py │
|
||
│ - ParameterDef 数据类 │
|
||
│ - EAConfig 数据类 │
|
||
│ - parse_set_file() 解析现有SET │
|
||
│ - load_ea_config() 加载JSON配置 │
|
||
│ - load_all_ea_configs() 批量加载 │
|
||
│ □ 实现 parameter_constraint.py │
|
||
│ - ConstraintEngine 类 │
|
||
│ - add_constraint() 添加约束 │
|
||
│ - filter_valid_combinations() 过滤 │
|
||
│ □ 测试: 加载一个示例 EA 配置文件 │
|
||
│ │
|
||
│ Phase 2 ────────────────────────────────────────────────────────────────────────▶ │
|
||
│ 【搜索策略模块】 预计 1 天 │
|
||
│ │
|
||
│ □ 实现 smart_search.py │
|
||
│ - generate_param_combinations() 自适应策略选择 │
|
||
│ - _grid_search() 网格搜索 │
|
||
│ - _random_search() 随机搜索 │
|
||
│ - _latin_hypercube() 拉丁超立方采样 │
|
||
│ - GeneticOptimizer 遗传算法类 │
|
||
│ □ 实现 ea_batch_optimizer.py 核心类 │
|
||
│ - EABatchOptimizer.__init__() │
|
||
│ - generate_set_files_for_ea() │
|
||
│ - generate_ini_for_ea() │
|
||
│ - build_powershell_script() │
|
||
│ □ 测试: 为一个EA生成1000个SET文件 │
|
||
│ │
|
||
│ Phase 3 ────────────────────────────────────────────────────────────────────────▶ │
|
||
│ 【执行层 + 结果解析】 预计 2 天 │
|
||
│ │
|
||
│ □ 实现 analyze_results.py │
|
||
│ - parse_mt5_html_report() │
|
||
│ - parse_mt5_xml_report() │
|
||
│ - parse_all_reports() 批量解析 │
|
||
│ - merge_parameters_and_results() 合并 │
|
||
│ - find_optimal_params() 最优筛选 │
|
||
│ - generate_report() 报告生成 │
|
||
│ □ PowerShell 脚本生成器 │
|
||
│ □ 端到端测试: 单EA + 50个参数组合全流程 │
|
||
│ □ 测试报告正确性验证 │
|
||
│ │
|
||
│ Phase 4 ────────────────────────────────────────────────────────────────────────▶ │
|
||
│ 【多EA管理 + 过拟合防护】 预计 2 天 │
|
||
│ │
|
||
│ □ 多EA并行优化 │
|
||
│ - parallel_optimize() 多进程 │
|
||
│ - 任务队列管理 │
|
||
│ □ Walk-Forward 验证 │
|
||
│ - walk_forward_validate() │
|
||
│ - 过拟合检测指标 │
|
||
│ □ 高级约束: 参数降维、相邻参数相关性分析 │
|
||
│ □ 全EA汇总分析 │
|
||
│ - cross_ea_ranking() 跨EA横向比较 │
|
||
│ - 综合最优推荐 │
|
||
│ □ 异常处理: MT5崩溃、超时、报告缺失 │
|
||
│ │
|
||
│ Phase 5 ────────────────────────────────────────────────────────────────────────▶ │
|
||
│ 【优化与交付】 预计 1 天 │
|
||
│ │
|
||
│ □ 命令行参数完善 (--ea, --phase, --parallel, --strategy) │
|
||
│ □ 日志系统完善 │
|
||
│ □ 配置示例: 为4个不同复杂度的EA创建配置示例 │
|
||
│ □ 文档: README + 使用手册 │
|
||
│ □ 一键启动脚本 │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ 总工期: 7 个工作日 │ │
|
||
│ │ Phase1(1d) + Phase2(1d) + Phase3(2d) + Phase4(2d) + Phase5(1d) │ │
|
||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||
└─────────────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 5.2 任务清单 (Phase 1 详细)
|
||
|
||
```
|
||
Phase 1: 基础框架搭建
|
||
──────────────────────────────────────────────────────
|
||
|
||
[P1-01] 创建目录结构
|
||
创建以下目录:
|
||
configs/, set_files/, reports/, results/, scripts/, logs/
|
||
|
||
[P1-02] 实现 ParameterDef 数据类
|
||
ea_config_parser.py
|
||
字段: name, param_type, default, min_value, max_value,
|
||
step, enum_options, description, precision
|
||
方法: expand_values() → List[Any]
|
||
判断类型: INT/DOUBLE/BOOL/ENUM/STRING
|
||
|
||
[P1-03] 实现 EAConfig 数据类
|
||
ea_config_parser.py
|
||
字段: ea_name, ea_path, parameters (Dict[str, ParameterDef]),
|
||
search_strategy, criterion, test_config, description
|
||
方法: get_total_combinations() → int
|
||
estimate_search_time() → str
|
||
is_complex() → bool
|
||
__repr__()
|
||
|
||
[P1-04] 实现 parse_set_file()
|
||
解析 MT5 .set 文件
|
||
格式: VarName <init> <current> <min> <step> <type> [comment]
|
||
返回: List[ParameterDef]
|
||
|
||
[P1-05] 实现 load_ea_config()
|
||
读取 JSON 配置文件
|
||
转换为 ParameterDef + EAConfig 对象
|
||
补全默认值
|
||
|
||
[P1-06] 实现 load_all_ea_configs()
|
||
遍历 configs/ 目录下所有 .json
|
||
加载并验证每个 EA 配置
|
||
|
||
[P1-07] 创建示例 EA 配置文件
|
||
configs/MA_Cross.json (6参数, 简单EA)
|
||
configs/RSI_EA.json (12参数, 中等EA)
|
||
|
||
[P1-08] 实现 ParameterConstraintEngine
|
||
parameter_constraint.py
|
||
add_constraint(name, condition, error_message)
|
||
add_condition_from_config(param_name, condition_str)
|
||
filter_valid_combinations(List[Dict]) → List[Dict]
|
||
|
||
[P1-09] 测试 Phase 1
|
||
验证: 加载配置 → 展开参数 → 过滤约束 → 输出统计
|
||
输出: 参数数量、组合数、估算时间
|
||
|
||
Phase 2: 搜索策略模块
|
||
──────────────────────────────────────────────────────
|
||
|
||
[P2-01] 实现 generate_param_combinations()
|
||
smart_search.py
|
||
根据 total_combos 自动选择策略
|
||
参数: ea_config, strategy="auto", max_samples=2000
|
||
返回: List[Dict] 参数组合
|
||
|
||
[P2-02] 实现 _grid_search()
|
||
遍历所有组合 (适合 <1万组合)
|
||
|
||
[P2-03] 实现 _random_search()
|
||
随机采样 (适合快速探索)
|
||
|
||
[P2-04] 实现 _latin_hypercube()
|
||
拉丁超立方采样 (适合 1万~50万组合)
|
||
|
||
[P2-05] 实现 GeneticOptimizer 类
|
||
_create_individual()
|
||
_mutate()
|
||
_crossover()
|
||
_tournament_select()
|
||
run() → List[GAIndividual]
|
||
|
||
[P2-06] 实现 EABatchOptimizer.__init__ + generate_set_files_for_ea()
|
||
核心类初始化
|
||
生成 SET 文件到 set_files/{EA_NAME}/
|
||
|
||
[P2-07] 实现 generate_ini_for_ea()
|
||
生成 per-EA INI 配置文件
|
||
|
||
[P2-08] 实现 build_powershell_script()
|
||
动态生成 PowerShell 批量执行脚本
|
||
|
||
[P2-09] 测试 Phase 2
|
||
为 MA_Cross.json 生成 500 个 SET 文件
|
||
验证文件内容正确
|
||
|
||
Phase 3: 执行层 + 结果解析
|
||
──────────────────────────────────────────────────────
|
||
|
||
[P3-01] 实现 parse_mt5_html_report()
|
||
analyze_results.py
|
||
使用 BeautifulSoup + 正则
|
||
提取: profit, drawdown, trades, pf, sharpe, win_rate
|
||
|
||
[P3-02] 实现 parse_all_reports()
|
||
遍历 reports/ 目录
|
||
调用 HTML/XML 解析器
|
||
|
||
[P3-03] 实现 merge_parameters_and_results()
|
||
按 set_id 关联参数与测试结果
|
||
|
||
[P3-04] 实现 find_optimal_params()
|
||
多维度排序
|
||
过滤条件: min_trades, min_pf, max_dd
|
||
|
||
[P3-05] 实现 generate_report()
|
||
输出文本分析报告
|
||
|
||
[P3-06] 实现 EABatchOptimizer.run_optimization_for_ea()
|
||
执行 PowerShell 脚本
|
||
等待完成
|
||
|
||
[P3-07] 实现 EABatchOptimizer.analyze_all_results()
|
||
解析所有报告 → 合并 → 排序 → 输出
|
||
|
||
[P3-08] 端到端测试 (Phase 3)
|
||
EA: MA_Cross, 组合数: 50
|
||
全流程: SET生成 → PS脚本 → MT5测试 → 报告解析 → 结果输出
|
||
|
||
Phase 4: 多EA管理 + 过拟合防护
|
||
──────────────────────────────────────────────────────
|
||
|
||
[P4-01] 实现 parallel_optimize()
|
||
多进程并行优化多个 EA
|
||
|
||
[P4-02] 实现 walk_forward_validate()
|
||
In-Sample + Out-of-Sample 验证
|
||
过拟合检测
|
||
|
||
[P4-03] 参数降维模块
|
||
相关性分析
|
||
PCA/因子分析 (可选)
|
||
|
||
[P4-04] 实现 cross_ea_ranking()
|
||
跨 EA 横向比较
|
||
综合最优推荐
|
||
|
||
[P4-05] 异常处理
|
||
MT5 超时
|
||
报告缺失
|
||
进程管理
|
||
|
||
[P4-06] 创建复杂 EA 配置示例
|
||
configs/Grid_EA.json (25参数)
|
||
|
||
[P4-07] 全EA集成测试
|
||
|
||
Phase 5: 优化与交付
|
||
──────────────────────────────────────────────────────
|
||
|
||
[P5-01] 命令行参数完善
|
||
--phase, --ea, --strategy, --parallel, --max-samples
|
||
--base-dir, --configs-dir
|
||
|
||
[P5-02] 日志系统
|
||
运行日志 → logs/
|
||
错误追踪
|
||
|
||
[P5-03] 创建 README.md
|
||
|
||
[P5-04] 创建 4 个不同复杂度的配置示例
|
||
configs/MA_Cross.json (6参数, Grid)
|
||
configs/RSI_EA.json (12参数, 遗传)
|
||
configs/Grid_EA.json (25参数, 遗传)
|
||
configs/Breakout.json (8参数, 拉丁超立方)
|
||
|
||
[P5-05] 一键启动脚本 main.py
|
||
|
||
[P5-06] 最终验收测试
|
||
```
|
||
|
||
---
|
||
|
||
## 六、使用工作流
|
||
|
||
### 6.1 首次使用流程
|
||
|
||
```bash
|
||
# 1. 目录结构 (由 Phase 1 自动创建)
|
||
mkdir -p MT5Optimizer/{configs,set_files,reports,results,scripts,logs}
|
||
|
||
# 2. 安装依赖
|
||
pip install MetaTrader5 pandas numpy beautifulsoup4
|
||
|
||
# 3. 为你的 EA 创建配置文件 (参考 configs/ 示例)
|
||
# 编辑 configs/MY_EA.json
|
||
|
||
# 4. 分步执行
|
||
# 步骤1: 生成 SET 文件
|
||
python ea_batch_optimizer.py --phase 1
|
||
|
||
# 步骤2: 生成 INI 配置
|
||
python ea_batch_optimizer.py --phase 2
|
||
|
||
# 步骤3: 运行批量测试
|
||
python ea_batch_optimizer.py --phase 3 --ea "MY_EA"
|
||
|
||
# 步骤4: 解析结果
|
||
python ea_batch_optimizer.py --phase 4
|
||
|
||
# 5. 查看结果
|
||
cat results/optimization_report.txt
|
||
```
|
||
|
||
### 6.2 完整一键执行
|
||
|
||
```bash
|
||
# 单 EA 完整流程
|
||
python ea_batch_optimizer.py --phase 5 --ea "MA_Cross"
|
||
|
||
# 多 EA 并行
|
||
python ea_batch_optimizer.py --phase 3 --parallel
|
||
|
||
# 指定搜索策略
|
||
python ea_batch_optimizer.py --phase 1 --strategy genetic
|
||
```
|
||
|
||
### 6.3 分步执行详解
|
||
|
||
```
|
||
┌──────────────────────────────────────────────────────────────────────────────┐
|
||
│ --phase 1: 生成 SET 文件 │
|
||
│ 输入: configs/*.json │
|
||
│ 输出: set_files/{EA_NAME}/params_*.set │
|
||
│ results/{EA_NAME}_param_mapping.csv │
|
||
│ │
|
||
│ --phase 2: 生成 INI 配置 │
|
||
│ 输入: configs/*.json │
|
||
│ 输出: configs/{EA_NAME}.ini │
|
||
│ │
|
||
│ --phase 3: 运行 MT5 批量测试 │
|
||
│ 输入: set_files/*.set + configs/*.ini │
|
||
│ 执行: PowerShell 脚本 │
|
||
│ 输出: reports/{EA_NAME}/*.html │
|
||
│ │
|
||
│ --phase 4: 解析并分析结果 │
|
||
│ 输入: reports/*.html │
|
||
│ 输出: results/full_optimization_results.csv │
|
||
│ results/optimization_report.txt │
|
||
│ results/best_params.json │
|
||
│ │
|
||
│ --phase 5: 全部执行 (1+2+4) │
|
||
│ │
|
||
│ --ea NAME: 只处理指定 EA │
|
||
│ --parallel: 多 EA 并行 (Phase 3) │
|
||
│ --strategy: 强制指定搜索策略 (grid/random/latin/genetic) │
|
||
└──────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 七、搜索策略选择决策树
|
||
|
||
```
|
||
参数组合数
|
||
│
|
||
▼
|
||
├── ≤ 10,000 ────────────────────▶ Grid Search
|
||
│ (暴力遍历, 全局最优)
|
||
│
|
||
├── 10,001 ~ 100,000 ──────────▶ Latin Hypercube
|
||
│ (均匀采样, 效率高)
|
||
│
|
||
├── 100,001 ~ 500,000 ─────────▶ Genetic Algorithm
|
||
│ (智能搜索, 参数爆炸克星)
|
||
│
|
||
└── ≥ 500,001 ─────────────────▶ Genetic Algorithm + 约束过滤
|
||
(必须用 GA, 先过滤约束减少搜索空间)
|
||
```
|
||
|
||
---
|
||
|
||
## 八、EA 配置示例
|
||
|
||
### 8.1 简单 EA (6参数, Grid Search)
|
||
|
||
```json
|
||
// configs/MA_Cross.json
|
||
{
|
||
"ea_name": "MA Cross Scalper",
|
||
"ea_path": "Experts\\MA_Cross.ex5",
|
||
"description": "双MA交叉头皮策略, 6个参数",
|
||
|
||
"parameters": {
|
||
"FastMA_Period": {"type": "int", "default": 14, "min": 5, "max": 30, "step": 1},
|
||
"SlowMA_Period": {"type": "int", "default": 50, "min": 20, "max": 100, "step": 5,
|
||
"condition": ">FastMA_Period"},
|
||
"StopLoss": {"type": "int", "default": 50, "min": 10, "max": 200, "step": 10},
|
||
"TakeProfit": {"type": "int", "default": 100,"min": 30, "max": 300, "step": 10},
|
||
"RiskPercent": {"type": "double", "default": 1.0, "min": 0.5, "max": 3.0, "step": 0.5,
|
||
"precision": 1},
|
||
"EnableMM": {"type": "bool", "default": true}
|
||
},
|
||
|
||
"search_strategy": "grid",
|
||
"test_config": {
|
||
"symbol": "EURUSD", "period": "H1",
|
||
"from_date": "2023.01.01", "to_date": "2024.01.01",
|
||
"deposit": 10000
|
||
}
|
||
}
|
||
```
|
||
|
||
### 8.2 复杂 EA (25参数, Genetic Algorithm)
|
||
|
||
```json
|
||
// configs/Grid_EA.json
|
||
{
|
||
"ea_name": "MultiGrid Pro",
|
||
"ea_path": "Experts\\Grid\\MultiGrid.ex5",
|
||
"description": "多周期网格EA, 25个参数, 必须用遗传算法",
|
||
|
||
"parameters": {
|
||
"GridLevels": {"type": "int", "default": 5, "min": 3, "max": 20, "step": 1},
|
||
"GridSpacing": {"type": "int", "default": 50, "min": 10, "max": 200,"step": 10},
|
||
"GridSpacingMult": {"type": "double", "default": 1.5, "min": 1.0, "max": 3.0, "step": 0.1, "precision": 1},
|
||
"BaseLotsize": {"type": "double", "default": 0.1, "min": 0.01, "max": 1.0, "step": 0.01, "precision": 2},
|
||
"MaxOpenLots": {"type": "double", "default": 5.0, "min": 0.1, "max": 20.0, "step": 0.1, "precision": 1},
|
||
"MaxDrawdown": {"type": "int", "default": 30, "min": 10, "max": 100, "step": 5},
|
||
"TakeProfitGrid": {"type": "int", "default": 20, "min": 5, "max": 100, "step": 5},
|
||
"StartHour": {"type": "int", "default": 0, "min": 0, "max": 23, "step": 1},
|
||
"EndHour": {"type": "int", "default": 23, "min": 0, "max": 23, "step": 1},
|
||
"TradingDays": {"type": "enum", "default": "ALL",
|
||
"options": ["ALL", "MON-FRI", "MON-THU", "FRI-MON"]},
|
||
"MaxSpread": {"type": "int", "default": 30, "min": 5, "max": 100, "step": 5},
|
||
"CloseOnOpposite": {"type": "bool", "default": false},
|
||
"HedgeMode": {"type": "bool", "default": true},
|
||
"Indicator1_Type": {"type": "enum", "default": "RSI",
|
||
"options": ["RSI", "CCI", "Stochastic", "MACD"]},
|
||
"Indicator1_Period":{"type": "int", "default": 14, "min": 5, "max": 50, "step": 1},
|
||
"Indicator1_Level":{"type": "double", "default": 30, "min": 10, "max": 90, "step": 5, "precision": 0},
|
||
"Indicator2_Type": {"type": "enum", "default": "Bollinger",
|
||
"options": ["Bollinger", "ATR", "STDDEV", "None"]},
|
||
"Indicator2_Period":{"type": "int", "default": 20, "min": 10, "max": 100, "step": 5},
|
||
"Indicator2_Dev": {"type": "double", "default": 2.0, "min": 1.0, "max": 5.0, "step": 0.5, "precision": 1},
|
||
"NewsFilter": {"type": "bool", "default": true},
|
||
"NewsImpact": {"type": "enum", "default": "HIGH",
|
||
"options": ["NONE", "LOW", "HIGH", "ALL"]},
|
||
"MagicNumber": {"type": "int", "default": 123456, "min": 100000, "max": 999999, "step": 1},
|
||
"Slippage": {"type": "int", "default": 30, "min": 10, "max": 100, "step": 5},
|
||
"MaxTrades": {"type": "int", "default": 10, "min": 1, "max": 50, "step": 1},
|
||
"RecoveryMode": {"type": "bool", "default": false},
|
||
"RecoveryMult": {"type": "double", "default": 1.5, "min": 1.0, "max": 3.0, "step": 0.1, "precision": 1},
|
||
"TrailStop": {"type": "bool", "default": true},
|
||
"TrailStep": {"type": "int", "default": 10, "min": 5, "max": 50, "step": 5}
|
||
},
|
||
|
||
"search_strategy": "genetic",
|
||
"optimization_criterion": "custom",
|
||
|
||
"test_config": {
|
||
"symbol": "EURUSD", "period": "H1",
|
||
"from_date": "2022.01.01", "to_date": "2024.01.01",
|
||
"deposit": 5000, "leverage": "1:100"
|
||
},
|
||
|
||
"walk_forward": {
|
||
"enabled": true,
|
||
"train_test_ratio": 0.75
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 九、预期交付物
|
||
|
||
```
|
||
┌──────────────────────────────────────────────────────────────────────────────┐
|
||
│ 交付清单 │
|
||
├──────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ 1. 源代码文件 │
|
||
│ ├── ea_batch_optimizer.py (主程序) │
|
||
│ ├── ea_config_parser.py (配置解析) │
|
||
│ ├── parameter_constraint.py (约束引擎) │
|
||
│ ├── smart_search.py (搜索策略) │
|
||
│ └── analyze_results.py (结果解析) │
|
||
│ │
|
||
│ 2. EA 配置示例 (4个不同复杂度) │
|
||
│ ├── configs/MA_Cross.json (6参数, Grid) │
|
||
│ ├── configs/RSI_EA.json (12参数, 遗传) │
|
||
│ ├── configs/Grid_EA.json (25参数, 遗传) │
|
||
│ └── configs/Breakout.json (8参数, 拉丁超立方) │
|
||
│ │
|
||
│ 3. 文档 │
|
||
│ ├── README.md (使用说明) │
|
||
│ └── 项目计划.md (本计划) │
|
||
│ │
|
||
│ 4. 一键启动脚本 │
|
||
│ └── main.py │
|
||
│ │
|
||
│ ┌──────────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ 系统能力总结: │ │
|
||
│ │ │ │
|
||
│ │ □ 支持 1~25+ 个参数的 EA 优化 │ │
|
||
│ │ □ 自动选择最优搜索策略 (Grid/Latin/GA) │ │
|
||
│ │ □ 参数约束过滤 (互斥/依赖/条件) │ │
|
||
│ │ □ 多 EA 并行优化 │ │
|
||
│ │ □ Walk-Forward 过拟合防护 │ │
|
||
│ │ □ HTML/XML 报告自动解析 │ │
|
||
│ │ □ 最优参数多维度排序推荐 │ │
|
||
│ │ □ 跨 EA 横向比较 │ │
|
||
│ └──────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
└──────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 十、关键设计原则
|
||
|
||
| 原则 | 说明 |
|
||
|------|------|
|
||
| **per-EA 独立配置** | 每个 EA 有自己的 JSON 配置,参数名/类型/范围完全自定义,互不影响 |
|
||
| **自适应搜索策略** | 不需要人工选策略,系统根据参数数量和组合数自动选择最优方案 |
|
||
| **约束先行** | 大量参数组合先通过约束引擎过滤,减少无效测试 |
|
||
| **MT5 兜底** | 实际回测由 MT5 策略测试器完成,确保与实盘行为完全一致 |
|
||
| **结果可追溯** | 每个 SET 文件对应唯一 ID,报告文件名含 ID,全程可关联 |
|
||
| **Walk-Forward 防过拟合** | In-Sample 优化 + Out-of-Sample 验证,只有两步都优秀的参数才推荐 |
|
||
| **日志完整** | 每个任务记录开始/结束/耗时/退出码,出问题可追溯 | |