多币种 EA 自动化优化(基础篇):从手动拼串到数据库驱动初始化(基础篇)
(1/3)· 还在手动往 EA 里抄优化参数?这篇先把自动生成初始化字符串的地基打牢
「用测试器批量跑多币种优化」
MT5 的 Strategy Tester 原生支持多金融工具同测,但默认只跑当前图表品种。要在一次任务里覆盖多个币种,得在 EA 输入参数里显式传入符号列表,否则优化结果只反映单一品种行为。 实际工程里,Yuriy Bykov 在 2025-01-08 发布的系列第 11 部分提到,自动化优化的第一步是把人工逐币种调参改成脚本驱动。测试器若开启「多币种模式」,单次优化可同时评估 EURUSD、GBPUSD、XAUUSD 等,回测帧数随品种数线性增长,8 核本机跑 3 个品种、每品种 200 代遗传优化约耗 1 144 秒(原文实测值),这是硬耗时底线。 外汇与贵金属杠杆高、滑点跳空频繁,多币种同测虽能暴露参数过拟合某单一品种的隐患,但任何优化产出都只是历史概率倾向,实盘仍需小资金验证。
从手动搬参数到自动吐初始化串
上一阶段我们已经打通了多策略实例协同 EA 的基础:不再需要在代码或输入里逐个手填每个实例的参数,只要把按格式写好的初始化字符串存进文件、或直接贴进源码,EA 就能吃进去用。 之前这些初始化串都是人工拼的,错一个字符就得重跑。现在要做的,是根据优化结果让 EA 自己把串生成出来。 本篇范围内大概率还到不了全自动,但至少能在「优化完直接出串」这个方向上往前推一大步,省掉手动抄参数的环节。外汇与贵金属品种波动剧烈,任何参数迁移都建议先在策略测试器里回测验证。
◍ 把多品种多周期塞进一个EA
我们要做的不是写死单一图表周期的EA,而是让一个策略实例在 EURGBP、EURUSD、GBPUSD 三个品种,以及 H1、M30、M15 三个周期上分别跑优化。每次优化产出的结果落进数据库,之后能按品种+周期(以及后续扩展的其它测试参数)精准捞出来。 从每组品种-周期组合里,按既定标准挑若干最优结果,先归到一个实例组里。组乘数现在手动定,后续会交给独立EA处理,但当前阶段手算不影响验证逻辑。 最后一步是把选中的组和乘数拼成初始化字符串,直接喂给最终EA用。你在MT5里可以先建三品种三周期的优化任务,跑完看数据库里结果行数和预期9组是否对齐。
「三类 EA 与初始化字符串的分工」
先把后续要反复用到的几个实体说清楚。通用 EA 是一类接收初始化字符串后就能在账户上跑的 EA:它既可以从输入参数指定名称的文件里读这段字符串,也能按项目名和版本去数据库拉取。 优化 EA 专门负责把优化流程跑完。挂到图表上后,它去数据库查待执行的优化任务,按顺序推进,跑完产出的结果就是写给通用 EA 用的初始化字符串。 阶段 EA 是真正进测试器被优化的实体。阶段数决定有几个阶段 EA,优化 EA 拉起它们、盯完成度。本文先只做单阶段——优化一个策略实例的参数;把多个优解并成一组并做规范化留到第二阶段手动处理。 我们还会做一种能自构初始化字符串的通用 EA,从库里挑策略好样本来填。库里优化任务信息先求结构清晰、易建,暂不管录入界面,重点是把表结构定出来。 实体识别从粗到细:先泛后简,最终落到已建好的「单次测试器通过」那条记录上。
项目实体如何承载多阶段优化任务
在 MQL5 优化框架里,项目(Project)是放在最顶层的复合实体,一个项目会挂多个阶段(Stage)。它用名称和版本做标识,还能附一段描述,状态机只有四种:Created、Queued、Processing、Done。刚建好时一定是 Created,跑完最后一阶段才落定 Done。 项目对象落库时要记七类字段:id_project 是主键;name 给通用 EA 反查初始化串用;version 区分策略实例版本;description 可空;params 初值为空,等跑完才填进通用 EA 的初始化字符串;status 跟踪生命周期。字段后续可能扩,但这两类核心(标识 + 运行状态)不会动。 状态流转现在靠手动推:准备好就置 Queued,优化 EA 扫到 Queued 会抢成 Processing;第一阶段开跑项目进 Processing,末阶段结束自动 Done,同时 params 被填充。外汇与贵金属品种波动剧烈、杠杆风险高,这套状态机只解决工程调度,不暗示任何收益。 为了不在 MQL5 里手写冗长 SQL,后面会做一层轻量 ORM,把数据库实体映射成 MQL5 类,项目类就是第一个落地对象。这样在 EA 里直接读对象属性即可,不用管底层表结构。
◍ 阶段如何串联起优化任务
在「小布盯盘」的批优化框架里,一个项目被拆成若干阶段,每个阶段只干一件事:把指定的 EA 放进测试器按固定时间窗跑优化。阶段里写死的 from_date 到 to_date 就是这轮优化的回测区间,对同一阶段下的所有作业始终一致;forward_date 若留空,则不开前向检验,实盘前需自行补这段验证。 阶段可以挂一个父阶段,只有父阶段 status 变成 Done,子阶段才会从 Queued 转为可处理。数据库落地的字段里,id_stage、id_parent_stage、expert、from_date、to_date、forward_date 是核心,初始存款和分时报价模拟模式大多走默认值,不必每次改。 阶段自身的状态机只有三种:新建即 Queued,首个 job 起跑切到 Processing,全部 job 跑完落定 Done。盯 MT5 优化队列时,看到阶段卡在 Queued,先确认它的父阶段是不是还没 Done,而不是盲目重启 EA。