分类
平台
难度
入门
适用场景
MT5 操作EA 评估

魔术数字

EA 在自己发出的每一笔订单上打的一个整数,用来认出自己的持仓,并且不去碰账户里的其他任何东西。

亦称:EA 魔术号, 订单魔术号, MAGIC

更新于 · 审阅于

一句话讲清

每一笔交易上的名牌。终端并不在乎是谁开的仓,所以每个 EA 在订单票上写下自己的号码,之后只碰带着这个号码的票。

为什么重要

MetaTrader 让账户里的每个 EA 看到完全一样的全部持仓。没有标记,EA 就无法把自己的交易和你的、或者另一个 EA 的区分开——而管错了持仓的 EA,是一种会花钱的 bug,不是一种会报错的 bug。

  • 正是它才让「在一个账户上同时跑好几个 EA」这件事一开始就成为可能。
  • 它保护手动交易:那些单子带着魔术号 0,写得正确的 EA 永远不会碰它们。
  • 它也是事后把交易历史按策略拆开的办法——这个标记会一直留到成交历史里。

在 MetaTrader 5 中

在 MT5 的什么位置

  • 图表 → EA 属性(F7)→ 输入参数——EA 自己的 MagicNumber 输入项
  • 策略测试器 → 输入参数——测试时用的是同一个输入项
  • MQL5 代码:发送时用 MqlTradeRequest.magic,回读时用 POSITION_MAGIC / ORDER_MAGIC / DEAL_MAGIC

EA 如何使用它

  • 启动时设置一次——CTrade::SetExpertMagicNumber(MagicNumber)——此后 EA 发出的每一笔订单都带着这个标记。
  • 每一轮都过滤:持仓循环在修改、移动止损或平掉任何东西之前,会跳过 POSITION_MAGIC 不属于自己的票。
  • 历史也照样过滤,这样每个 EA 的统计只由那个 EA 的成交算出来。
  • mt5depot Builder 生成的每一个 EA 都带一个 MagicNumber 输入项,取值由策略推导而来,所以两个不同的生成品开箱即用也不会撞号。

常见设置

设置项 常见取值 备注
手动交易 0 终端的默认值。EA 绝不应该去管魔术号 0。
一个 EA、一个品种 任意唯一整数 好记就行——20260807、1001。
同一个 EA 跑在多个品种上 每张图表一个值 否则 EURUSD 那份会把 GBPUSD 那份的持仓平掉。
同时跑多套策略的组合 EA 每条腿一个值 每条腿都需要自己的标记,才能被独立移动止损和平仓。

常见运行问题

  • 两份实例留在同一个魔术号上:各自把对方的持仓当成自己的,在错误的时刻平掉。
  • 在有持仓的时候改魔术号会让它们变成孤儿——EA 认不出几分钟前自己开的单,而且再也不会有什么自动去平掉它们。
  • 把魔术号留在 0,等于让 EA 接管你的手动交易。
  • 终端重启后用默认值而不是你配置过的值重新挂上 EA,会悄悄产生同样的孤儿问题。

相关 MT5 函数

CTrade::SetExpertMagicNumber()
设定这份实例此后每一笔订单都会带的标记。
PositionGetInteger(POSITION_MAGIC)
从一笔持仓上读出标记。
OrderGetInteger(ORDER_MAGIC)
从一笔挂单上读出它。
HistoryDealGetInteger(ticket, DEAL_MAGIC)
从一笔已平仓的成交上读出它,历史按 EA 拆分靠的就是这个。

示例

一个账户上跑三个 EA。每个都打上自己的号码,所以尽管三个都看得见全部六笔持仓,每个持仓循环只碰属于自己的那几行。

一个终端、一个账户、三个主人——把他们分开的只有这个标记。
EURUSD 上的趋势 EA
20260101
USDJPY 上的均值回归 EA
20260102
你的手动交易
0
没有任何 EA 认领这个标记,所以不会有自动的东西去平掉它们。

