冷清0.1

从入门到放弃再到搞定:EA断线重连机制实现

Exness 推荐平台

入金门槛低,出金到账快,支持多种账户类型

FSA(塞舌尔)/FCA(英国) / CySEC(塞浦路斯) · 最低入金 $130
阿杰仔
阿杰仔 楼主
半小时前 1 0 1分钟 Lv.3 资深汇友 Lv.3 主题1 帖数2 积分2080 汇币1817
1楼
干这行的都懂,EA跑着跑着突然掉线,单子悬在半空,VPS上日志刷了一屏Error,心里那叫一个凉。尤其是跑欧美这种点差小的品种,网络抖动一下,持仓状态跟服务器对不上,轻则错过止损,重则重复开单,账户直接给你表演个花式爆仓。今天不扯虚的,把我从被断线折磨到彻底搞定重连机制的过程掰开揉碎讲一遍,新手照着抄作业就行。
先说最蠢的坑。我最早写重连,就是OnTick里判断一下IsConnected,false就Sleep(5000)再重新初始化。听起来没毛病对吧?实际跑起来,MT5的Sleep在EA里是阻塞的,行情一来,Tick队列全堵住,重连期间价格早飞了。而且MT5的IsConnected只检测终端跟服务器的连接,不检测你EA内部状态是否一致,比如你挂了个挂单,断线期间被成交了,重连后你根本不知道,还在那儿傻等。这跟裸奔没区别。
正确的思路是三层检测,缺一不可。第一层,终端连接状态,用IsConnected或者OnDisconnect事件。第二层,订单状态同步,启动时全量扫描历史订单和持仓,跟本地变量比对。第三层,心跳超时,自己维护一个lastTickTime,超过N秒没收到Tick就认为连接假死。我当时就是漏了第二层,结果断线重连后,EA以为空仓,实际持仓两笔欧美多单,直接双倍敞口,那晚差点没把我送走。
具体实现我贴个核心逻辑,你们感受下。用OnTimer做心跳检查,周期设1秒,别用Sleep。

  • OnInit里设置EventSetTimer(1),并执行一次全量订单同步函数SyncOrders()。
  • OnTimer里检查GetTickCount() - lastTickTime > 3000,超过3秒没Tick,先尝试重连。
  • 重连动作不是重新初始化EA,而是调用RefreshRates()强制刷新报价流,然后检查TradeAccountInfo的连接状态。
  • 如果RefreshRates返回false,再调用IsConnected(),还不行就执行二次同步,重新请求服务器上的订单列表。
  • 最后一步,把重连日志写到文件,记录时间、持仓数量、浮动盈亏,方便复盘。

这里有个细节,很多人不知道。MT5的OnDisconnect事件触发后,终端会自动尝试重连,但EA的全局变量不会重置。所以你要做的不是去管终端,而是确保你的EA在OnDisconnect里把所有pending订单的状态标记为unknown,等连接恢复后,用订单历史去反推。我当时踩的坑就是,OnDisconnect里直接清空了所有状态,结果重连后订单还在,状态没了,导致EA逻辑错乱,后来改成标记unknown,等同步完再更新,才算彻底稳了。
再一个坑是关于VPS的。我一开始把EA挂在本地电脑上,公司网络一到下午就抽风,后来咬牙上了VPS。但VPS也有坑,尤其是用MT5自带的虚拟专用服务器,有些时候终端显示已连接,但实际网络路由已经断了,Tick流就是不来。我现在的方案是,在EA里额外加一个网络探活,每30秒向MT5服务器发送一个ping请求(用WebRequest也行),如果连续3次没有响应,直接触发重启终端。这个比单纯依赖MT5内部状态可靠得多。顺便说一句,WebRequest记得在工具-选项-EA交易里把URL加白名单,不然直接报错,别问我怎么知道的。
最后说下我现在的完整流程,跑欧美1.5倍杠杆的EA,已经连续两个月没出过断线事故。核心就是:心跳检测 + 状态同步 + 日志追踪。心跳断了先轻量重连,不行就全量同步,再不行就重启终端。每一步都有日志,哪天出问题,翻日志一眼就能定位是网络问题还是EA逻辑问题。新手最容易忽略的是同步那一步,总觉得连上了就万事大吉,其实连上和状态一致是两码事
对了,还有个细节,重连后一定要用OrderSelect重新拉取每笔订单的开仓价、止损、止盈,不要用本地缓存的。因为断线期间可能触发了平台的滑点保护,价格跟你本地记录的不一样。我见过有人重连后按旧价格改止损,结果直接改到爆仓价,那叫一个酸爽。
就说到这儿吧,这套逻辑框架不复杂,但细节真能磨死人。你们在实盘里跑EA,有没有遇到过断线后重复开单或者状态错乱的情况?用的什么方案解决的?评论区聊聊,我看看有没有比我这个更骚的操作。
0 回复 复制 众裁0
#1
💬
暂无回复,来抢沙发吧!
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。汇友之家合作的各家经纪商均为持有正规外汇牌照的经纪商,我们不参与经纪商的任何经营活动。经纪商在经营过程中可能出现破产清算、资不抵债、跑路或躲避责任等情况,这些问题汇友之家无法控制,亦不承诺任何经纪商资金的绝对安全。请知悉!
← 上一帖 VPS续费迁移与数据备份,我踩过的坑和解决方案