MetaTrader 中的多机器人:从单图表中启动多个机器人(基础篇)
◍ 单图表挂多个EA的底层差异
在 MT4 与 MT5 里同时跑多个机器人,约束条件完全不同。MT4 一个图表只能绑定一个 EA,想多策略同屏只能开多个子窗口;MT5 从架构上允许在同一个图表上加载多个 EA,但事件分发和定时器资源是共享的,写不好就会互相抢 OnTick 执行槽。 实际验证很简单:在 MT5 同一 EURUSD 的 M1 图表上分别挂两个仅打印魔术号的脚本型 EA,回看专家日志能看到两者 tick 触发是交错进行的,并非串行独占。外汇与贵金属杠杆高,多 EA 同图表叠加仓位时风险会成倍放大,可能触发非预期爆仓。 很多人忽略适用边界——如果 EA 依赖独立的图表对象(如手动画的趋势线名重复),同图表多挂会互相覆盖。MT5 的通用模板思路是把每个机器人的魔术号与对象前缀强制隔离,这部分在后续小节会拆代码。
一个 EA 管多图表的动机
手动把同一个机器人逐个拖到 EURUSD、XAUUSD、GBPJPY 等不同图表并分别配置参数,是多数 MT5 使用者的日常痛点。当监控品种超过 5 个,重复挂载与参数同步的耗时就会明显侵蚀盯盘效率,且容易漏挂或配错。 本文给出一种通用模板思路:把多图表调度逻辑收进单个 EA,只需把它挂到主图表,其余品种由 EA 内部遍历 Symbol 列表自行处理。这样挂载动作从 N 次降为 1 次,参数也只需在一处维护。 外汇与贵金属杠杆高、滑点跳空频繁,自动化前需在策略测试器用真实点差回测验证稳定性,不可直接上实盘。
「多币种回测与分散 EA 的真实瓶颈」
在 MT5 里同时验证若干金融产品、或同一策略的多币种表现,最麻烦的不是写逻辑,而是把分散的报告拼起来。单品种跑完的回测结果后期很难合并,至少 MT5 官方测试器没有现成工具做这件事;MT4 倒有过非官方合并器,但路子不正,不值得依赖。 实盘层面,每个 EA 各挂一张图独立跑,图表一多就会吃掉额外计算机资源,可能减慢执行、诱发意外错误,最终拖累交易结果。每张图上的机器人还得配唯一订单 ID、防高频请求轰炸,这些细节新手很容易漏。 图形界面是另一处敏感点。现在像样的 EA 起码会在图上标个“已加载”,既能给用户信心,也方便盯盘时手工干预。但多模板分发时,界面刷新文本和数字的开销会指数级上涨;用轻量模板能把终端资源占用压到最低。 这套思路不解决所有问题,但能明显降低多币种项目的工程负担。外汇和贵金属本身高杠杆高风险,任何自动化方案都只是降低运维成本,不改善策略胜率。你若也在跑一堆独立 EA,可以先把界面层抽成最小模板,腾出资源给订单路由。
◍ 多品种回测时 MT4 与 MT5 测试器的真实落差
MT5 测试器最强的一点,是按时间自动同步多品种报价,跑完直接给你一条跨品种对齐的盈利曲线;MT4 没有这套机制,这是它最被人诟病的短板。不过 MQL4 语法已向 MQL5 靠拢,写跨终端模板时代码差异极小。 像 CopyClose、CopyOpen、CopyHigh、CopyLow、CopyTime、SymbolInfoTick、SymbolInfoInteger 这些函数在两个终端都存在,能取任意品种任意周期的柱线数据。但 MT4 测试器有个硬限制:这些函数只对当前测试图表生效,其余品种请求直接返回“无数据”。结果就是 MT4 里你只能看到单一品种、单机器人的一条盈利曲线。 MT5 则输出所有请求品种的共同盈利曲线。实盘层面两者没差——直接挂 EA 交易时模板性能完整释放,区别仅停留在回测。外汇与贵金属杠杆高、滑点跳空频繁,回测曲线不等于实盘结果,概率上 MT5 多品种同步测试更贴近真实组合表现。 实操上建议先写 MT5 版把参数和多品种逻辑测透,再快速移植 MT4 版。MT4 对计算资源占用更低,在轻量机器上仍值得留着跑单品种验证。
柱线范式与字符串驱动的多图模板
MT5 里每个图表是独立对象,能挂多个指标却只能绑一个 EA;不少人开若干雷同图表,只为在同一品种周期跑不同 EA 或同 EA 多副本。想用统一模板替代多图表,就得在模板内把这些关系重做一遍。 逐跳价(OnTick)处理有个硬伤:模板里没法给每个图表订阅独立跳价处理器,只能借用主图跳价或走 OnTimer。后者必然带延迟,拿 SymbolInfoTick 取tick也不完美,写自定义 OnTick 衍生自 OnTimer 很别扭——对套利党每毫秒都计较的人可能是诱惑,但我没把它当主线。 这些年我更信柱线交易范式:大部分计算和交易动作放在新柱出现那一刻。即使判定新柱有偏差,对结果影响也有限,周期越长越钝化;离散成柱线能让回测速度提升几个数量级,且真实 tick 与人工报价测试品质一致。它顺手消掉了跳价 EA 的多数麻烦,还省算力。 模板不必复刻终端整个工作区,给每个机器人一个独立图表足矣。输入用字符串变量当动态数组最实际——我拆出 Charts、Chart Lots、Chart Timeframes 三个冒号分隔的串,EA 启动时解析填数组。手数共享变量可写死全部图表单手或同周期。 自动手数靠 Deposit For Lot 调:设 0 即固定手数,否则按 Lot = Input Lot * (Current Deposit / Deposit For Lot) 随资金缩放。Magic ID 只设起始值,模板自增分配,重开 EA 不再怕忘 ID 导致订单混乱,把人工配置出错概率压到最低。外汇贵金属高杠杆,多副本 ID 撞车会直接停策略,这条不能省。