如何使用 EA 遵照您的规则拷贝信号?·进阶篇
🔁

如何使用 EA 遵照您的规则拷贝信号?·进阶篇

(2/3)· 订阅者账户常因手数限制跟丢信号,这篇讲清拷贝机怎么在净仓与对冲账户里补位

新手友好 第 2/3 篇

很多订阅者以为信号服务会自动照单全收,实际遇到手数下限或本金负载上限时,一部分仓位根本不会被拷贝。更隐蔽的是,账户里若混有非信号开的仓,系统可能直接提示强平。先理清信号服务的边界,才谈得上用 EA 去扩量。

「拷贝机如何区分友方与敌方仓位」

信号拷贝机监视所有信号服务执行的成交,但只维护通过服务拷贝来的“友方”仓位。订阅者一侧成功开仓时,服务会把信号名称写进成交备注,并在魔幻数字字段写入独有标识符,例如 BUY 0.01 EURUSD 的备注里会出现 "#69801797"(成交号)、"Test3443431"(信号源名)、"361104976048745684"(魔幻数字标识符)。后续同步就靠这个魔幻数字认仓位。 认出来的就是友方,服务只会改它的成交量或平仓;没认出来的标成敌方,服务完全不碰。在“工具箱-历史”悬浮能看到备注,“交易”栏的当前持仓有相同描述但没单号,逻辑是一致的。 账户类型不同,魔幻数字替换策略完全反过来。净持仓账户里拷贝机加仓若不替换魔幻数字,仓位会变敌方——所以净持仓加仓必须替换;对冲账户里则必须用自己的魔幻数字替换,否则也会乱。 手工干预的代价很直接:订阅者在对冲账户自开一笔 BUY 0.01 EURUSD,同步时服务报“local positions do not correspond to signal provider”错误,这笔被定为敌方。等提供者平仓,友方被平,手工单留在终端里没人管。外汇和贵金属信号跟随本身高风险,人工插手更容易出不可预测结果。

MQL5 / C++
Signal  &class="macro">#x27;class="num">3447880&class="macro">#x27;: local positions do not correspond to signal provider [#class="num">85639429 buy class="num">0.04 EURUSD class="num">1.11697]

用成交落地事件避开误跟单

检测信号源成交出现的方式,直接决定拷贝延迟和额外成本:响应太慢会漏单,太敏感则可能在点差扩大时误开仓,产生不必要的滑点损耗。 MQL5 里我们已订阅信号,信号服务会监视提供者的交易事件并自动在订阅账户开平。账户任何仓位变动都会触发 OnTradeTransaction(),而不是老式的 OnTrade()。 关键区别在于,OnTradeTransaction() 携带交易事务类型。在所有枚举里,我们只盯 TRADE_TRANSACTION_DEAL_ADD —— 即成交被写入账户历史,意味着订单执行或财务操作已真正落地。 拷贝机等到这个事件才动手,就能避开“订单已发但还没成交”的中间态,只在订阅者账户确认成交成功后才处理后续逻辑,降低跟错单的概率。外汇和贵金属杠杆高,误跟一次就可能放大亏损。

◍ 账户持仓模式不对等就别白费订阅流量

MT5 信号订阅能不能成,先看供需双方的持仓结算模式是否同构。净持仓(hedging 关闭)和对冲(hedging 开启)是两套互不兼容的仓位认定逻辑,跨模式订阅会被终端直接拒绝。 具体只有两种组合能跑通:提供者净持仓 + 订阅者净持仓,或提供者对冲 + 订阅者对冲。其余交叉组合——净持仓带对冲、对冲带净持仓——都会在订阅握手阶段失败,不会进持仓同步。 下面这段终端日志是真实拒绝样例:11:15:07 发起订阅,34 毫秒后返回 subscription/renewal prohibited;11:39:54 再试一次,同样 54 毫秒内被禁。两次间隔约 24 分钟,说明不是临时锁,而是模式不匹配的硬拦截。 开 MT5 前先到自己账户设置的『交易』页确认对冲开关,再去看信号提供者的账户类型标注,能省掉这类无效订阅尝试。外汇与贵金属信号跟随本身带杠杆与滑点风险,模式错配只是第一道筛子。

MQL5 / C++
class="num">2016.05.class="num">11 class="num">11:class="num">15:class="num">07.086 Signal  &class="macro">#x27;*******&class="macro">#x27;: subscribe to signal [*****] started
class="num">2016.05.class="num">11 class="num">11:class="num">15:class="num">07.141 Signal  &class="macro">#x27;*******&class="macro">#x27;: subscription/renewal prohibited
class="num">2016.05.class="num">11 class="num">11:class="num">39:class="num">54.506 Signal  &class="macro">#x27;*******&class="macro">#x27;: subscribe to signal [******] started
class="num">2016.05.class="num">11 class="num">11:class="num">39:class="num">54.560 Signal  &class="macro">#x27;*******&class="macro">#x27;: subscription/renewal prohibited

