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

7.7 KiB
Raw Permalink Blame History

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使用已登录的配置。

工作流程总结

  1. 定义参数范围:在Python中定义每个参数的value/start/step/stop和optimize标志
  2. 生成SET文件:格式化后保存到MT5的MQL5\Profiles\Tester目录
  3. 生成INI文件:配置优化参数,引用SET文件
  4. 启动MT5terminal64.exe /config:ini路径
  5. MT5自动运行优化:使用遗传算法遍历参数组合
  6. 优化完成后自动关闭:设置ShutdownTerminal=true

注意事项

  1. SET文件必须放在MT5数据目录的MQL5\Profiles\Tester文件夹
  2. INI文件可以放在任意位置,通过/config:参数指定
  3. 布尔参数通常不需要优化,设置为||N
  4. 参数范围要合理,避免步长过大或过小
  5. 优化完成后查看optimizer\results目录下的结果文件