前天晚上十一点多,EA在VPS上跑着欧美和黄金的网格,我人在外面用手机看行情,突然想起来该确认一下它到底还在不在正常挂单。登MT4手机端吧,图表加载慢得要命,而且账户多的时候切来切去特别烦。当时就想,要是EA能自己往Telegram发个消息报个平安就好了。回来折腾了一晚上,踩了几个坑总算跑通了,这里把过程整理一下。
先说整体思路,不复杂:MT4/MT5本身不能直接发HTTP请求,得靠两条路。一条是用EA里的 WebRequest() 直接调Telegram的Bot API,另一条是EA把状态写成文件,外面用Python脚本读文件再推送。我两种都试了,最后选的是第二种,原因后面讲。
先说要准备的东西:
第一种方案,EA里直接WebRequest。核心代码就一句:WebRequest(“https://api.telegram.org/bot”+token+“/sendMessage”, “GET”, headers, 0, post, result, headers)。坑来了:MT4/MT5默认是禁止EA发网络请求的,必须去 工具-选项-EA交易 里把 “允许WebRequest对下列URL” 勾上,并且把 https://api.telegram.org 加进白名单。我第一次没加,EA日志里一直报 4060 错误,查了半天才发现是这个。另外WebRequest是同步阻塞的,网络一慢EA主线程就卡住,对网格策略来说这个延迟很要命,尤其是黄金波动大的时候。所以这个方案我只用来做低频的心跳推送,比如每30分钟一次。
第二种方案是我现在在用的,EA侧只负责写状态文件。用 FileOpen() 以 FILE_WRITE|FILE_TXT 模式往 MQL4/Files 或者 MQL5/Files 目录写一行状态,比如“2024-06-12 23:10:05|EURUSD|orders=3|equity=10240|spread=12”。注意 FILE_COMMON 标志位,加上它文件会写到公共目录,Python那边好找,不加的话路径在沙盒里容易搞混,这是我第二个坑。写完记得 FileClose(),不然Python读到空文件。
Python这边用 requests 轮询文件,检测到内容变化或者超过设定间隔就推送到Telegram。关键点是 异常处理要写全,VPS断网、token失效、文件被占用都要捕获,不然脚本挂了你自己都不知道。我加了个简单的重试和本地日志,跑了一周还算稳。推送内容我做了个模板,把持仓方向、浮盈、点差都带上,比单纯一句“EA还活着”有用得多。
最后一个坑,时区。VPS一般是UTC,我本地是GMT+8,第一次推送时间对不上,还以为EA停了。统一在Python里转成北京时间再发,省得自己看晕。另外token别硬编码在EA里,放Python的配置文件或者环境变量,安全一点。
你们平时是怎么监控EA状态的?有没有更轻量的方案,比如直接走邮件或者webhook的,交流下 🙏
先说整体思路,不复杂:MT4/MT5本身不能直接发HTTP请求,得靠两条路。一条是用EA里的 WebRequest() 直接调Telegram的Bot API,另一条是EA把状态写成文件,外面用Python脚本读文件再推送。我两种都试了,最后选的是第二种,原因后面讲。
先说要准备的东西:
- 在Telegram里找 @BotFather 建一个bot,拿到 token
- 给自己的账号发条消息,然后调 getUpdates 拿到 chat_id
- VPS上确认能访问 api.telegram.org,有些机房网络有限制,这个必须先测
第一种方案,EA里直接WebRequest。核心代码就一句:WebRequest(“https://api.telegram.org/bot”+token+“/sendMessage”, “GET”, headers, 0, post, result, headers)。坑来了:MT4/MT5默认是禁止EA发网络请求的,必须去 工具-选项-EA交易 里把 “允许WebRequest对下列URL” 勾上,并且把 https://api.telegram.org 加进白名单。我第一次没加,EA日志里一直报 4060 错误,查了半天才发现是这个。另外WebRequest是同步阻塞的,网络一慢EA主线程就卡住,对网格策略来说这个延迟很要命,尤其是黄金波动大的时候。所以这个方案我只用来做低频的心跳推送,比如每30分钟一次。
第二种方案是我现在在用的,EA侧只负责写状态文件。用 FileOpen() 以 FILE_WRITE|FILE_TXT 模式往 MQL4/Files 或者 MQL5/Files 目录写一行状态,比如“2024-06-12 23:10:05|EURUSD|orders=3|equity=10240|spread=12”。注意 FILE_COMMON 标志位,加上它文件会写到公共目录,Python那边好找,不加的话路径在沙盒里容易搞混,这是我第二个坑。写完记得 FileClose(),不然Python读到空文件。
Python这边用 requests 轮询文件,检测到内容变化或者超过设定间隔就推送到Telegram。关键点是 异常处理要写全,VPS断网、token失效、文件被占用都要捕获,不然脚本挂了你自己都不知道。我加了个简单的重试和本地日志,跑了一周还算稳。推送内容我做了个模板,把持仓方向、浮盈、点差都带上,比单纯一句“EA还活着”有用得多。
最后一个坑,时区。VPS一般是UTC,我本地是GMT+8,第一次推送时间对不上,还以为EA停了。统一在Python里转成北京时间再发,省得自己看晕。另外token别硬编码在EA里,放Python的配置文件或者环境变量,安全一点。
你们平时是怎么监控EA状态的?有没有更轻量的方案,比如直接走邮件或者webhook的,交流下 🙏
