2026-07-06 04:24:43 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 04:24:43 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 04:55:21 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 04:55:21 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 03:32:12 +08:00
2026-07-06 03:32:12 +08:00

MT5 EA 批量回测系统

基于 MetaTrader 5 的自动化批量回测工具,支持多EA、多交易品种、多时间周期的组合测试。

项目结构

mt5_backtest/
├── gui.py                       # 图形界面(统一入口,所有回测操作都在这里)
├── scripts/
│   ├── ini_generator.py         # 生成MT5配置文件
│   ├── mt5_auto_runner.py       # 自动运行回测
│   ├── batch_executor.py        # 批量执行器
│   ├── result_parser.py        # 解析HTM/XML报告
│   └── report_generator.py     # 生成汇总报告
├── config/                      # 配置文件目录
├── reports/                     # 回测报告输出目录
├── logs/                        # 日志目录
└── README.md                    # 本文档

核心原理

1. 配置生成阶段 (ini_generator.py)

  • 读取配置文件 config/ea_configs.yaml
  • 扫描 MT5 的 MQL5/Experts 目录获取 EA 列表
  • 根据配置的 EA品种、时间周期、参数组合生成 INI 配置文件
  • 每个 INI 文件对应一次回测任务

2. 自动执行阶段 (mt5_auto_runner.py)

  • 通过命令行调用 MT5 终端: terminal64.exe /config:xxx.ini
  • 监控回测进度,等待报告文件生成
  • 自动终止并重启 MT5 进程(可选)
  • 复制生成的 HTM 报告到项目目录

