5.9 KiB
5.9 KiB
MT5 优化需要 INI + SET 两个文件配合工作,加上 terminal64.exe 本身:
三个核心文件
| 文件 | 作用 | 由谁生成 |
|---|---|---|
INI (config.ini) |
告诉 MT5 "做什么":EA路径、品种、周期、日期、优化模式/指标、前向测试模式、保证金/杠杆、报告输出、完成后关机等 | 我们的 ea_batch_optimizer.generate_ini_for_ea() 生成 |
SET (xxx.set) |
告诉 EA "用哪些参数值哪些范围优化":每个输入参数标记是否优化 + 起始值/终止值/步进 | 我们的 generate_ini_for_ea() 从 JSON 的 parameters 生成 |
| EX5 (EA本身) | 被测试的 EA 程序 | 用户放置在 MT5 的 MQL5/Experts/ 下 |
INI 中的关键优化控制参数
[Tester]
Optimization=2 ; 优化模式:0禁用 1慢速完整 2快速遗传 3MarketWatch全部
OptimizationCriterion=5 ; 优化指标:0余额 1盈利因子 2期望收益 3回撤 4恢复因子 5夏普 6自定义 7复合
ForwardMode=0 ; 前向测试:0禁用 1二分之一 2三分之一 3四分之一 4自定义日期
SET 文件格式示例
Lots=0.10||0.10||0.10||0.10||N ; 固定参数
TakeProfit=50||50||5||200||Y ; 优化参数:当前值||起始||步进||终止||是否优化
所以整个链条是:
保存配置 (JSON)
↓
generate_ini_for_ea()
├─→ 生成 SET 文件 → 写入 MT5数据目录/MQL5/Profiles/Tester/{ea_name}_optimization.set
└─→ 生成 INI 文件 → optimizer/configs/{ea_name}.ini
↓
启动 MT5: terminal64.exe /config:optimizer/configs/{ea_name}.ini
↓
MT5 读取 INI → 找到 Expert=xxx.ex5 和 ExpertParameters=xxx.set
↓
MT5 按 INI 的 Optimization / OptimizationCriterion / ForwardMode 执行遗传算法优化
↓
结果保存为 {ea_name}_optimization.xml(优化报表)和可选的 {ea_name}_optimization.forward.xml(前向测试结果)
点击"保存配置"只生成 1 个文件:
gui.py: _save_ea_config()
↓
生成/覆盖 → optimizer/configs/{ea_name}.json
只写 JSON,不写 SET 不写 INI。
三者的生成顺序(完整流程)
第1步:保存配置(gui.py _save_ea_config)
↓
optimizer/configs/{ea_name}.json ← 用户在 GUI 点"保存配置"时生成
第2步:运行优化(gui.py _run_mt5_optimize)
↓
ea_batch_optimizer.generate_ini_for_ea(ea_config)
↓
├─→ 生成 SET文件 → MT5数据目录/MQL5/Profiles/Tester/{ea_name}_optimization.set
└─→ 生成 INI文件 → optimizer/configs/{ea_name}.ini
第3步:启动MT5
terminal64.exe /config:optimizer/configs/{ea_name}.ini
↓
MT5 读取 INI → 找到 ExpertParameters=xxx.set → 加载 SET 中的参数范围
↓
执行遗传算法优化
三者关系
| 文件 | 生成时机 | 内容 | 用途 |
|---|---|---|---|
| JSON | 用户点"保存配置" | EA参数定义(名称/类型/min/max/step/optimize标志)+ 回测配置(symbol/period/criterion等) | 配置持久化,用户可随时修改再保存 |
| SET | 用户点"运行优化"时 | 从 JSON 的 parameters 展开,生成 MT5 SET 格式(参数名、当前值、起始、步进、终止、是否优化) | 告诉 MT5 要优化哪些参数及其范围 |
| INI | 用户点"运行优化"时 | 从 JSON 的 test_config 读取所有配置(EA路径、品种、周期、日期、Optimization=2、OptimizationCriterion=5 等) | 告诉 MT5 做什么优化任务 |
SET 和 INI 都是从 JSON 衍生出来的,JSON 是唯一的事实来源(single source of truth)。
理清楚这两个 SET 的来源和关系:
两个 SET 的来源
| SET 来源 | 何时产生 | 怎么产生 |
|---|---|---|
| MT5 原生 SET | GUI 启动时(或点"自动扫描MT5"时) | _auto_load_ea_with_set 从 MT5/Profiles/Tester/GMarket_optimization.set 读取 |
| 我们生成的 SET | 点"运行优化"时 | generate_ini_for_ea 从 JSON 的 parameters 生成 |
流程中的覆盖关系
启动 GUI → _auto_load_ea_with_set()
↓
从 MT5 Profiles/Tester/ 读取 GMarket_optimization.set
↓
参数显示在参数配置表格(可修改)
↓
用户修改参数 → 点"保存配置" → 生成 JSON
↓
点"运行优化" → generate_ini_for_ea()
↓
生成新的 SET → 写入 MT5/Profiles/Tester/GMarket_optimization.set(覆盖原文件)
↓
MT5 读取 INI → ExpertParameters=GMarket_optimization.set(就是我们刚写入的那个)
结论:是覆盖关系
- 启动时加载 MT5 原生 SET,只是为了展示现有参数供你查看/修改
- 运行时生成的 SET 是完整覆盖 MT5 Profiles/Tester/ 下的同名文件
- MT5 加载的 SET 就是我们生成的那个
为什么不冲突?
因为 SET 文件路径相同(都在 MT5/Profiles/Tester/ 下),所以:
- 启动加载 → 读取旧 SET 展示
- 优化运行 → 生成新 SET 覆盖旧 SET
- MT5 执行 → 读到的就是最新生成的 SET
本质上是同一个文件在 读→改→写 的循环中流转,JSON 是源头记录,SET 是 MT5 优化时实际使用的参数范围定义。