255 lines
7.7 KiB
Markdown
255 lines
7.7 KiB
Markdown
# 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`目录下的结果文件 |