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

5.9 KiB
Raw Permalink Blame History

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_setMT5/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 优化时实际使用的参数范围定义。