LossFollowCopier.mq5 是一个 MT5 跟单 EA。它用于监控本地同账户内其他 EA 的持仓,在源单或源 EA 组合达到指定浮亏距离后,开同方向跟单,并支持源单平仓同步、篮子整体盈利平仓、单笔盈利平仓等逻辑。
风险提示:这是实盘交易工具,不是无风险套利。使用前必须先在模拟盘或小手数实盘验证参数、券商报价位数、滑点、止损止盈和源 EA 风控。
如果源 EA 通常一轮只开一单,适合使用普通三档模式:
ENTRY_MARKET_ON_TRIGGERENTRY_PENDING_AT_TRIGGER
每张源单可以独立设置最多 3 个浮亏跟单档位,例如:
- 档位 1:浮亏 2 美金跟 0.01 手
- 档位 2:浮亏 4 美金跟 0.02 手
- 档位 3:浮亏 6 美金跟 0.03 手
如果源 EA 会在浮亏后继续补仓,建议使用:
ENTRY_GRID_ACTIVATION
这个模式不再对每张源单单独跑三档,而是按:
源EA + 品种 + 方向
统计组合均价和组合浮亏。组合浮亏达到档位 1 的触发距离后,EA 进入激活状态:
- 激活瞬间补跟当前已有源单,数量由
GridInitialMaxCopies控制。 - 激活后,源 EA 后续新增源单会直接跟。
- 源 EA 组合全部平仓后,跟单仓位同步平仓并重置状态。
- 如果跟单篮子提前盈利平仓,且
GridStopAfterBasketClose = true,本轮停止继续跟单,直到源 EA 组合归零。
-
将
LossFollowCopier.mq5放入 MT5 数据目录:MQL5/Experts/ -
在 MetaEditor 中打开并编译。
-
在同一个 MT5 账户内:
- 一个图表挂源 EA。
- 另一个图表挂
LossFollowCopier。
-
按源 EA 的魔术号、注释或品种过滤配置监控条件。
新增两个文件:
RemoteLossFollowSender.mq5:挂在源账号终端,负责导出源账号持仓快照。RemoteLossFollowReceiver.mq5:挂在跟单账号终端,读取快照后执行同样的浮亏跟单逻辑。
当前远程版默认使用 MT5 的 FILE_COMMON 公共文件夹传输,适合:
- 同一台电脑上多个 MT5 终端。
- 同一台 VPS 上多个 MT5 终端。
- 本地账号跟同机其他账号。
使用步骤:
- 源账号终端编译并挂载
RemoteLossFollowSender.mq5。 - 跟单账号终端编译并挂载
RemoteLossFollowReceiver.mq5。 - 两边
InpChannelName必须一致,例如都填loss_follow_1。 - 接收端继续按源 EA 魔术号、注释、品种配置
源EA1/源EA2。
远程版的主要保护:
- 发送端写入源单稳定 ID、票号、品种、方向、手数、开仓价、SL/TP、魔术号和注释。
- 发送端默认
InpPauseWhenAutoTradingOff = true。源端自动交易关闭时,会暂停发布有效快照,接收端不会继续用旧文件开新跟单。 - 接收端跟单注释使用
RLFC:源ID:L档位,不和本地版LFC:混用。 InpSourceStaleSeconds用于快照过期保护。快照过期时,接收端不会新开单,也不会把“读不到快照”误判成源单平仓。- 接收端支持
InpSymbolMap品种映射,例如源账号是XAUUSD、跟单账号是XAUUSDm,填写XAUUSD=XAUUSDm。
限制:
- 这个版本不是跨机器/VPS 的网络同步。跨机器需要后续增加 WebRequest/HTTP 中转、FTP 或共享盘。
- 远程源单部分平仓后,按比例减少跟单手数仍是待办。
- 如果接收端日志出现
calculated copy volume is invalid,通常表示跟单账号没有对应交易品种,或品种后缀不同。先检查市场报价是否有该品种,再配置InpSymbolMap。
| 文件 | 传输方式 | 额外文件 | DLL imports | 加载顺序 | 默认周期 |
|---|---|---|---|---|---|
MemoryLossFollow.mq5 |
双缓冲命名共享内存 | RlfcMemoryBridge.dll |
两端开启 | 任意 | 20ms/20ms |
WinApiMemoryLossFollow.mq5 |
Windows API 命名共享内存 | 无额外 DLL | 两端开启 | 任意 | 20ms/20ms |
FileLossFollow.mq5 |
MT5 FILE_COMMON 文件快照 |
无 | 关闭即可 | 任意 | 50ms/50ms |
三个版本使用不同的默认 InpCopyMagic、订单注释和全局变量前缀,可以并行测试,
但同一跟单账号正式运行时应只选择一个版本,避免对同一源单重复跟单。
面板代码直接写在上面三个 .mq5 文件中,没有独立面板 EA,也没有额外
.mqh 依赖。EA 选择 Receiver 角色并初始化成功后,图表左上角默认显示深色面板;
Sender 角色不创建面板。
面板显示:
- 当前传输类型、通道、接收账户和服务器;
- 快照正常/等待/暂停或过期状态,以及快照延迟或年龄;
- 源单数量、快照 sequence;
- 跟单持仓、跟单挂单、总手数和浮动盈亏;
- 自动交易状态和当前是否暂停新开。
面板按钮:
暂停新开/恢复新开:只控制后续新开跟单,源单同步平仓、单笔盈利平仓和 篮子盈利平仓继续执行;暂停状态按账户、Magic 和通道保存在终端全局变量中。全部平仓:关闭当前 EA Magic/映射识别到的跟单持仓,并锁定当前源EA + 品种 + 方向轮次;源端该组完全清空后自动解锁下一轮。删除挂单:删除当前 EA 的跟单挂单,并自动暂停新开。- 平仓和删挂单使用 3 秒内二次点击确认,减少误触。
默认 InpStopRoundAfterAllCopiesClosed = true:
- 只手动平掉某一张跟单时,该源单的已跟标记保留,不会重复触发;同轮后续新增源单仍继续跟。
- 当某个
源EA + 品种 + 方向的跟单从有仓变为全部空仓,该组本轮锁定, 源端后续第 6、7 张等新单不再跟;源端该组全部平仓后自动清除锁定。 暂停新开仍是全局手动开关;它和“本轮锁定”是两套独立状态。
InpCopyDirection 用于限制 Receiver 新开跟单的方向,默认
COPY_DIRECTION_BOTH:
COPY_DIRECTION_BOTH:买单、卖单都跟;COPY_DIRECTION_BUY_ONLY:只跟买单;COPY_DIRECTION_SELL_ONLY:只跟卖单。
网格激活仍按 源EA + 品种 + 方向 分别计算组合均价和浮亏。买组达到浮亏阈值时
只处理买组,不会因此把当时正在盈利的卖组一起复制。
面板参数:InpShowPanel、InpPanelCorner、InpPanelX、InpPanelY、
InpPanelRefreshMs。正式实盘前先在模拟盘验证按钮、券商 filling mode 和成交回报。
追求同机双 MT5 更低延迟时使用:
MemoryLossFollow.mq5:同一个 EA,通过InpMemoryRole选择 Sender 或 Receivermemory-bridge/:Windows x64 共享内存 DLL 工程
内存版保留远程 Receiver 的源 EA 匹配、三档跟单、挂单、网格激活、
SL/TP、源单平仓同步、盈利平仓、品种映射和北京时间首单过滤逻辑,
只把 FILE_COMMON 快照替换为双缓冲共享内存。
数据通路:
源MT5 -> MemoryLossFollow(Sender) -> RlfcMemoryBridge.dll -> Local\\共享内存 -> MemoryLossFollow(Receiver) -> 跟单账号
共享内存保护包括:
- inactive slot 写入完成后再原子切换 active slot;
- sequence 前后保护,拒绝并发覆盖期间的不一致读取;
- CRC32 校验完整 payload;
- 同通道 writer mutex,避免多个发送端同时覆盖;
- Receiver 保留上一份完整快照,并在每个行情 tick 上继续判断浮亏触发。
安装:
- 在 Windows x64 + Visual Studio 2022 环境运行
memory-bridge/build.ps1。 - 把生成的
RlfcMemoryBridge.dll放进两个终端各自的MQL5/Libraries/。 - 两个终端都编译并挂载
MemoryLossFollow.mq5,勾选 Allow DLL imports。 - 源账号设置
InpMemoryRole=MEMORY_FOLLOW_SENDER,跟单账号设置为MEMORY_FOLLOW_RECEIVER。 - 两边保持相同的
InpChannelName和InpSharedMemoryCapacityKB。 - Sender/Receiver 任意顺序加载;建议周期分别使用
20ms/20ms,先在模拟盘测延迟日志和完整交易周期。
共享内存只适用于同一台 Windows 主机、同一登录会话中的多个 MT5 进程; 跨机器仍使用网络 API/WebSocket 方案。
WinApiMemoryLossFollow.mq5 是当前推荐的同机低延迟版本。它仍是一个 EA,
通过 InpMemoryRole 切换 Sender/Receiver,但直接导入 Windows 自带的
kernel32.dll,不再依赖、编译或复制 RlfcMemoryBridge.dll。
数据通路:
源MT5 -> WinApiMemoryLossFollow -> kernel32 命名共享内存 -> WinApiMemoryLossFollow -> 跟单账号
实现与保护:
CreateFileMappingW(INVALID_HANDLE_VALUE, ...)创建系统分页文件支持的命名共享内存;MapViewOfFile映射同名内存,两个 MT5 任意顺序启动,先启动的一端负责初始化;- Windows named mutex 串行化读写,避免读取写到一半的 payload;
- 通道名附加稳定哈希,避免名称清洗或截断后让不同通道误用同一 Windows 对象;
- 每个通道只允许一个 Sender;同一通道、接收账户和
InpCopyMagic只允许一个 Receiver, 避免重复挂载后重复跟单; - Sender 默认启用
InpSenderExcludeOwnCopies,不把本版本产生的跟单仓再次发布, 双向互跟时阻断 A→B→A 的循环复制; - header sequence + payload CRC32 校验,并在发送端重启时续接 sequence;
- Receiver 保留最后一份完整快照,并用 stale timeout 阻止旧快照继续开单;
- 毫秒定时器启动失败时终止初始化并释放 mapping、mutex 和角色占用锁;
- 只支持 Windows x64,同一 Windows 登录会话中的 MT5 进程。
安装:
- 把
WinApiMemoryLossFollow.mq5分别放进两个终端的MQL5/Experts/并编译。 - 两个终端挂载同一个 EA,并都勾选 Allow DLL imports;这里只加载 Windows
系统自带的
kernel32.dll,无需向MQL5/Libraries/复制任何 DLL。 - 源账号选择
MEMORY_FOLLOW_SENDER,跟单账号选择MEMORY_FOLLOW_RECEIVER。 - 两边的
InpChannelName和InpSharedMemoryCapacityKB必须一致。 - Sender/Receiver 没有加载顺序限制,默认轮询周期为
20ms/20ms。 - 面板的“暂停新开”不会删除已经存在的跟单挂单;需要阻止挂单后续成交时, 再点击“删除挂单”(该按钮也会自动保持暂停新开)。
双向互跟要使用两个独立通道:A 端 Sender 与 B 端 Receiver 使用 A_to_B,
B 端 Sender 与 A 端 Receiver 使用 B_to_A。每个 Receiver 的源 EA Magic 必须只匹配
对端策略 Magic,且和本端 InpCopyMagic 不同;保持 InpSenderExcludeOwnCopies=true。
WinApiMemoryLossFollow.mq4 是 MT4 对端源码,和 MT5 的
WinApiMemoryLossFollow.mq5 v1.34 使用同一套 Windows named mapping、mutex、64 字节 header、
sequence、CRC32 和 RLMC1 payload。文件扩展名按终端分别使用:
- MT4:编译并挂载
WinApiMemoryLossFollow.mq4; - MT5:编译并挂载
WinApiMemoryLossFollow.mq5; - Sender 与 Receiver 可以任意组合为 MT4→MT4、MT4→MT5 或 MT5→MT4;
- 两端保持相同的
InpChannelName、InpSharedMemoryCapacityKB; - 两端都开启 DLL imports,只调用系统
kernel32.dll,没有额外 DLL 文件; - MT4 的
InpCopyMagic范围为0..2147483647; - MT4 以订单 ticket 作为稳定源 ID,并用 20ms timer + tick 轮询交易变化;
- 源 EA 匹配、三档跟单、挂单、网格激活、SL/TP、同步平仓、盈利平仓、 北京时间首单过滤和 Receiver 面板与 MT5 版保持一致。
混合双向互跟仍使用 A_to_B、B_to_A 两个通道,每个终端各挂一个 Sender 和一个
Receiver 实例,并保持 InpSenderExcludeOwnCopies=true。共享内存范围仍是同一台
Windows 主机、同一登录会话。
仅 WinAPI Receiver 提供此按钮,3 秒内再次点击确认。它允许已经平掉的跟单 重新跟随仍在源端持有的旧源单,适合“本端全部平仓后重新开始一轮”。
- 使用前,本 EA 的持仓和挂单必须都为零,交易终端须已连接,源端快照须有效。 “全部平仓”不删除挂单;如有挂单,先用“删除挂单”清空。
- 清除当前接收实例的已跟标记、部分成交补单记录、网格/净总浮亏激活及停跟状态, 并重建空仓基线。MT5 还会清除首单比例模式的首单记录。
- 保留 EA 参数、持仓来源映射与手动暂停状态,不平仓、不删挂单。 “删除挂单”会暂停新开,因此更新完成后仍需按“恢复新开”才能开单。
- 更新后等待一个新的有效源端快照,再按原有模式、方向、阈值与时间过滤判断。 当前已经达到条件的旧单可能立即重新跟单;多档位也可能同时触发。
- 状态清理失败或中断时保持停开,重启 EA 后仍有效;排除原因后空仓再次点击更新。 “恢复新开”不能绕过这项停开保护。
- 更新范围是当前接收实例(账户、通道、Magic),包括它配置的 EA1/EA2; 多个接收实例应使用不同的跟单 Magic。
WinAPI 网格模式同时修正首次补跟上限:激活时先记录选中的最多 N 张旧源单,
未选中的旧单在后续扫描中继续跳过;选中单下单失败时重试该单,不扩大初始名单。
激活后新增的源单照常跟随;N=0 表示初始不限量。选择沿用现有快照的倒序遍历,
不额外保证按开仓时间排序。手动更新会清除该名单,下一次激活重新选取。
此修正仅适用于 ENTRY_GRID_ACTIVATION,不改变净总浮亏全跟或 MT5 首单比例模式。
源码修改后必须分别在 MT4/MT5 的 MetaEditor 重新编译;目录中原有
.ex4/.ex5 不代表已包含本次改动。建议在模拟盘验证空仓重跟、残仓/挂单拦截、
暂停保持、断线/过期快照、重启恢复,以及网格 N=1 时旧单限额和新单继续跟随。
FileLossFollow.mq5 是一个纯 MQL5 的统一 Sender/Receiver EA,使用 MT5
内置的 FILE_COMMON 公共目录交换快照:
- 源账号设置
InpFileRole=FILE_FOLLOW_SENDER; - 跟单账号设置
InpFileRole=FILE_FOLLOW_RECEIVER; - 两端只需保持
InpChannelName一致; - 不依赖 DLL,不需要勾选 DLL imports;
- Sender 或 Receiver 任意一端先加载都可以,Receiver 在快照出现前保持等待状态;
- 使用临时文件写入后原子替换、RLFC2 sequence、数量和结束标记校验,避免读取半截快照。
该版本保留与远程 Receiver 相同的源 EA 匹配、三档跟单、挂单、网格激活、
SL/TP、同步平仓、盈利平仓、品种映射和北京时间首单过滤逻辑。默认文件
轮询为 50ms/50ms,部署最简单;追求更低传输延迟时再使用上面的共享内存版。
Enabled:是否启用该源 EA 配置。Magic:源 EA 魔术号,-1表示不限制魔术号。CommentFilter:源单注释模糊匹配,空表示不限制。AllowedSymbols:允许品种,多个品种用;或,分隔,空表示全部。
EA 当前支持 源EA1 和 源EA2 两套独立配置。
持续轮询源单。当单张源单浮亏达到当前档位设置时,市价开同方向跟单。
适合:一轮只开一单或很少补仓的 EA。
源单出现后,提前在浮亏触发价挂同方向限价单。
如果检测时价格已经越过触发价,则直接市价入场。
适合:希望提前挂单、减少轮询延迟的场景。
单向网格激活模式。按 源EA + 品种 + 方向 分别计算组合均价和浮亏,
达到档位 1 触发距离后激活:
- 激活前不跟单。
- 激活时最多补跟
GridInitialMaxCopies张已有源单。 - 激活后新增源单直接跟。
- 档位 2/3 在该模式下不参与。
适合:网格、补仓、马丁、小止盈大止损类 EA。
净总浮亏激活模式。按 源EA + 品种 合并参数允许的买卖方向,以接收端当前报价、
源单开仓价和源单手数估算净浮盈亏:
净总浮亏 = max(0, -(全部允许方向浮盈亏之和))
InpEA1TotalLossMoney/InpEA2TotalLossMoney是触发金额,单位为接收账户货币;- 达到阈值后,一次复制当前全部允许方向源单,不受
GridInitialMaxCopies限制; - 激活后,本轮后续新增的允许方向源单直接继续复制;
- 源端该
源EA + 品种的允许方向仓位全部清空后,状态重置,下一轮重新等待阈值; InpCopyDirection = COPY_DIRECTION_BOTH时买卖一起参与净值计算并一起复制; 只跟买或只跟卖时,仅对应方向参与计算和复制;0表示源组合出现后立即全跟。
例如买单合计浮亏 120、卖单浮盈 30,则净总浮亏为 90;阈值设为 80 时, 当前买卖源单全部复制,后续第 6、7 张源单继续直接复制。
同机且两端账户货币、合约规格一致时金额最接近源端实际浮盈亏;账户货币或品种 合约规格不同时,应先在模拟盘对照面板/日志校准触发金额。
浮亏触发值现在允许设置为 0:
- 市价触发模式:源单进入快照后立即市价跟单;
- 提前挂单模式:
0直接转为市价跟单,不在源开仓价创建挂单; - 网格激活模式:源组合出现后立即激活;
- 负数仍作为参数错误处理。
价格距离模式。适合黄金。
示例:
- XAUUSD 多单 4000 开仓
- 设置
LossPrice = 5.0 - 价格下跌到 3995 附近触发
券商点数模式。
示例:
- 黄金 2 位报价:
300点约等于3.00 - 黄金 3 位报价:
3000点约等于3.000
如果主要交易黄金,优先使用 LOSS_TRIGGER_PRICE。
COPY_LOT_FIXED:固定手数。COPY_LOT_SOURCE:跟随源单手数。COPY_LOT_MULTIPLIER:源单手数乘以倍数。
普通三档模式下,每个档位都有自己的手数配置。
网格激活模式下,使用档位 1 的手数配置。
CopySourceSLTP = true:开仓时复制源单 SL/TP。CopySourceSLTP = false:使用各档位自定义 SL/TP。
普通三档模式下,档位 1/2/3 可以分别设置自定义止损止盈点数。
网格激活模式下,使用档位 1 的自定义 SL/TP。
0 表示不设置。
CloseCopyWithSource = true
源单消失后,跟单仓位会尝试市价平仓。挂单也会在源单消失后删除。
EA 会用 LFC:源单票号:L档位 注释和本地全局变量记录跟单仓映射,降低手动部分平仓后漏平的概率。
MinuteProfitCloseEnabled = true
单个跟单仓位盈利达到指定点数后平仓。
该功能更适合普通单源单模式。网格/补仓模式通常不建议开启单笔盈利平仓,否则低位关键仓位可能提前跑掉。
BasketProfitCloseEnabled = true
按同一个源 EA、同品种、同方向统计跟单仓位加权平均成本。整体盈利达到指定点数后,整篮子平仓。
该功能适合网格/补仓模式。
PROFIT_CHECK_ANYTIME:随时检查,默认推荐。PROFIT_CHECK_TIME_WINDOW:只在指定秒数窗口检查。
保守配置:
EntryMode = ENTRY_GRID_ACTIVATIONLossMode = LOSS_TRIGGER_PRICELossPrice = 1.0 ~ 5.0GridInitialMaxCopies = 1GridStopAfterBasketClose = trueBasketProfitCloseEnabled = true- 关闭单笔盈利平仓
更贴近源 EA 组合结构:
GridInitialMaxCopies = 0
这表示激活瞬间补跟所有已有源单。风险更高,但更接近源 EA 的解套结构。
- 源单部分平仓后,按比例同步减少跟单剩余手数仍是待办。
- 如果旧跟单仓在新版 EA 运行前已经同时丢失
LFC注释和本地映射,EA 无法判断它原本对应哪个源单。 - EA 设计目标是对冲账户。净值账户可能出现源单和跟单合并的问题。
- 本仓库只保存源码,不保存
.ex5编译文件。
- 先用模拟盘验证一整轮源 EA 开仓、补仓、止盈、止损流程。
- 不要让跟单 EA 的风险控制替代源 EA 风控。
- 网格模式下,源 EA 自身必须限制最大订单数、最大浮亏或止损。
- 每次更新源码后,重新在 MetaEditor 编译,再替换到 MT5。