- 9/3/2026
- 9/3/2026
- 9/3/2026
本文专为 MT4 和 MT5 (MQL4/MQL5) 编写。由于实现细节可能会随平台版本的变化而改变,请根据当前的 MetaQuotes 文档验证特定的字段名称和行为。
外汇中的 Magic Number(魔术数字)是一个由专家顾问(EA)为其开启的订单或交易分配的数字标识符。EA 随后可以搜索该数字,从而将其自身的交易与手动订单或同一账户上其他 EA 开启的交易区分开来。Magic Number 与订单号(Ticket)和订单注释(Comment)是相互独立的,且只有在 EA 确实被编写为一致地分配和检查该数字时,它才能正常工作。它并不会因为存在一个 EA 就自动生效。
最后一部分比大多数指南所说的更为重要,所以让我们深入探讨一下。
Magic Number vs. 订单号 (Ticket) vs. 注释 (Comment)
这三者经常被混淆,老实说,我觉得这并不奇怪。它们都是“附加在交易上的数字或文本”,所以从表面上看它们似乎可以互换。但事实并非如此。
| 标识符 | 由…分配 | 主要用途 |
| Magic number | EA 或交易代码 | 识别哪个策略开启了交易 |
| 订单号 (Ticket number) | 交易平台 | 唯一标识特定的订单、成交或持仓记录 |
| 订单注释 (Order comment) | EA、脚本或交易者 | 附加可选的可读文本 |
| 交易品种 (Symbol) | 市场或经纪商 | 识别正在交易哪种工具 |
| 账户号码 (Account number) | 经纪商 | 识别交易账户本身 |
Magic Number 与注释并不是一回事,尽管此话题的早期版本指南确实是这样说的。注释是自由文本,可以被编辑、被平台截断,或者完全留空。而 Magic Number 是 EA 通过程序化设置的定义好的数字字段。它们的作用不同,如果将注释视为可靠的标识符,将会带来麻烦,因为注释并不保证具有唯一性,甚至不一定存在。

