Files
mt_mt5_backertest/优化方案.md
T

890 lines
52 KiB
Markdown
Raw Normal View History

2026-07-06 03:32:12 +08:00
# 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 验证,只有两步都优秀的参数才推荐 |
| **日志完整** | 每个任务记录开始/结束/耗时/退出码,出问题可追溯 |