Spec Match Trade Copier MT5
- 实用工具
- 版本: 1.1
- 更新: 30 九月 2026
- 激活: 10
一款适用于 MetaTrader 5 的本地交易复制器。它在同一台 Windows 电脑或 VPS 上的 MT5 终端之间复制持仓,并根据两家经纪商的合约规格(合约大小、跳价价值、账户货币)确定每个副本的交易量,因此即使两家经纪商对“手”的定义不同,副本也具有相同的敞口。同一主端持仓绝不会被开出第二个副本。
功能
在每个终端中,将同一个 EA 加载到一个图表上:
- 在主端终端中,将 Mode 输入参数设为 Master。
- 在每个接收端终端中,将 Mode 输入参数设为 Receiver。
主端将其未平仓持仓、这些持仓的交易品种规格以及心跳信号写入共享的 Common\Files 文件夹中的一个文件。每个接收端每 100 ms 读取一次该文件,并使自己的持仓与主端保持一致:
- 开立新持仓
- 修改止损和止盈
- 部分平仓
- 平仓
不涉及服务器、网络连接、DLL 或 WebRequest。
交易量跟随合约,而不是手数数字
各经纪商对“1 手”的定义不同。黄金每手可以是 100 oz、10 oz 或 1 oz。指数每点可以是 1, 10 或 25 个单位。美分账户显示的金额是 100 倍。只复制手数数字的复制器,可能多开或少开 100 倍。
本复制器测量两端每手的价值。它使用 OrderCalcProfit,即经纪商自身的盈利计算,以账户货币计。然后将主端的价值换算为接收端的账户货币。同时还会检查跳价价值,两者不一致时面板会显示警告。
一个主端持仓最多产生一个副本
接收端在磁盘上保存一个复制映射表,每个主端持仓一行:
- 每个副本都带有注释 SMC:<master position id>。
- 请求在发送之前就已写入映射表,因此交易过程中的崩溃或重启不会导致第二个副本。
- 重启后,以及您修改输入参数或图表周期后,接收端会重新加载映射表。在有未平仓副本时修改输入参数,已在对冲和净额接收端上实时测试:没有产生多余的成交。
- 如果对冲接收端的映射文件丢失,接收端会根据持仓注释重建映射表。
- 净额接收端无法重建丢失的映射表,因为一个净持仓无法拆分回各个主端持仓。它会改为将每个有未平仓副本的交易品种置于 NET_HOLD 状态(见下文“复制器何时停止或挂起”)。
当出现对不上的情况时,接收端会停止复制并发出警报。它从不猜测。例如:
- 两个接收端持仓带有相同的主端 id
- 某个复制的持仓注释中没有 id
- 主端账户发生变化
- 账户的预付款模式发生变化
- 映射文件损坏
- 净额账户的净交易量被手动更改
面板会显示已拦截的重复副本数量。
复制的持仓只按主端的指令平仓
主端会为其平掉的每个持仓发布一条平仓记录,该记录取自其成交历史。接收端只有在看到该记录时才会平掉副本。持仓也可能在没有记录的情况下从主端文件中消失,例如因为文件损坏或历史未加载。这种情况下,副本会被置于 HOLD 状态,并向您发出警报。副本不会被平仓。
出现以下任一情况时,接收端会暂停,您的持仓保持原样:
- 主端终端被停止
- 主端终端被强制结束
- 主端终端断开连接
- 主端文件停止更新(心跳超时,默认 3 s)
监控
状态面板位于接收端图表上。它显示:
- 主端状态(ALIVE / SILENT / NOT CONNECTED)
- 活动、已平仓、已拒绝、已挂起和已过滤的副本数量
- 主端与接收端的总敞口对比(以账户货币计),以及以 % 表示的差异
- 开仓、平仓、部分平仓、SL/TP 修改以及被拦截的重复副本的次数
- 最近一次操作、最近一次错误以及警告
- 每个复制的持仓一行,最多 10 行,之后显示一行“... N more”
每个操作也会写入 Common\Files\SpecMatchCopier 中的 CSV 日志。
复制器何时停止或挂起
复制器从不通过猜测来修复不一致。由您排除原因,然后重新启动它。
| 面板显示 | 含义 | 处理方法 |
|---|---|---|
| COPYING STOPPED | 接收端发现了无法解释的情况:一个主端 id 对应两个持仓、某持仓带有复制器的幻数却没有 id、主端账户或预付款模式发生变化,或映射文件损坏。原因显示在面板和日志中。在 EA 重新启动之前,不会复制任何内容。 | 排除消息中指出的原因,然后从图表上移除 EA 并重新加载。如果原因仍然存在,它会再次停止。 |
| COPYING STOPPED: master account changed | 该通道现在传输的是另一个主端账户。 | 如果是有意切换:移除 EA,手动平掉旧主端的副本,删除 Common\Files\SpecMatchCopier 中的 map_<login>_<magic>.txt(本接收端的登录账号和幻数),然后重新加载 EA。 |
| COPYING STOPPED: map file is damaged | 复制映射表未通过校验和检查。 | 对冲:删除映射文件并重新加载 EA,映射表会根据注释重建。净额:见 NET_HOLD。 |
| NET_HOLD(净额接收端) | 某交易品种的净交易量与复制器开立的交易量不同,例如在手动交易或映射表丢失之后。该交易品种将不再交易。挂起状态保存在映射表中,因此重启不会清除它。 | 移除 EA。手动平掉复制器的持仓。删除 map_<login>_<magic>.txt。重新加载 EA。之后它会复制在此之后开立的主端持仓。 |
| HOLD 出现在某一行 | 某个副本状态存疑。例如,某个主端持仓在没有平仓记录的情况下消失。或者某个交易请求未得到确认(例如因为连接中断),且 15 秒内没有出现持仓。如果该持仓之后出现,它会被关联到被挂起的那一行并发出警报,不会重复发送任何请求。被挂起的副本保持未平仓,即使主端已平掉其持仓。 | 由您手动平掉或保留该副本。复制器不会再处理被挂起的副本。 |
手数模式
| 模式 | 接收端交易量 | 考虑合约 |
|---|---|---|
| Same exposure(默认) | 主端交易量 x(1 手主端的价值 / 1 手接收端的价值)x 乘数 | 是 |
| Balance ratio | Same exposure 的交易量 x(接收端余额 / 主端余额) | 是 |
| Equity ratio | Same exposure 的交易量 x(接收端净值 / 主端净值) | 是 |
| Master lot x multiplier | 主端交易量 x 乘数。合约不同时会显示警告 | 否 |
| Fixed lot | 固定手数,适用于每个副本 | 否 |
在所有模式下,交易量随后都会:
- 按接收端的交易量步长取整(取最接近值或向下取整)
- 受可选的 Max lot 和经纪商最大交易量限制
- 低于经纪商最小交易量时,跳过或提高到最小交易量(由您选择)
- 发送前用 OrderCalcMargin 对照可用预付款进行检查
当一端一手的价值超过另一端一手价值的 1000 倍时,副本会被拒绝。此限制可以修改。这通常意味着交易品种映射错误。
计算示例:黄金,从每手 100 oz 到每手 1 oz
| 主端(经纪商 A) | 接收端(经纪商 B) | |
|---|---|---|
| 交易品种 | XAUUSD | XAUUSD.cs(自动匹配) |
| 合约大小 | 100 oz | 1 oz |
| 账户 | USD | USD |
| 黄金价格 | 4,178.13 | 4,178.13 |
| 1 手的价值 | 100 x 4,178.13 = 417,813 USD | 1 x 4,178.13 = 4,178.13 USD |
主端开立 0.10 手,即 10 oz,价值 41,781 USD。
- Same exposure:0.10 x 417,813 / 4,178.13 = 接收端 10.00 手,即 10 oz,价值 41,781 USD。只复制手数数字的复制器会开 0.10 手 = 0.1 oz,只有该敞口的百分之一。
- 美分接收端(账户货币 USC,1 oz 合约):经纪商报告 1 手为 417,813 USC,按美分系数换算后为 4,178.13 USD。接收端得到同样的 10.00 手。
- Balance ratio(主端余额 10,000 USD,接收端余额 1,000 USD):10.00 x 1,000 / 10,000 = 1.00 手。
以上数字就是随测试报告提供的单元测试。同样的计算也已实时运行:USD 账户上每手 5,000 oz 的 XAGUSD 被复制到 EUR 账户上每手 1,000 oz 的 XAGEUR。0.10 手变为 0.50 手。
交易品种匹配
接收端按以下顺序查找与主端交易品种对应的品种:
- 手动映射(XAUUSD=GOLD.x,US30=DJ30)。它始终优先,且从不回退到其他方式。
- 相同名称。
- Suffix / Prefix 提示(.cs, m, #)。
- 去除经纪商的修饰后相同的核心名称:XAUUSD.cs, XAUUSDm, #XAUUSD, EURUSD.pro, US500Cash, fxEURUSD 等。
- 内置别名:GOLD/XAUUSD, SILVER/XAGUSD, US30/DJ30/WS30, NAS100/US100/USTEC, US500/SPX500, GER40/DE40/DAX, UK100, JP225, USOIL/WTI, UKOIL/BRENT, BTCUSD, ETHUSD。
当两个接收端交易品种同样匹配时,使用在市场报价中的那一个。如果两个都在或都不在市场报价中,副本会被拒绝,面板会要求设置手动映射。例如,Exness 提供 US30m(每手 1 个指数单位)和 US30_x10m(每手 10 个单位)。两者都匹配主端的 US30,因此请将您想要的那个添加到市场报价中,或为其设置映射。无论哪种方式,手数都会被换算。
货币对后面的数字不被视为经纪商修饰。Exness 的 XAUUSD247m(周末也可交易的黄金)是另一种产品,因此主端的 XAUUSD 会被复制到 XAUUSDm,绝不会复制到 XAUUSD247m。如果您确实需要它,请手动映射。
在某个交易品种首次复制之前,接收端会以其账户货币比较两边的价格。差异超过 3% 时副本会被拒绝,该阈值可以修改。这可以发现诸如“GOLD”这样的映射:在某些经纪商那里,它是一只价值约 40 USD 的金矿股票,而不是黄金。
输入参数
| 输入参数 | 默认值 | 含义 |
|---|---|---|
| Mode of this terminal | Receiver | Master 发布;Receiver 复制 |
| Channel | 1 | 将主端与其接收端关联。电脑上的每个主端请使用不同的文本 |
| Cent account (this terminal) | Auto | Auto 将 USC/EUC 账户货币视为美分账户。如果您的经纪商使用其他代码,请设为 Yes/No |
| Master scan interval, ms | 200 | 除交易事件外,主端检查变化的频率 |
| Master heartbeat interval, ms | 500 | 没有变化时主端重写其文件的频率 |
| Lot mode | Same exposure | 见上文手数模式 |
| Fixed lot | 0.01 | 用于 Fixed lot 模式 |
| Multiplier | 1.0 | 适用于除 Fixed lot 外的所有模式 |
| Max lot of one copied position | 0(关闭) | 单个副本的上限 |
| Volume rounding | Nearest | 取最接近的交易量步长或向下取整 |
| Volume below the broker minimum | Skip | 跳过该副本,或使用最小交易量 |
| Refuse if one lot is worth more than x times the other | 1000 | 防止错误映射 |
| Manual symbol map | 空 | 以逗号分隔的 MASTER=RECEIVER 对 |
| Receiver symbol suffix hint | 空 | 例如 .cs |
| Receiver symbol prefix hint | 空 | 例如 # |
| Refuse a mapping if prices differ by more than, % | 3.0 | 0 表示关闭此检查 |
| Copy only these master symbols | 空(全部) | 以逗号分隔 |
| Never copy these master symbols | 空 | 以逗号分隔 |
| Copy only these master magic numbers | 空(全部) | 以逗号分隔 |
| Never copy these master magic numbers | 空 | 以逗号分隔 |
| Reverse copy | false | 买入变为卖出;止损和止盈互换位置 |
| Copy stop loss and take profit | true | |
| Copy positions already open at the first start | false | 默认只复制接收端启动后开立的持仓 |
| Skip if price moved more than, % since master entry | 0.10 | 防止暂停后的延迟复制。0 表示关闭 |
| Master heartbeat timeout, ms | 3000 | 主端文件超过该时长未更新时,复制暂停 |
| Hold if a master position vanishes without a close record, s | 30 | |
| Max slippage, points | 20 | 用于即时执行的交易品种 |
| Magic number of copied positions | 7310001 | 每个账户和幻数组合只能有一个接收端。同一账户上的第二个接收端请使用另一个幻数 |
| Expected master account | 0 | 0 表示接受最先检测到的主端。否则,当通道上出现其他账户时,复制会停止 |
| Show the status panel | true | |
| Panel X / Y offset, px | 12 / 24 | |
| Popup alerts / Push notifications | true / false | |
| CSV journal | true | Common\Files\SpecMatchCopier\journal_<account>_<magic>.csv |
设置步骤
- 将 EA 复制到两个终端中。它们必须在同一个 Windows 用户下运行,因为 Common\Files 属于该用户。主端和每个接收端终端请使用相同版本的 EA:更新后,请在所有终端中更新。
- 在主端终端中,以 Mode = Master 将 EA 加载到任意图表。
- 在每个接收端终端中,以 Mode = Receiver 和相同的 Channel 将 EA 加载到任意图表。
- 在接收端终端中启用“算法交易”。
- 在主端开一个小仓位。接收端面板会显示该副本及手数换算。
策略测试器
策略测试器中没有第二个终端。因此,在测试器中 EA 会运行一个模拟主端:
- 每隔几根 K线开立、修改、部分平仓和平仓虚拟持仓,每个持仓的交易量设定为触及止损时亏损约为余额的 1%,且占用的预付款最多为余额的 10%
- 虚拟持仓绝不会作为订单发送
- 它使用所选手数模式和全部交易前检查,将这些虚拟持仓复制到测试账户
这样无需第二个终端即可查看复制逻辑和手数换算。它不是交易策略,其测试结果不能说明任何盈利能力。
限制(购买前请阅读)
- 仅限同一台电脑:主端和接收端必须在同一台 Windows 电脑或 VPS 上、同一个 Windows 用户下运行。不支持通过互联网复制。
- MQL5 内置 VPS 无法运行它。每个迁移的终端都有自己独立的存储。
- 仅限 MT5 到 MT5。挂单不会被复制;挂单成交并成为持仓后才会被复制。
- 休市:当接收端交易品种处于其交易时段之外时,不会发送任何请求。复制器会等待交易时段开始,然后复制仍需复制的内容。新持仓仍受“Skip if price moved”限制约束。主端在接收端市场休市期间进行的平仓,会在该市场开市时以当时的价格执行。
- 速度:在模拟账户上测得,接收端持仓在主端交易后 0.2 至 1.1 s 内与主端一致(中位数 0.3 s,共 60 次测量;1.1 s 的那次是在净额账户上同时平掉 10 个持仓)。即 100 ms 的轮询加上经纪商的执行时间。副本按接收端自己的价格成交,因此可能与主端的价格不同,尤其是在新闻前后。
- 止损和止盈价位:
- 当两个交易品种以相同货币报价时,复制完全相同的价位。
- 否则(例如 XAGUSD 到 XAGEUR),价位按价格比例缩放。
- 在净额接收端上,只有当该交易品种上所有主端持仓使用相同价位时,才会复制 SL/TP。
- 接收端上您手动平仓或减仓的持仓不会再被处理。它们绝不会被重新开立。
- 接收端离线超过 48 小时:主端保留平仓记录 48 小时。如果副本对应的主端持仓在此之前已平仓,该副本不会被自动平仓。它会进入 HOLD 状态并发出警报,由您手动平仓。
- 开仓时止损/止盈价位被拒绝:当经纪商拒绝新副本的止损或止盈时(无效止损,例如新闻前后止损水平扩大),该副本被拒绝且不会重试。面板将其显示为 REFUSED。
- 被封顶的副本:当副本受 Max lot 或经纪商最大交易量限制时,主端的部分平仓只有在新的换算交易量低于当前持仓量时才会减少该副本。在此之前,副本保持在上限。
- 不含风险管理:复制器不限制回撤或每日亏损,也不管理账户。它复制主端所做的操作。
- 各处使用相同版本:主端和接收端使用相同的代码测量一手的价值。请在所有终端中运行相同版本的 EA。例如,v1.00 主端搭配 v1.01 接收端时,对股票 CFD 和其他每手价值较小的合约仍沿用 v1.00 的美分取整方式。
- 经纪商处资金不足:当经纪商因预付款原因拒绝新副本时,该副本被拒绝且不会重试。有些经纪商收取的预付款高于 MetaTrader 自身预付款计算所显示的数值;测试中使用的 Exness 模拟账户就是如此。
- 测试环境:
- 已使用 MetaQuotes-Demo 账户实时测试:USD 主端、EUR 对冲接收端、USD 净额接收端。
- 主端还在 USD 净额账户上进行了测试,包括加仓、由一笔成交完成的反转、部分平仓和全部平仓。
- 已在两家经纪商 MetaQuotes-Demo 和一个 Exness Standard 模拟账户(USD,对冲,交易品种带“m”后缀)之间双向实时测试:
- MetaQuotes-Demo 到 Exness,自动匹配:XAUUSD 到 XAUUSDm,XAGUSD 到 XAGUSDm,EURUSD 到 EURUSDm。测试内容包括带 SL/TP 开仓、修改 SL、部分平仓、接收端重启、修改输入参数和平仓。
- Exness 到 MetaQuotes-Demo EUR 账户,自动匹配:XAUUSDm 到 XAUUSD,XAGUSDm 到 XAGUSD,EURUSDm 到 EURUSD。测试内容包括开仓、修改 SL、部分平仓和平仓。股票 CFD BACm(每手 100 股)被复制到 BAC(每手 1 股):0.10 手变为 10 手。
- Exness 内部不同的合约大小,使用手动映射:US30m 到 US30_x10m(0.30 手变为 0.03 手),USTECm 到 USTEC_x100m 以及 US500m 到 US500_x100m(1.00 手变为 0.01 手),以及 BTCUSDm 到 BTCUSDTm。
- 每次运行:0 个重复副本,面板上的敞口差异为 0.00% 至 0.01%。错误映射被价格检查拒绝。有歧义的匹配在其中一个交易品种加入市场报价之前一直被拒绝。
- 1 oz 黄金和美分账户由使用合成经纪商规格的单元测试覆盖,而非实时账户。这两家经纪商的模拟账户都未提供它们。
- 在复制真实资金之前,请先用您的经纪商的模拟账户进行测试。
