160c68da396a135d48fe7051002d2dc837bfcbda
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 界面
- 打开
python gui.py - 切换到"回测配置"标签页
- 在"交易品种"区域勾选需要的品种
- 点击"保存配置"
方法二:直接编辑配置文件
编辑 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
- 标签语言:中英混合
解析器会自动处理以下情况:
- BOM 标记检测与跳过
- 中文字段名匹配(如"盈利因子"、"夏普比率")
- 特殊格式数据提取(如 "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优化面板功能
- 列出EA配置 - 显示所有配置的参数数量、组合数、预估时间
- 生成SET文件 - 为每个参数组合创建.set文件
- 运行优化 - 生成PowerShell脚本,用户可手动执行
- 分析结果 - 解析报告,找出最优参数组合
输出文件
{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 包含:
- 基本信息 - EA名称、参数总数
- 参数详情表 - 所有参数的当前值、范围、步进
- 参数分析任务 - 引导 AI 分析哪些参数该优化、范围建议
- 完整JSON模板 - 符合
optimizer/configs/*.json格式,包含:ea_path自动做 ASCII 安全处理(支持中文名 EA)parameters部分带优化建议注释test_config和walk_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(如(EA)GoldSniper→EA_GoldSniper)- AI 生成的 JSON 可直接保存到
optimizer/configs/目录使用
批量提取文件名工具
概述
extract_filenames.py 用于批量提取某个文件夹下所有文件名,支持子文件夹递归检索。
使用方式
python extract_filenames.py
交互式操作:
- 输入要扫描的文件夹路径
- 选择是否包含子文件夹(默认包含)
- 输入输出文件名(直接回车使用自动命名)
输出文件命名规则
- 自动命名格式:
{源文件夹名}_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: 报告文件未生成
- 检查 MT5 是否正常启动
- 查看
logs/batch_executor.log日志 - 确认
data_dir配置正确
Q: 中文显示乱码
HTM 报告采用 UTF-16-LE 编码,result_parser.py 会自动处理,无需手动转换
许可证
MIT License
Description
Languages
Python
74%
MQL5
25.2%
Batchfile
0.5%
PowerShell
0.3%