Files
mt_mt5_backertest/docs/MT5_OPTIMIZATION_GUIDE.md
2026-07-06 03:32:12 +08:00

255 lines
7.7 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 EA 参数优化自动化教程
## 概述
本教程介绍如何使用Python自动化控制MetaTrader 5 (MT5)的策略测试器进行EA参数优化。
## 核心发现
### MT5 SET文件格式(关键)
MT5的SET文件不仅存储参数值,还存储**优化范围和优化标志**。
格式:`参数名=当前值||起始值||步长||结束值||优化标志`
- `Y` = 启用优化(MT5会遍历此参数的start→stop范围)
- `N` = 不优化(使用当前值运行单次回测)
**示例:**
```ini
TakeProfit=50||30||10||70||Y ; 优化:从30到70,步长10
Stoploss=1000||1000||100||1000||N ; 不优化:固定1000
Lots=0.1||0.01||0.01||1.0||Y ; 优化:从0.01到1.0,步长0.01
```
### INI配置文件格式
```ini
[Tester]
Expert=MY-EA\\GMarket.ex5
ExpertParameters=GMarket_optimization.set ; SET文件名(放在MQL5\Profiles\Tester目录)
Symbol=XAUUSD
Period=M1
Model=0 ; 0=Every Tick, 1=1分钟OHLC, 2=仅开盘价, 3=数学计算, 4=真实Tick
ExecutionMode=-1 ; -1=随机延迟, 0=无延迟, >0=固定延迟(ms)
Optimization=2 ; 0=禁用, 1=慢速完整算法, 2=快速遗传算法 3=Market Watch所有符号
OptimizationCriterion=1 ; 优化指标 (0-7)
FromDate=2026.01.01
ToDate=2026.01.04
ForwardMode=0 ; 0=禁用, 1=1/2期间, 2=1/3期间, 3=1/4期间, 4=自定义
Deposit=10000
Currency=USD
Leverage=1:100
Report=GMarket_optimization ; 报告文件名
ReplaceReport=true
ShutdownTerminal=true ; 优化完成后关闭MT5
Visual=0 ; 0=禁用可视化, 1=启用可视化
```
#### 常用参数说明
| 参数 | 值 | 说明 |
|------|-----|------|
| Model | 0 | Every Tick(精确) |
| Model | 1 | 1 minute OHLC(快速) |
| Model | 4 | Every tick based on real ticks |
| ExecutionMode | -1 | 随机延迟 |
| ExecutionMode | 0 | 无延迟 |
| ExecutionMode | 200 | 固定200ms延迟 |
| Optimization | 0 | 禁用优化 |
| Optimization | 1 | 慢速完整算法 |
| Optimization | 2 | 快速遗传算法 |
## 优化指标对照表
| 值 | 含义 |
|---|---|
| 0 | 余额最大值 |
| 1 | 盈利因子最大值 |
| 2 | 期望收益最大值 |
| 3 | 回撤最小值 |
| 4 | 恢复因子最大值 |
| 5 | 夏普比率最大值 |
| 6 | 自定义 (OnTester函数) |
| 7 | 复合指标最大值 |
## 文件位置
### SET文件必须放在MT5数据目录
```
C:\Users\<用户名>\AppData\Roaming\MetaQuotes\Terminal\<实例ID>\MQL5\Profiles\Tester\
```
例如:
```
C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\010E047102812FC0C18890992854220E\MQL5\Profiles\Tester\
```
### INI文件可以放在任意位置
通过命令行参数指定:
```
terminal64.exe /config:C:\path\to\your\config.ini
```
## 完整Python示例
### 1. 生成SET和INI文件
```python
import os
from datetime import datetime
MT5_TESTER_DIR = r"C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\010E047102812FC0C18890992854220E\MQL5\Profiles\Tester"
MT5_PATH = r"C:\Program Files\MetaTrader 5 IC Markets Global\terminal64.exe"
def create_optimization_files(ea_name, ea_path, symbol, period, params, date_from, date_to,
model=0, execution_delay=-1, opt_criterion=1, deposit=10000,
leverage='1:100', currency='USD', visual=0):
"""
params格式:
{
'param_name': {
'value': 50, # 当前值
'start': 30, # 起始值
'step': 10, # 步长
'stop': 70, # 结束值
'optimize': True # 是否优化
},
...
}
model: 0=EveryTick, 1=1分钟OHLC, 2=仅开盘价, 4=真实Tick
execution_delay: -1=随机延迟, 0=无延迟, >0=固定延迟ms
opt_criterion: 0=余额, 1=盈利因子, 2=期望收益, 3=回撤, 4=恢复因子, 5=夏普比率, 7=复合指标
"""
set_filename = f"{ea_name}_optimization.set"
set_path = os.path.join(MT5_TESTER_DIR, set_filename)
# 生成SET文件
set_lines = [
'; saved automatically',
f'; {datetime.now()}',
'',
]
for name, spec in params.items():
flag = 'Y' if spec.get('optimize', False) else 'N'
v = spec['value']
s = spec['start']
step = spec['step']
st = spec['stop']
set_lines.append(f"{name}={v}||{s}||{step}||{st}||{flag}")
with open(set_path, 'w', encoding='utf-8') as f:
f.write('\n'.join(set_lines))
# 生成INI文件
ini_path = os.path.join(MT5_TESTER_DIR, f"{ea_name}_{symbol}_{period}_optimization.ini")
ini_content = f"""[Tester]
Expert={ea_path}
ExpertParameters={set_filename}
Symbol={symbol}
Period={period}
Model={model}
ExecutionMode={execution_delay}
Optimization=2
OptimizationCriterion={opt_criterion}
FromDate={date_from}
ToDate={date_to}
ForwardMode=0
Deposit={deposit}
Currency={currency}
Leverage={leverage}
Report={ea_name}_optimization
ReplaceReport=true
ShutdownTerminal=true
Visual={visual}
"""
with open(ini_path, 'w', encoding='utf-8') as f:
f.write(ini_content)
return ini_path, set_path
def run_optimization(ini_path):
"""启动MT5运行优化"""
import subprocess
subprocess.Popen([MT5_PATH, f"/config:{ini_path}"])
```
### 2. 使用示例
```python
# 定义要优化的EA参数
params = {
'InpTakeProfit': {'value': 50, 'start': 30, 'step': 10, 'stop': 70, 'optimize': True},
'InpStopLoss': {'value': 100, 'start': 50, 'step': 25, 'stop': 200, 'optimize': True},
'InpLots': {'value': 0.1, 'start': 0.01, 'step': 0.01, 'stop': 1.0, 'optimize': True},
'InpMaxSpread': {'value': 3, 'start': 3, 'step': 1, 'stop': 10, 'optimize': False}, # 不优化
}
# 生成文件并运行(使用1分钟OHLC模式,200ms延迟)
ini_path, set_path = create_optimization_files(
ea_name='MyEA',
ea_path='MY-EA\\MyEA.ex5',
symbol='XAUUSD',
period='H1',
params=params,
date_from='2026.01.01',
date_to='2026.01.04',
model=1, # 1=1分钟OHLC快速模式
execution_delay=200, # 200ms固定延迟
opt_criterion=1, # 1=盈利因子最大化
deposit=10000,
leverage='1:100'
)
print(f"INI: {ini_path}")
print(f"SET: {set_path}")
# 启动MT5优化
run_optimization(ini_path)
```
## 常见问题
### Q: "no optimized parameter selected" 错误
原因:SET文件中所有参数的优化标志都是`N`
解决:确保需要优化的参数设置为`||Y`
### Q: "check parameter stop" 错误
原因:参数范围无效(如start==stop, step==0)。
解决:检查SET文件中该参数的值,或将`optimize`设为`False`
### Q: EA文件找不到
原因:INI中Expert路径不正确。
解决:使用相对于MQL5\Experts目录的路径,如`MY-EA\\GMarket.ex5`
### Q: MT5登录问题
原因:使用`/portable`参数会启动新的便携模式实例。
解决:不使用`/portable`参数,让MT5使用已登录的配置。
## 工作流程总结
1. **定义参数范围**:在Python中定义每个参数的value/start/step/stop和optimize标志
2. **生成SET文件**:格式化后保存到MT5的`MQL5\Profiles\Tester`目录
3. **生成INI文件**:配置优化参数,引用SET文件
4. **启动MT5**`terminal64.exe /config:ini路径`
5. **MT5自动运行优化**:使用遗传算法遍历参数组合
6. **优化完成后自动关闭**:设置`ShutdownTerminal=true`
## 注意事项
1. SET文件必须放在MT5数据目录的`MQL5\Profiles\Tester`文件夹
2. INI文件可以放在任意位置,通过`/config:`参数指定
3. 布尔参数通常不需要优化,设置为`||N`
4. 参数范围要合理,避免步长过大或过小
5. 优化完成后查看`optimizer\results`目录下的结果文件