「用结构体绑定信号源与跟单仓」

信号跟单最怕两边仓位对不上。一个稳妥的做法是在 EA 里声明一个 correlation 结构,把信号端开的仓位标识、成交量,以及拷贝机自己开的仓位标识和成交单号全部绑在一起,四个字段刚好覆盖一次跟单闭环。 所有写入动作只发生在 OnTradeTransaction 且事务类型为 TRADE_TRANSACTION_DEAL_ADD 时。此时函数会按 trans.deal 去反查成交,决定是新建关联还是补全已有记录。 对冲账户与净持仓账户的逻辑差异主要在平仓分支:对冲下若在 POSITION_IDENTIFIER_copier 找到 DEAL_POSITION_ID 就什么都不做;净持仓下则按结构里存的旧成交量重算新交易量再发单。外汇与贵金属杠杆高,跟单倍数系数设错可能瞬间放大风险敞口,参数务必先在模拟盘验证。 下表是结构元素在各场景的写入标记:✔ 表示该项作为结构元素被写入或保留,未标则表示保持初值 0。初始没匹配到成交时结构数组下标 +1 且四个元素全 0;匹配到服务开仓成交后 terminal 两字段与 deal_ticket 被填;匹配到拷贝机成交则补 copier 标识。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 终端的仓位聚合                                                |
class=class="str">"cmt">//| 以及拷贝机的仓位结构                                          |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="kw">struct correlation
  {
   class="type">long              POSITION_IDENTIFIER_terminal; class=class="str">"cmt">// 仓位识别符 (终端)
   class=class="str">"cmt">//+------------------------------------------------------------------+
   class=class="str">"cmt">//| 仓位标识符是在开新仓时分配的独有数字                              |
   class=class="str">"cmt">//| 且在持仓的完整生命周期内                                        |
   class=class="str">"cmt">//| 不可更改。                                                      |
   class=class="str">"cmt">//| 仓位翻转不会改变其标识符。                                      |
   class=class="str">"cmt">//+------------------------------------------------------------------+
   class="type">class="kw">double            POSITION_VOLUME_terminal;     class=class="str">"cmt">// 由信号服务开仓的成交量
   class="type">long              POSITION_IDENTIFIER_copier;   class=class="str">"cmt">// 仓位标识符 (拷贝机)
   class=class="str">"cmt">//+------------------------------------------------------------------+
   class=class="str">"cmt">//| 仓位标识符是在开新仓时分配的独有数字                              |
   class=class="str">"cmt">//| 且在持仓的完整生命周期内                                        |
   class=class="str">"cmt">//| 不可更改。                                                      |
   class=class="str">"cmt">//| 仓位翻转不会改变其标识符。                                      |
   class=class="str">"cmt">//+------------------------------------------------------------------+
   class="type">class="kw">ulong             DEAL_ticket;                  class=class="str">"cmt">// 成交单号, 如果成交已执行。
  };
class=class="str">"cmt">//+------------------------------------------------------------------+ 
class=class="str">"cmt">//| TradeTransaction 函数                                          | 
class=class="str">"cmt">//+------------------------------------------------------------------+ 
class="type">void OnTradeTransaction(class="kw">const MqlTradeTransaction &trans,
把跟单诊断交给小布盯盘
小布盯盘的 AIGC 已内置信号匹配与异常仓位检测,打开对应品种页即可看到哪些仓偏离了提供者策略。把重复劳动交给小布,你专注决策。

常见问题

净持仓账户中拷贝机增加已拷贝仓位的成交量,对冲账户中则按放大后的手数开新仓,两者都依赖 Deal multiply by 参数。
可以,小布盯盘的品种页会标记偏离信号策略的仓位并提示可能的漏拷,省去手动比对成交记录。
在 EA 中重写 OnTradeTransaction 回调,捕获交易事务类型与成交详情,即可在提供者平仓或开仓时触发本地拷贝逻辑。
当提供者最小手数较大、本金负载已接近上限或拷贝比率本身充足时,叠加放大只会增加外汇贵金属的高风险暴露,意义不大。
程序将每笔拷贝对应的原始信号成交与魔幻数字写入文件或全局变量,重启后依此判断哪些仓已存在、哪些需补拷贝。