EA断线重连机制实现这几个细节很多人忽略

新帖
登录发帖
XM 推荐平台

覆盖品种全,新手友好,支持多种入金方式

CySEC(塞浦路斯) / ASIC(澳洲) / IFSC(伯利兹) · 最低入金 $5
qq877
qq877 楼主 2 小时前 浏览 35 回复 0 阅读 1 分钟
Lv.1 新手汇友 等级 Lv.1 主题 4 帖数 18 积分 1487 汇币 1140
1楼
你们有没有遇到过这种情况:EA在VPS上跑得好好的,突然一波行情过来,单子该平的没平,日志里一堆报错,回头一看是断线了,EA还傻乎乎以为自己连着服务器?我反正被坑过不止一次,最惨的一次是黄金晚上冲了一波,止盈挂在那没执行,早上起来利润回吐大半,从那以后我才认真去研究断线重连这块。
先说最原始的做法,就是完全不处理,靠MT4/MT5自己重连。优点是省事,代码里一行都不用写,平台断线后一般会自己尝试恢复。但坑也很明显:重连的这段时间里,EA的OnTick根本不触发,等于你的逻辑整个停摆,而且你没法知道它什么时候断的、断了多久。我那次黄金出事就是这种,等平台重连上,价格早跑没影了。所以这个方案只适合那种持仓周期特别长、对几秒延迟不敏感的策略,做欧美日内或者黄金短线的,别偷这个懒。
后来我改成在OnTick里加心跳检测,思路是自己记时间戳,如果超过设定间隔没有新的tick进来,就认为连接异常。这里有几个细节很多人忽略:不要用TimeCurrent()判断,那个是服务器时间,断线时它可能还在走;要用本地时间或者GetTickCount()。另外阈值别设太死,我一开始设30秒,结果周末收盘或者流动性差的时段频繁误判,后来改成品种相关的动态阈值,黄金这种活跃品种可以短一点,交叉盘就放宽些。这个方案的好处是实现简单、不依赖外部库,缺点是它只能“发现”问题,重连还得靠平台,EA自己没法主动拉起连接。
再进一步就是主动重连的方案,用MQL里的Socket或者调用外部脚本去探测服务器状态,断了就主动触发重连。我现在的做法是写一个独立的监控EA挂在另一个图表上,专门盯连接状态,主EA只管策略逻辑。两个EA之间用全局变量或者文件通信,主EA每次开仓前先读一下连接标志,不健康就跳过这次信号。这个方案稳定性最好,但复杂度也上来了,而且要注意全局变量在终端重启后会丢,得做持久化,我就在这上面栽过,重启VPS后监控EA没起来,主EA还在傻等标志位,白白空转了一晚上。
还有个容易忽略的点是重连之后的“状态同步”。断线期间可能已经有挂单成交或者止损被触发,重连回来第一件事应该是用OrderSelect或者PositionSelect把持仓和挂单全部重新核对一遍,而不是接着用断线前的缓存变量。我现在习惯在重连成功后的第一个tick里强制跑一次全量同步,把订单号、手数、开仓价重新拉一遍,宁可多花几毫秒也别用脏数据。这个细节论坛里汇友也提过,确实值得写进模板里。
最后说下VPS这块,断线很多时候不是平台的问题,是VPS网络抖动。我现在的习惯是选离经纪商服务器物理距离近的节点,然后自己写个简单的日志,把每次断线的时间点和持续时长记下来,跑一周就能看出是偶发还是规律性掉线。如果是规律性的,八成是VPS那边的问题,换节点比改代码管用。
你们平时是怎么处理断线这块的?有没有遇到过重连回来仓位对不上的情况,一起聊聊。🙂
0 回复 众裁0 复制
#1
💬
暂无回复,来抢沙发吧!
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 新手求助:交易返佣和点差优惠能叠加吗