# 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`目录下的结果文件