首页 / 交易学院 / MT5 到 MT4 交易复制器:净持仓模型的桥接方案
MT5 到 MT4 交易复制器:净持仓模型的桥接方案
🔗

MT5 到 MT4 交易复制器:净持仓模型的桥接方案

跨平台 难度 · 高阶 2013 14 分钟阅读
交易复制MT4MT5

为什么需要 MT5→MT4 复制器

很多交易者看好 MT5 的功能,但实盘账户还在 MT4 上。复制器的思路是:用 MT4 作为 MT5 交易的“执行载体”,把 MT5 上的持仓同步复制到 MT4。文章先厘清一个关键结论:利润只来自“报价 × 交易量”,报价由经纪商决定改不了,交易者能控制的只有交易量——所以复制的核心是“同步持仓的交易量”,而非逐笔复制每笔订单。

净持仓模型 vs 对冲模型

MT5 用净持仓(一个品种一个仓位),MT4 用对冲(同品种可多笔独立订单)。差异在于“平哪个订单不重要,重要的是该位置的平仓量一致”——文章用例子证明:同量订单以不同顺序平仓,单笔利润不同,但整段总利润相同。因此复制器只需保证 MT4 上的净持仓量等于 MT5 的净持仓量,不必还原 MT5 的订单结构。

架构:源端监听 + 共享文件传信号

MT5 端 EA 用 OnTimer 每秒扫描所有品种持仓,比较现值与前值,有变化就把“品种、持仓方向、交易量、SL/TP”写成共享文件(放在 MT5 的 MQL5\Files\ 下,且把 MT4 装到该目录里,使两边都读得到)。MT4 端脚本循环读文件、解析、对比虚拟头寸,再决定开/平/改。

差额下单:虚拟头寸比较

复制的核心是“差额下单”——比较文件里的目标持仓与实际虚拟持仓,只对差额部分操作。把方向转成 -1/+1,比较 TF·VF 与 TR·VR:不一致就平仓或开仓补齐差额:

int TF = SymPosType[i]*2-1;   // 文件中的方向
int TR = realSymPosType[i]*2-1; // 实际方向
double VF = SymPosVol[i], VR = realSymPosVol[i];
if(NormalizeDouble(VF*TF,8) != NormalizeDouble(VR*TR,8))
  {
   if((VR!=0 && TF!=TR) || (TF==TR && VF<VR)) // 方向变 或 实际更多
      { double lot = (TF==TR)? (VR-VF) : VR; close_market_order(Symbols[i], lot); }
   else // 实际更少 -> 开仓补齐
      { double lot = (TF==TR)? (VF-VR) : VF; open_market_order(Symbols[i], SymPosType[i], lot); }
  }

坑与注意

⚠ 复制器天生有损耗
1) 报价差异:信号实时复制,MT4 经纪商此刻报价可能不同,对剥头皮策略是致命伤,文章明确说 scalp 类策略不适用。2) 时间延迟:MT5 平仓到 MT4 复制之间必有延时。3) 滑点/部分成交:MT4 端下单可能部分成交,需用 Closes() 检查 lot 不超实际单量。4) 最小手数/币种差异:两账户手数下限、币种不同要处理。5) 止损重触发的死循环:MT4 先触发 SL 又立刻重建会被反复开平,文章改为“MT4 平仓后等文件状态变化才重建”。6) 周末未做检查。

完整复制流程(一句话串起来)

MT5 端 OnTimer 每秒扫持仓→compare_positions 比对→有变化写共享文件 cnt_command++;MT4 端循环读文件→parser 解析成数组→虚拟头寸比较→processing_signals 算差额→开/平/改→processing_sl_tp_levels 同步止损止盈。两个 processing_* 函数都是“带 IsStopped 退出的无限循环”,且只在交易流空闲(Busy_and_Connected)时才发指令,避免服务器拒单。

更多实战坑

⚠ 上线前必看
1) 品种映射:MT5 传来的品种经纪商可能不存在于 MT4,应告警而非禁止。2) 手数缩放:两账户最小手数/合约大小不同,差额下单前要做 MathMin/缩放。3) SL/TP 时序:很多经纪商不允许开仓同时设 SL/TP,要开仓后再 modification_sl_tp_levels 补设。4) 去重:用 magic 号或评论识别来源,避免同一信号重复复制。5) 周末:原文未检查,实盘建议加时间过滤避免无用重报价。

常见问题

文章用例子证明:同量订单以不同顺序平仓,单笔利润不同但总利润相同。MT5 是净持仓、MT4 是对冲,订单结构本就不同。只要保证 MT4 净持仓量 == MT5 净持仓量,最终盈亏一致,没必要还原订单细节。这大幅简化了复制逻辑。
复制依赖“实时读 MT5 持仓→写文件→MT4 读取下单”,这条链路有固有延时,且 MT4 经纪商报价与 MT5 可能差好几点。剥头皮靠极薄利润和极快成交,延时和报价差会直接吃掉利润甚至反亏,所以文章说 scalp 类不适用。
文章用共享文件(MT5 的 MQL5\Files\ 下、MT4 装在同级目录),只有持仓变化时才写,频率低、不伤硬盘,且不用 DLL。也可以走 socket/DLL,但作者原则是“除非别无选择否则不用 DLL”。共享文件是最简单的非 DLL 方案。