# 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 │ │ SL0 │ │ MA_fast 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 [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 验证,只有两步都优秀的参数才推荐 | | **日志完整** | 每个任务记录开始/结束/耗时/退出码,出问题可追溯 |