3. 结果解析阶段 (result_parser.py)

  • 读取 reports/ 目录下的 HTM 报告文件
  • 自动检测文件编码(UTF-16-LE with BOM
  • 使用正则表达式提取关键指标
  • 支持中英文标签匹配

4. 报告生成阶段 (report_generator.py)

  • 将解析结果导出为 Excel、CSV、HTML、Markdown 格式
  • 支持按盈利因子、胜率等指标排序

使用方式

方式一:图形界面(推荐)

python gui.py

界面包含三个标签页:

  • 回测配置:选择 EA、交易品种、时间周期、回测日期等
  • 执行选项:设置超时、跳过已完成的测试等
  • 报告查看:查看已解析的回测结果,支持排序和导出CSV

方式二:GUI(推荐,唯一入口)

python gui.py

整个回测流程(生成 INI → 运行 → 解析 → 汇总)都在 GUI 后台线程完成, 进度实时显示在 "参数优化" 标签页的日志框。 YAML 仅作为可读的配置导出/快照(GUI "保存配置" 按钮),不参与运行时通信。

配置文件格式

配置文件 config/ea_configs.yaml 示例:

eas:
  - name: GMarket
    filename: GMarket.ex5
    set_file: GMarket_default.set  # 可选,使用SET文件

backtest_settings:
  symbols: ["EURUSD", "GBPUSD", "XAUUSD", "USDJPY"]
  timeframes: ["M1", "M5", "M15", "H1"]
  date_range:
    from: "2026.01.01"
    to: "2026.01.04"
  model: 0              # 0=Every Tick, 1=OHLC, 4=Real Tick
  execution_delay: 0   # 延迟设置
  deposit: 10000        # 初始保证金
  leverage: "1:100"     # 杠杆
  replace_report: true  # 覆盖已有报告
  shutdown_terminal: true

mt5_settings:
  terminal_path: "C:\\Program Files\\MetaTrader 5 IC Markets Global\\terminal64.exe"
  data_dir: "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\..."
  reports_dir: "reports"
  ini_dir: "config/generated"

execution:
  timeout_per_test: 30   # 分钟
  skip_existing: true
  kill_between: true     # 测试间关闭MT5

关键指标说明

指标 说明 评判标准
profit_factor 盈利因子 = 毛利/毛损 >1.5 优秀, >1.0 微利, <1.0 亏损
net_profit 总净盈利 越高越好
gross_profit 毛利(所有盈利交易总和) 越高越好
gross_loss 毛损(所有亏损交易总和) 越低越好
win_rate 胜率(盈利交易占比) >60% 较好
total_trades 总交易次数 样本量参考
max_drawdown 最大回撤金额 越低越稳定
sharpe_ratio 夏普比率(风险收益比) >1.0 较好, >2.0 优秀
recovery_factor 采收率 >1.5 较好

如何添加新的交易品种

方法一:通过 GUI 界面

  1. 打开 python gui.py
  2. 切换到"回测配置"标签页
  3. 在"交易品种"区域勾选需要的品种
  4. 点击"保存配置"

方法二:直接编辑配置文件

编辑 config/ea_configs.yaml

backtest_settings:
  symbols:
    - EURUSD
    - GBPUSD
    - XAUUSD          # 添加新品种
    - USDJPY
    - BTCUSD           # 添加数字货币

支持的交易品种类型

类型 示例
主流货币对 EURUSD, GBPUSD, USDJPY, USDCHF
商品货币 AUDUSD, NZDUSD, USDCAD
交叉货币 EURGBP, EURJPY, GBPJPY
贵金属 XAUUSD, XAGUSD
原油 XBRUSD, XTIUSD
数字货币 BTCUSD, ETHUSD, LTCUSD

如何添加新的时间周期

编辑 config/ea_configs.yaml

backtest_settings:
  timeframes:
    - M1      # 1分钟
    - M5      # 5分钟
    - M15     # 15分钟
    - M30     # 30分钟
    - H1      # 1小时
    - H4      # 4小时
    - D1      # 日线
    - W1      # 周线

报告导出功能

# 导出排序后的CSV
python scripts/result_parser.py --results-dir reports --csv reports/results.csv --sort profit_factor

# 可用排序字段
# expert, symbol, period, net_profit, gross_profit, profit_factor
# total_trades, win_rate, max_drawdown, sharpe_ratio

HTM 报告解析说明

MT5 生成的 HTM 报告采用特殊编码:

  • 编码格式:UTF-16-LE with BOM
  • 标签语言:中英混合

解析器会自动处理以下情况:

  1. BOM 标记检测与跳过
  2. 中文字段名匹配(如"盈利因子"、"夏普比率"
  3. 特殊格式数据提取(如 "92.46 (8.61%)"

解析的完整字段列表

测试信息 (test_info):

  • expert: EA名称
  • symbol: 交易品种
  • period: 时间周期
  • company: 经纪商
  • currency: 货币
  • leverage: 杠杆

性能指标 (metrics):

  • initial_deposit: 初始入金
  • net_profit: 总净盈利
  • gross_profit: 毛利
  • gross_loss: 毛损
  • profit_factor: 盈利因子
  • expected_payoff: 预期收益
  • recovery_factor: 采收率
  • sharpe_ratio: 夏普比率
  • ahpr/ghpr: 几何/算术平均收益率
  • lr_correlation: LR相关性
  • lr_standard_error: LR标准误差
  • max_drawdown: 最大结余亏损
  • max_equity_drawdown: 最大净值亏损
  • absolute_drawdown: 绝对结余亏损
  • margin_level: 预付款维持率
  • total_trades: 交易总计
  • total_deals: 总成交
  • short_trades: 卖出交易
  • long_trades: 买入交易
  • winning_trades: 盈利交易
  • losing_trades: 亏损交易
  • win_rate: 胜率
  • max_profit_trade: 最大获利交易
  • max_loss_trade: 最大亏损交易
  • avg_profit_trade: 平均获利交易
  • avg_loss_trade: 平均亏损交易
  • longest_win_streak: 最大连胜
  • longest_lose_streak: 最大连败
  • avg_win_streak: 平均连胜
  • avg_lose_streak: 平均连败
  • min_hold_time/max_hold_time/avg_hold_time: 持仓时间
  • quality: 质量历史
  • bars: 柱数
  • quotes: 报价数
  • score: 分值
  • on_tester: OnTester结果

EA参数优化系统

概述

EA参数优化系统用于自动寻找EA的最优参数组合,支持多种搜索策略。

目录结构

optimizer/
├── configs/              # EA配置文件目录
│   ├── MA_Cross.json   # 示例: MA交叉策略 (6参数, Grid搜索)
│   └── Grid_Pro.json   # 示例: 网格策略 (8参数, 遗传算法)
├── set_files/           # 生成的SET参数文件
│   └── {EA_NAME}/
│       └── params_00000001.set ~ params_NNNNNNNN.set
├── reports/            # MT5测试报告
├── results/           # 分析结果
│   ├── {EA_NAME}_param_mapping.csv
│   └── optimization_report.txt
├── scripts/           # PowerShell脚本
└── logs/             # 日志

EA配置文件格式

{
    "ea_name": "MA Cross Scalper",
    "ea_path": "Experts\\MA_Cross.ex5",
    "description": "双MA交叉策略",
    "search_strategy": "grid",
    "optimization_criterion": "profit_factor",
    "parameters": {
        "FastMA_Period": {
            "type": "int",
            "default": 14,
            "min": 5,
            "max": 30,
            "step": 1,
            "description": "快速MA周期"
        },
        "SlowMA_Period": {
            "type": "int",
            "default": 50,
            "min": 20,
            "max": 100,
            "step": 5,
            "description": "慢速MA周期",
            "condition": ">FastMA_Period"
        }
    },
    "test_config": {
        "symbol": "EURUSD",
        "period": "H1",
        "from_date": "2025.01.01",
        "to_date": "2025.12.31",
        "model": 1,
        "deposit": 10000,
        "leverage": "1:100"
    },
    "walk_forward": {
        "enabled": false
    }
}

参数类型

类型 说明 示例
int 整数参数 FastMA_Period: 5-30
double 浮点参数 RiskPercent: 0.5-3.0
bool 布尔参数 EnableMM: true/false
enum 枚举参数 TradingMode: BUY/SELL/BOTH

搜索策略选择

组合数 策略 说明
≤10,000 Grid Search 暴力遍历,适合快速测试
10,001-500,000 Latin Hypercube 均匀采样,效率高
>500,000 Genetic Algorithm 遗传算法,智能搜索

使用方式

方式一:图形界面

python gui.py

切换到"参数优化"标签页,可以:

  • 查看EA配置列表
  • 生成SET文件
  • 运行优化测试
  • 分析优化结果

方式二:命令行

# 列出所有EA配置
python optimizer_main.py list

# 生成SET文件
python optimizer_main.py generate --ea "MA Cross Scalper"

# 分析结果
python optimizer_main.py analyze --sort profit_factor

参数约束

在EA配置中使用 condition 字段定义参数约束:

"SlowMA_Period": {
    "condition": ">FastMA_Period"
}

支持的运算符:>, <, >=, <=, ==, !=

GUI优化面板功能

  1. 列出EA配置 - 显示所有配置的参数数量、组合数、预估时间
  2. 生成SET文件 - 为每个参数组合创建.set文件
  3. 运行优化 - 生成PowerShell脚本,用户可手动执行
  4. 分析结果 - 解析报告,找出最优参数组合

输出文件

  • {EA_NAME}_param_mapping.csv - 参数ID映射表
  • optimization_report.txt - 优化分析报告
  • best_params.json - 最优参数JSON

AI辅助参数优化工具

概述

scan_set_prompt.py 是一个命令行工具,用于扫描 MT5 的 SET 参数文件,生成带完整提示词的文本文件,方便发给 AI 讨论参数优化方案。

工作流程

SET文件 → scan_set_prompt.py → AI提示词txt → AI生成优化JSON → 保存到optimizer/configs/

使用方式

# 交互式选择模式
python scripts/scan_set_prompt.py --interactive

# 扫描单个SET文件
python scripts/scan_set_prompt.py --file "C:\path\to\EA.set"

# 扫描文件夹下所有SET文件
python scripts/scan_set_prompt.py --folder "C:\path\to\Profiles\Tester"

# 批量扫描多个SET文件
python scripts/scan_set_prompt.py --batch a.set b.set c.set

# 指定输出目录
python scripts/scan_set_prompt.py --file "C:\path\to\EA.set" --output "C:\path\to\output"

交互式模式选项

1. 扫描单个 SET 文件
2. 扫描文件夹下所有 SET 文件
3. 批量扫描多个 SET 文件
4. 从剪贴板读取 SET 内容
0. 退出

生成的文件内容

生成的 _optimization_prompt.txt 包含:

  1. 基本信息 - EA名称、参数总数
  2. 参数详情表 - 所有参数的当前值、范围、步进
  3. 参数分析任务 - 引导 AI 分析哪些参数该优化、范围建议
  4. 完整JSON模板 - 符合 optimizer/configs/*.json 格式,包含:
    • ea_path 自动做 ASCII 安全处理(支持中文名 EA)
    • parameters 部分带优化建议注释
    • test_configwalk_forward 配置

输出示例

{
    "ea_name": "GoldSniper_Pro_v2",
    "ea_path": "MY-EA\\GoldSniper_Pro_v2.ex5",
    "description": "Edited via GUI",
    "search_strategy": "auto",
    "parameters": {
        "LotSize": {
            "type": "double",
            "default": 0.01,
            "min": 0.01,
            "max": 0.1,
            "step": 0.001,
            "optimize": true  // AI根据策略分析填写
        }
    },
    "test_config": {...},
    "walk_forward": {...}
}

注意事项

  • SET 文件支持多种格式:我们的 =val||min||step||max||Y 格式、MT5 原生 <val1> <val2> 格式、布尔 true/false 格式
  • 自动检测文件编码(UTF-8、UTF-16-LE/BE
  • ea_path 使用双反斜杠 \\,中文 EA 名自动转换为 ASCII(如 EAGoldSniperEA_GoldSniper
  • AI 生成的 JSON 可直接保存到 optimizer/configs/ 目录使用

批量提取文件名工具

概述

extract_filenames.py 用于批量提取某个文件夹下所有文件名,支持子文件夹递归检索。

使用方式

python extract_filenames.py

交互式操作:

  1. 输入要扫描的文件夹路径
  2. 选择是否包含子文件夹(默认包含)
  3. 输入输出文件名(直接回车使用自动命名)

输出文件命名规则

  • 自动命名格式:{源文件夹名}_filenames_{日期时间}.txt
  • 例如:mt5_backtest_filenames_20260531_195723.txt
  • 文件保存在被扫描文件夹的父目录

示例

请输入文件夹路径: C:\Projects\MyEA
是否包含子文件夹? (y/n, 默认y):
输出文件名 (直接回车使用自动命名):

正在扫描文件夹: C:\Projects\MyEA
模式: 包含子文件夹 (递归)
请稍候...

完成! 共找到 128 个文件
结果已保存到: C:\Projects\MyEA_filenames_20260531_195723.txt

未来可扩展方向

1. 自动化参数优化

  • 集成 OptParams 参数优化功能
  • 支持遗传算法、枚举等优化方法
  • 自动寻找最优参数组合

2. 多经纪商支持

  • 支持不同经纪商的配置切换
  • 账户资金和杠杆差异化设置

3. 实时监控面板

  • Web 界面实时显示回测进度
  • 推送通知(邮件/微信)回测完成提醒

4. 机器学习辅助

  • 使用历史数据训练预测模型
  • 辅助参数选择和优化方向建议

5. 云端分布式回测

  • 支持多台机器并行回测
  • 任务队列和负载均衡

6. 更丰富的报告分析

  • 资金曲线图表
  • 交易分布热力图
  • 月度/年化收益统计

7. 数据库存储

  • SQLite/PostgreSQL 存储历史回测结果
  • 支持历史对比和趋势分析

依赖环境

  • Python 3.8+
  • MetaTrader 5 Terminal
  • 依赖库: tkinter (GUI), yaml, openpyxl, beautifulsoup4, lxml

项目结构

mt5_backtest/
├── gui.py                       # 图形界面(回测 + 优化,唯一入口)
├── scripts/
│   ├── ini_generator.py        # 生成MT5配置文件
│   ├── mt5_auto_runner.py       # 自动运行回测
│   ├── batch_executor.py        # 批量执行器
│   ├── result_parser.py        # 解析HTM/XML报告
│   ├── report_generator.py     # 生成汇总报告
│   └── optimizer/              # EA优化系统
│       ├── ea_config_parser.py  # EA配置解析
│       ├── smart_search.py      # 搜索策略
│       ├── parameter_constraint.py # 参数约束
│       ├── analyze_results.py   # 结果分析
│       └── ea_batch_optimizer.py # 批量优化器
├── config/                      # 配置文件
├── reports/                     # 回测报告目录
├── optimizer/                   # 优化系统目录
│   ├── configs/               # EA配置
│   ├── set_files/             # SET文件
│   ├── reports/              # 优化报告
│   └── results/              # 分析结果
└── logs/                      # 日志目录

常见问题

Q: MT5 终端路径不正确

修改 config/ea_configs.yaml 中的 terminal_path 为实际路径

Q: 报告文件未生成

  1. 检查 MT5 是否正常启动
  2. 查看 logs/batch_executor.log 日志
  3. 确认 data_dir 配置正确

Q: 中文显示乱码

HTM 报告采用 UTF-16-LE 编码,result_parser.py 会自动处理,无需手动转换

许可证

MIT License

S
Description
No description provided
Readme 22 MiB
Languages
Python 74%
MQL5 25.2%
Batchfile 0.5%
PowerShell 0.3%