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

133 lines
5.9 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 优化需要 **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 中的关键优化控制参数
```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 文件格式示例
```ini
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 优化时实际使用的参数范围定义。