计算 if (PositionGetInteger(POSITION_MAGIC) != MagicNumber) continue;

结果 每个 EA 只管自己开出来的持仓

示意数字,并非任何上架 EA 的实际记录。

怎么使用

把魔术数字当成账户配置,而不是策略参数:在 EA 上实盘之前写下来,并且在有持仓的时候绝不去改。

  • 按「正在运行的实例」分配取值,而不是按 EA 产品——同一个 EA 挂在两张图表上就需要两个值。
  • 留一份清单。一旦跑到四五个实例,没记下来的标记和撞号的标记就分不出来了。
  • 绝不要重用还挂着持仓的标记,哪怕那个 EA 你已经卸掉了。
  • 每次重装终端或恢复配置文件之后都检查一遍,默认值就是从那儿回来的。

这个值本身对 MetaTrader 没有任何意义——任何整数都行。唯一重要的是它在那个账户上跑着的东西里是唯一的。

常见误区

以为魔术数字会影响成交

它不改变订单成交的任何环节。它是元数据:经纪商不会据此行动,它对价格、点差和滑点都没有影响。

一个 EA 跨多张图表只用一个魔术数字

真正要紧的身份是正在运行的实例,不是产品。两张图共用一个标记,意味着两份实例在管同一池持仓。

为了「重置」一个不听话的 EA 而去改它

已经开着的持仓仍然带着旧标记。改输入项等于把它们抛下:EA 不再认得它们,它们会一直开着,直到手动平仓或被强平。

以为魔术数字会把账户结单分开

终端的「交易」标签页并不显示它。要按 EA 分开结果,必须从历史里读 DEAL_MAGIC,那是报表工具做的事——不是默认结单会给你的。

深入说明

这个标记没有一并买到的东西,在这个货架上数出来

这里公开的 14 只 EA数值
带 MagicNumber 输入项的商品10
安装时需要改动它的商品0
要求你在没有别的东西交易该品种的地方运行的商品8
其中仍然带着 MagicNumber 输入项的商品6
被不止一个商品占用的品种15 个里的 7 个
不能共用一个账户的 EA 组合91 组里的 15 组

把第三行和第四行放在一起读。给订单打标记是一件事;判断一个新信号是否被允许是另一件事,而一个把自己限制在一笔持仓的 EA 必须先去数。如果它用 PositionsTotal() 加一次品种检查来数,别人的持仓就会算进总数;如果它先按 POSITION_MAGIC 过滤,就不会。这里有六个商品带着这个输入项、却照样印着那句警告,这就告诉了你它们的持仓计数用的是哪一种。

所以搭配的问题其实是品种的问题,而且在买之前就能回答。USD/JPY 同时被四个商品占用—— Iridescence、Kestrel Hover、Lanternfish 和 Tessera——所以它们中任何两个都不该放在一起。EUR/GBP 现在也有两只,Ballast 和 Thunderhead。只有 Orrery、Peregrine 和 Zerqon 不和任何人重叠。两个确实重叠的时候,分开账户能解决标记解决不了的事:那样每个 EA 数的就是一个只含自己交易的池子。我们的方法论会按品种记录每一次公开的运行,这正是同一个区分从测量那一侧看过去的样子。

常见问题

我该用哪个魔术数字?
任何在那个账户上还没被占用的整数,并且不要用 0——那个值属于手动交易。像 20260807 这样日期形式的值,在多份实例同时运行时最容易跟踪。
两个 EA 可以共用同一个魔术数字吗?
技术上可以,而且这是难以定位的亏损的常见成因:每份实例都把对方的持仓当成自己的,可能在错误的时刻平掉或移动止损。请给每一份正在运行的实例各自的取值。
魔术数字在策略测试器里重要吗?
只测一个 EA 的时候不重要,因为测试账户里没有别的东西在交易。一旦同一个实盘或模拟账户上跑着不止一个 EA,它就重要了。