Files
2026-07-06 03:32:12 +08:00

890 lines
52 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 验证,只有两步都优秀的参数才推荐 |
| **日志完整** | 每个任务记录开始/结束/耗时/退出码,出问题可追溯 |