EA 如何分配 Magic Number
当 EA 开启一笔交易时,其代码可以将特定的 Magic Number 值作为交易请求的一部分附加到该订单上。该值随后随订单一起传输,随后 EA(或脚本、或外部报告工具)可以通过检查每笔交易携带的 Magic Number 来对交易进行过滤。
这里有一个容易产生误解的地方:并非每个 EA 都会自动拥有 Magic Number,也并非每个 EA 都能很好地使用它。为了让 Magic Number 真正发挥作用,代码需要:
- 在设置中的某个地方接受或定义一个 Magic Number 值
- 每次提交订单时都分配该值
- 使用它来过滤现有的订单或持仓
- 避免干扰携带不同数字的交易
一些 EA 完全跳过了这一逻辑,或者回退到使用一个不具唯一性的默认值。在这种情况下,虽然 Magic Number 作为一项设置存在,但它并不能真正起到保护作用。
Magic Number 的作用(以及它不具备的功能)
我想直截了当地说明这一点,因为这是关于这个话题最大的误解:Magic Number 并不计算业绩。它本身并不追踪利润、亏损、回撤、胜率或风险调整后收益。它的作用仅仅是为交易打上标签,以便兼容的工具、EA 本身、脚本或外部分析平台可以将属于同一策略的交易进行分组。
如果你在一个账户上运行三个 EA,并想查看每个 EA 的单独表现,Magic Number 是让报告工具区分这些数据的关键。但实际的业绩计算是在别处进行的。这个数字本身仅仅是一个标签。
EA 如何寻找自己的交易
假设 EA A 使用 Magic Number 1001 进行 EUR/USD 交易,而 EA B 使用 Magic Number 2001 在同一账户进行交易。当 EA A 扫描其未平仓交易时,它会专门过滤带有 1001 标签的 EUR/USD 持仓,并忽略任何带有 2001 标签的交易。
理论上这听起来很清晰。但在实践中,仅靠 Magic Number 进行过滤是有风险的。更稳健的方法通常会同时检查多个字段:
- 账户 (Account)
- 交易品种 (Symbol)
- Magic number
- 订单或持仓类型 (Order or position type)
- 策略版本 (Strategy version)
- 方向 (Direction)
- 订单号 (Ticket),在相关时使用
- 注释 (Comment),作为有用的二次检查
为什么要费这么大劲?因为两个 EA 可能会在无意中使用了相同的 Magic Number,特别是如果它们是基于类似的模板构建的,或者从网络示例中复制且没有更改默认值。如果 EA A 和 EA B 都使用 1001,它们可能会开始读取、关闭或修改彼此的交易,而其中任何一个都不知道正在发生这种情况。
为什么每个策略都需要唯一的标识符
这值得专门列出一个章节,因为出错的后果并不小。如果两个独立管理的 EA 共享同一个 Magic Number:
- 一个 EA 可能会误以为是自己的交易而关闭另一个 EA 的交易
- 它可能会修改属于另一个策略的止损或止盈水平
- 在计算头寸规模时,它可能会计算错误的风险敞口
- 它可能会因为认为持仓已开启而阻止一个有效的入场
- 两种策略的报告和统计数据都可能产生误导
这些都不是假设性的。这是一个相当常见的错误,特别是当交易者复制一个 EA 模板,却忘记在运行第二个策略之前更改 magic-number(魔术数字)设置时。
一个合理且可重复的编号约定有助于避免这种情况。虽然具体的格式完全取决于个人或团队的约定,而不是 MetaTrader 的要求,但这里有一个示例结构:
| 位数 | 含义 |
| 前 2 位 | 策略系列 |
| 接下来的 2 位 | 策略版本 |
| 接下来的 2 位 | 品种组 |
| 最后 2 位 | 时间框架或变体 |
在那种方案下,像 10030702 这样的 magic number 可能意味着策略系列 10,版本 03,品种组 07,时间框架或变体 02。建议在你的 EA 旁边保留一个简单的登记表,这样你(或任何其他管理账户的人)可以一眼看出正在运行什么:
| Magic number | EA | Symbol | Timeframe | Version |
| 10030702 | Trend EA | EUR/USD | H1 | 2 |
| 10040701 | Breakout EA | GBP/USD | M15 | 1 |
MT4 与 MT5 中的 Magic Numbers
这是一个我发现经常被忽视的区别,它确实会改变 magic numbers 在实际操作中的行为方式。
MT4 通常将交易管理为“票据(tickets)”,每个订单都带有自己的身份。MT5 的工作方式不同:它将订单、成交(deals)和持仓(positions)作为独立的概念进行区分,并且账户可以运行对冲(hedging)或净额(netting)模式。
特别是在净额账户中,交易同一品种的多个策略最终可能会合并为一个净头寸,而不是作为独立的、单独追踪的交易存在。这意味着,仅靠分配不同的 magic numbers 并认为问题已解决,在头寸层级的归因上会变得更加复杂。Magic-number 的行为确实取决于你运行的平台和账户模式,因此在假设你的策略是清晰分离之前,最好先确认你的账户是如何处理的——是 Hedging 还是 Netting。
重启后实际会发生什么
这是一个经常出现在初学者内容中的说法,需要予以纠正:仅凭一个 magic number 并不能保证 EA 在重启后能识别其未平仓交易并避免重复。这种恢复行为完全取决于 EA 的代码编写方式。
在断开连接、电脑重启或平台重新启动后,一个构建良好的 EA 可以通过检查 magic number、symbol 以及其他相关字段来搜索匹配的交易。但这句话中的“可以”是关键。为了安全地恢复,EA 通常需要:
- 扫描当前未平仓的订单或头寸
- 使用其自身的标识符进行正确过滤
- 重建其所需的任何内部状态(如入场价格或追踪止损进度)
- 检查其正在查看正确的品种和账户
- 正确处理部分平仓
- 不仅考虑未平仓头寸,还要考虑挂单
- 避免在会导致重复交易的条件下重新入场
如果缺少这些逻辑中的任何一项,重启绝对会导致重复订单,或者导致 EA 丢失对其本应管理的头寸的追踪。Magic number 只是其中的一个环节,而非完整的解决方案。
同样,在 EA 仍有未平仓交易时更改其 magic number 也是一个真实的风险。如果一个 EA 使用一个数字开仓,然后在重启后使用另一个数字,它可能根本无法识别现有的头寸。除非代码中包含专门的、经过测试的迁移过程来处理这种情况,否则不要更改运行中 EA 的 magic number 设置。
手动交易与 Magic Numbers
手动交易通常不会像 EA 分配的 magic number 那样具有明确的意图,尽管具体的约定可能因平台、脚本或跟单工具而异。EA 必须明确决定如何处理这些交易:
- 完全忽略手动交易,仅管理自己的交易
- 如果逻辑需要,以某种方式包含手动交易
- 严格管理自己标记的交易,并忽略其他一切
- 尊重由同一账户上其他系统创建的现有风险敞口
假设 EA 会自动“知道”哪些是手动交易,哪些不是,这是一个错误。这种行为必须内置在代码中。
值得避免的常见错误
- 在不相关的 EA 之间重复使用相同的 magic number:这可能是最常见的问题,它会导致两个策略互相干扰交易,且不会触发任何错误提示。
- 在交易未平仓时更改 magic number:EA 可能会直接停止识别其现有的头寸。
- 仅通过 magic number 过滤而未通过 symbol 过滤:如果 EA 没有同时检查两者,它最终可能会修改或统计错误的品种上的交易。
- 假设 magic number 可以防止重复入场:它本身并不能做到这一点。重复保护需要在代码中实现独立的入场状态逻辑。
- 假设每个报告工具都会自动导入 magic-number 数据: 某些分析或报告工具可能无法展示或保留该数据,因此在依赖它之前请务必进行检查。
- 将订单注释视为可靠的标识符:注释可能会被截断、编辑或留空,而这些情况都不会发生在正确分配的 magic number 上。
部署前的 EA 逻辑检查清单
在将任何 EA 投入实盘账户之前,值得运行一遍此流程:
- 它是否分配了一个刻意的、非默认的 magic number?
- 它是否同时通过 magic number 和交易品种进行过滤,而不仅仅是其中之一?
- 它是否区分了市价订单和挂单?
- 它是否能正确处理部分平仓?
- 在重启后,它能否正确重建其状态?
- 它是否避免了在相同条件下产生重复条目?
- 它是刻意忽略或包含手动交易,还是在处理手动交易时表现得不可预测?
- 它是否能安全地处理更改后的输入设置,而不破坏现有逻辑?
- 它是否在你可以实际查看的地方记录了错误和交易行为?
- 它是否能与你账户的对冲或净额结算模型正确配合?
关于在没有编程经验的情况下构建 EA 的说明
传统上,将手动策略转化为 EA 意味着需要聘请开发人员,这往往既慢又贵,并且在代码真正符合你的意图之前,通常需要经过几轮来回修复 Bug。策略构建软件已使这一过程对于没有编程背景的交易者来说变得更加容易,让你无需亲自编写 MQL 即可生成 EA 逻辑。
即便如此,自动化并不自动意味着安全或无误。即使是生成的 EA 仍然带有真实的运营风险:
- 编程错误,无论是人工编写还是生成的
- 经纪商断开连接
- VPS 或托管服务中断
- 由于恢复逻辑不完整导致的重复订单
- 错误的头寸规模
- 平台更新改变了预期行为
- 崩溃后内部状态损坏
- 市场环境变化导致的策略失效
- 如果账户访问未得到妥善保护,可能导致凭据被盗
- 恶意或未经充分审核的第三方 EA
策略构建器可以显著减少所需的编程工作量,但它生成的 EA 仍需要代码审查、实际测试、风险控制以及专人进行监控。它还需要平台运行、启用算法交易、活跃的经纪商连接以及一个正常工作的计算机或 VPS 来实际监控市场。它本身并不会“一直”进行交易;只有在所有这些基础设施保持运行的情况下,它才会进行交易。
还有一点需要纠正:一个账户并没有像“最多 99 个 EA”这样的固定限制。实际容量取决于你的 CPU、可用内存、平台和经纪商的限制、你运行了多少个图表、跳动频率、代码效率、网络稳定性,以及你一次能承受多少风险敞口。任何在没有关联到已记录的经纪商或平台限制的情况下就引用特定数字的行为,很可能是在猜测。
常见问题
每个专家顾问(EA)都需要 magic number 吗?
不需要。magic number 是 EA 代码必须刻意定义并使用的设置;它不是每个 EA 都自动存在的强制性平台功能。一些简单的或单一策略的设置可能根本不需要它。一旦你在同一个账户上运行多个 EA,它就变得至关重要,因为如果没有一致的标识符,很难快速区分每个策略的交易。
我可以设置自己的 magic number,还是由 EA 自动选择?
在大多数 EA 中,magic number 是一个可以自行设置的可调输入,通常在 EA 的属性或输入设置面板中可见。一些 EA 带有默认值,交易者从未更改过,而这正是导致不相关策略之间发生 magic-number 冲突的原因。值得注意的是,你应该为每个 EA 刻意选择并记录自己的值,而不是接受代码自带的任何默认值。
MT5 中的 magic number 运作方式与 MT4 相同吗?
它们可能会开始干扰彼此的交易。由于两者在技术上都被标记了相同的标签,一个 EA 可能会关闭、修改或将另一个的头寸视为属于其自身策略的头寸。这可能会导致两个策略的风险敞口计算错误、入场受阻或产生误导性的业绩统计。为每个 EA 分配一个真正唯一的 magic number 并进行检查,可以防止这一特定问题。
Does a magic number work the same way in MT5 as it does in MT4?
不完全是。MT4 通常围绕单个票据来组织交易。MT5 则将订单、成交和持仓分开,且账户可以运行在对冲或净额模式下。在净额账户中,交易同一品种的多个策略最终可能会合并为一个净头寸,而不是保持完全独立,因此,仅靠基于魔术号(magic number)的归属分析可能无法像在 MT4 中那样直接地提供完整的信息。
在断电或断开连接后,我能否使用订单的魔术号来恢复 EA 的状态?
部分可以,但前提是 EA 的代码支持这一点。一个构建良好的 EA 可以在重新连接后扫描未平仓订单和持仓,通过魔术号和品种进行过滤,并重建其正确管理交易所需的任何内部状态。但这并非仅仅因为存在魔术号就能自动实现。如果恢复逻辑没有被写入 EA 中,重启仍可能导致重复订单或 EA 无法正确追踪的持仓。
最终总结
魔术号是一个标签,而不是一种保证。它确实很有用,而且一旦一个账户内运行多个自动化策略,它几乎是必不可少的,但它只能执行周围代码指令的操作。它本身不会计算业绩,不会在重启后自动恢复 EA 的状态,也不会在没有专门逻辑处理的情况下防止重复交易。理解魔术号的工作到底在哪里结束,以及 EA 更广泛的代码需要在哪里接手,才是本话题的核心所在。
本文仅供教育目的,不构成财务或交易建议。自动化交易带有操作和财务风险,包括代码错误、连接问题以及意外损失的可能性。

Petko Aleksandrov




