7.7 KiB
7.7 KiB
MT5 EA 参数优化自动化教程
概述
本教程介绍如何使用Python自动化控制MetaTrader 5 (MT5)的策略测试器进行EA参数优化。
核心发现
MT5 SET文件格式(关键)
MT5的SET文件不仅存储参数值,还存储优化范围和优化标志。
格式:参数名=当前值||起始值||步长||结束值||优化标志
Y= 启用优化(MT5会遍历此参数的start→stop范围)N= 不优化(使用当前值运行单次回测)
示例:
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配置文件格式
[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文件
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. 使用示例
# 定义要优化的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使用已登录的配置。
工作流程总结
- 定义参数范围:在Python中定义每个参数的value/start/step/stop和optimize标志
- 生成SET文件:格式化后保存到MT5的
MQL5\Profiles\Tester目录 - 生成INI文件:配置优化参数,引用SET文件
- 启动MT5:
terminal64.exe /config:ini路径 - MT5自动运行优化:使用遗传算法遍历参数组合
- 优化完成后自动关闭:设置
ShutdownTerminal=true
注意事项
- SET文件必须放在MT5数据目录的
MQL5\Profiles\Tester文件夹 - INI文件可以放在任意位置,通过
/config:参数指定 - 布尔参数通常不需要优化,设置为
||N - 参数范围要合理,避免步长过大或过小
- 优化完成后查看
optimizer\results目录下的结果文件