|
1.1 是什么 秒跟单是一套基于 Windows 命名共享内存的多账户实时跟单系统。 每个账户终端只需挂同一个 EA(MT4 用 MiaoCopy.mq4,MT5 用 MiaoCopy.mq5), 该 EA 同时具备两种能力,可用开关分别启用: - 发射端:把本账户的持仓写入共享内存,供其它账户跟随;
- 接收端:订阅其它账户的槽位,自动复刻其开仓 / 平仓 / 改单。
两者都开即为互跟(A 跟 B、B 跟 A 同时成立)。 1.2 核心特点特点 说明
零磁盘 IO数据走内存映射,不落盘
低延迟MT5 毫秒级轮询(默认 100ms);MT4 秒级 + tick 驱动
无需外部 DLL纯 MQL 直接 #import kernel32.dll,免编译
MT4 / MT5 互通两者共用同一内存协议,可任意组合(如 MT5 发 → MT4 收)
防循环跟单仓带独立 Magic,发射端不发布,互跟不会套娃
抗撕裂槽头 seqlock 序号 + 每条信号 checksum
可配置订阅每个账户独立指定跟随谁、各自倍数与限额
到期限制可设置到期日,过期自动失效1.3 架构示意账户#1 终端 账户#2 终端┌────────────────────┐ ┌────────────────────┐│ MiaoCopy (MT4/MT5) │ │ MiaoCopy (MT4/MT5) ││ 发射端: 开 编号=1 │ │ 发射端: 开 编号=2 ││ 接收端: 开 订阅2 │ │ 接收端: 开 订阅1 │└─────────┬──────────┘ └─────────┬──────────┘ │ 写槽位0 │ 写槽位1 └───────────────┬──────────────────┘ ▼ ┌──────────────────────────────────────────┐ │ 共享内存 Local\MiaoDan │ │ [Header 64B] + [16 槽位 × 128064B] │ │ 槽0(编号1) 槽1(编号2) 槽2(编号3) ... │ └──────────────────────────────────────────┘ ▲ 每个终端读取「自己订阅的账户」所在槽位并跟随2.1 前提条件- MT4 / MT5 终端 → 工具 → 选项 → EA交易 → 允许DLL导入 必须勾选(否则无法创建共享内存);
- 所有终端运行在同一台 Windows 电脑、同一用户会话(共享内存用 Local\ 命名空间);
- 每个启用了发射端的终端,InpMyId 必须唯一(1–16)。
2.2 部署步骤- 把 MiaoCopy.mq5 复制到 MT5 的 MQL5/Experts/,MiaoCopy.mq4 复制到 MT4 的 MQL4/Experts/;
- 用 MetaEditor 打开并编译(生成 .ex5 / .ex4);
- 在终端「导航器」里把 MiaoCopy 拖到图表上;
- 按下方参数说明配置,勾选「允许实时交易」;
- 图表右上角出现笑脸即运行正常。
三、参数介绍
参数在 EA 面板中分为三大块:整体参数、发射端参数、接收端参数。 3.1 整体参数(1. 整体参数)参数 默认值 说明
InpHubNameMiaoDan共享内存名。所有终端必须一致。只需填名字,代码自动补 Local\ 前缀(实际对象为 Local\MiaoDan)。若手动填了带 \ 的名字(如 Global\xxx)则原样使用。
InpCopyMagic77777跟单仓 Magic。接收端复制开仓时用它给订单打标;发射端发布持仓时跳过它。详见 3.4。
InpTimerMs100轮询间隔(毫秒)。MT5/MT4 均使用毫秒定时器;越小越及时,但 CPU 占用越高。MT4 实际触发精度受平台限制(通常几十毫秒级)。
InpLogEnabledtrue是否输出日志到「EA交易」页签。到期日不在参数面板中显示:它是代码固定值 #define EXPIRE_DATE D'2027.01.01'。到期日当天仍可用,次日起失效;失效后启动即 INIT_FAILED,运行中则停止发布/跟单(判定取服务器时间与本地时间中较晚者)。 3.2 发射端参数(2. 发射端参数)参数 默认值 说明
InpEnableMastertrue是否启用发射端(发布本账户持仓)。
InpMyId1本账户编号,范围 1–16,每个发射端唯一。它决定使用哪个槽位(槽位 = 编号 − 1)。若编号与别的终端重复,启动时会打印「编号已被账号 X 占用」告警。
InpClearSlottrue启动时清除本槽位旧数据,避免读到上次残留。
InpFilterMagic0只发布此 Magic 的持仓;0 = 发布全部(跟单仓除外)。一个终端跑多套策略、只想被跟其中一套时才设置。
InpHeartbeatSec2心跳发布间隔(秒)。即使持仓没变化,发射端也至少每隔这么久刷新一次,供接收端判断源是否存活。3.3 接收端参数(3. 接收端参数)3.3.1 订阅与手数参数 默认值 说明
InpEnableSlavetrue是否启用接收端(跟随其它账户)。
InpFollowIds""要跟随的账户编号列表,逗号分隔,如 "2,3"。留空则不跟随任何人。
InpLotMults1.0对应订阅的手数倍数,如 "1.0,2.0"。
InpLotMaxs100.0对应订阅的单笔最大手数。
InpLotMins0.01对应订阅的单笔最小手数。以上三个手数参数按 InpFollowIds 的顺序一一对应;数量不足时用列表最后一项补齐。 手数处理链:源手数 → 按品种步长取整 → ×倍数 → 夹到[最小,最大] → 夹到品种限额。 3.3.2 跟单执行参数 默认值 说明
InpCopySLTPtrue是否复制止损/止盈。
InpCopyClosetrue是否跟随平仓。
InpCopyModifytrue是否跟随修改 SL/TP。
InpCopyVolumefalse是否跟随加减仓(部分平仓等)。开启时以「平掉后按新手数重开」实现。
InpSlippage50允许滑点(点)。
InpFillORDER_FILLING_FOK订单填充方式(仅 MT5)。若下单报「无效填充」可改为 ORDER_FILLING_IOC 或 ORDER_FILLING_RETURN。
InpSkipHistorytrue跳过连接前的历史持仓:只跟随连接之后的新开仓,不追补已有仓位。3.3.3 品种映射参数 默认值 说明
InpMasterSuffix""源端品种后缀,接收时自动去除(如源端是 XAUUSD.demo,填 .demo)。
InpSymbolSuffix""本端品种后缀,接收时自动追加(如本端是 XAUUSD.m,填 .m)。
InpSymbolMapping""精确映射(优先级最高),逗号分隔,如 XAUUSD.demo=XAUUSD.m,AUDUSD.demo=AUDUSD.m。映射优先级:精确映射 > 去源后缀 + 加本端后缀。 3.3.4 风控参数 默认值 说明
InpMaxPositions0本终端最大持仓数,0 = 不限。
InpOnlySameDirfalse仅同向跟单:已有多单时不再跟空单,反之亦然。
InpCloseOnMasterLostfalse源失联(心跳超时)时,平掉该源对应的全部跟单仓。
InpMasterTimeoutSec15失联判定秒数,配合上一项使用。3.4 关于 InpCopyMagic 与 Magic NumberMagic Number 是 MT4/MT5 给订单附加的整数标记,用来区分"哪套策略下的单"(手动下单通常为 0)。 InpCopyMagic 在本系统中身兼两职: - 接收端复制开仓时,把订单 Magic 设为该值 → 所有跟单仓都带同一标记;
- 发射端发布持仓时,跳过 Magic 等于该值的仓位 → 跟单仓不会被再次广播。
因此互跟不会死循环: A 自有策略开仓 magic=0 │ A 发射端发布(0 ≠ 77777, 发布) ▼B 接收端复制开仓 magic=77777 │ B 发射端发布时跳过 77777 ▼ 终止 ✕取值注意事项: - 不能填 0:0 是手动单/多数 EA 的默认值,若用它,发射端会把所有原生单都当成跟单仓过滤掉。
- 不要与自有策略 EA 的 Magic 相同:否则那套策略的单不会被发布。
- 建议所有终端使用同一个值(默认 77777),便于排查;范围 32 位整数。
- 与 InpFilterMagic 的区别:InpCopyMagic 是"排除名单",InpFilterMagic 是"白名单"。
七、常见问题Q: 一个终端能同时当发射端和接收端吗? 可以,这是互跟的标准用法。接收端复制出的仓位带 InpCopyMagic,发射端不会发布它,所以不会循环。 Q: 两个终端能用同一个 InpMyId 吗? 不能。每个启用了发射端的终端编号必须唯一,否则会互相覆盖槽位;启动时会打印占用告警。 Q: 只想被跟 / 只想跟单怎么配? 只想被跟:InpEnableMaster=true、InpEnableSlave=false。 只想跟单:InpEnableMaster=false、InpEnableSlave=true 且设好 InpFollowIds。 Q: MT4 跟单延迟为什么比 MT5 大? 两者都用毫秒定时器(默认 100ms)。但 MT4 是单线程事件模型,OnTimer/OnTick 在同一线程排队,实际触发精度通常为几十毫秒级且不如 MT5 稳定;同时 MT4 价格依赖 tick 更新(代码已调用 RefreshRates()),所以实际延迟 ≈ max(定时器周期, tick 间隔)。 Q: 品种名不一致怎么办? 配置 InpMasterSuffix(去后缀)/ InpSymbolSuffix(加后缀),或用 InpSymbolMapping 精确映射。 Q: 最多支持多少账户 / 多少持仓? 最多 16 个账户(槽位);每个发射端最多发布 1000 笔持仓(HUB_MAX_POS)。 Q: 内存名前面的 Local\ 去哪了? 参数里只需填 MiaoDan,代码会自动补成 Local\MiaoDan。若手动填了带 \ 的名字(如 Global\xxx),则原样使用(Global\ 需管理员权限)。 Q: 支持跨机器吗? 当前用 Local\ 命名空间,仅限本机同一会话。跨机器需改为网络通信方案。 Q: 到期日(授权)怎么算? 到期日是代码固定值 #define EXPIRE_DATE D'2027.01.01',不出现在 EA 参数面板中,无法修改。到期日当天仍可用,次日 00:00 起失效。启动/挂载时已过期会直接 INIT_FAILED;运行中跨过到期时刻则停止发布/跟单并打印一次告警。判定取「服务器时间与本地时间中较晚者」。 Q: 下单报「无效填充」(Invalid fill)? MT5 的 InpFill 与品种支持的填充模式不匹配。改成 ORDER_FILLING_IOC 或 ORDER_FILLING_RETURN 再试。 Q: 启动报「协议不匹配」? 说明该共享内存是旧版本创建的。关闭所有终端(内存自动释放)后重启,或换一个 InpHubName。 |