饭桌上收到的那条消息
周五晚上,你正在和朋友吃火锅。手机震了一下。你低头一看,Telegram弹出一条消息:
"EURUSD BUY 0.5 Lot @ 1.0847 | SL: 1.0817 | TP: 1.0907 | 时间: 21:35:02"
你的EA刚刚在VPS上开了一单做多欧美。入场价、止损、止盈,全部一目了然。你放下手机,继续涮肉。
这不是什么科幻场景。一个Telegram机器人,加上几十行MQL5代码,就能做到这件事。今天聊聊怎么让你的手机变成EA的远程监控台。
为什么你需要远程监控EA?
EA跑在VPS上,24小时不停。但你不可能24小时盯着屏幕。
你在开车,EA开仓了。你在睡觉,EA爆仓了。你在上班,EA连亏5单了。这些事情你可能过了好几个小时才知道。
我见过一个哥们,周五下班忘了关EA,周一早上发现账户回撤了40%。如果他当时有实时通知,周五晚上就能远程暂停EA,损失可能只有5%。
远程监控不是锦上添花,是刚需。尤其是你的EA管理着5000美金以上的账户时,每一分钟的信息延迟都可能意味着真金白银的损失。
Telegram机器人能帮你做什么?
Telegram机器人能做的事情比你想象的多。我把它分成四个层次。
第一层:实时交易通知
每次EA开仓、平仓、修改止损止盈,你手机上立刻收到消息。消息里包含交易品种、方向、手数、价格、止损、止盈。平仓时还会告诉你这一单赚了多少、亏了多少。
这是最基本的功能。做到这一步,你就不会再"不知道EA在干嘛"了。
第二层:账户状态报告
每天早上8点,机器人自动给你发一条日报。内容包括:当前余额、净值、已用保证金、持仓数量、当日盈亏。
你还可以设定每4小时发一次。这样即使EA没有新交易,你也能知道账户的整体状态。
比如:"日报 | 余额: $12,350 | 净值: $12,180 | 持仓: 3单 | 今日P&L: +$230"
一眼就知道账户健不健康。
第三层:远程指令控制
这是最酷的部分。你可以在Telegram里给EA发指令。
发送 /pause ,EA暂停开新仓。发送 /resume ,EA恢复运行。发送 /closeall ,平掉所有持仓。发送 /status ,立刻返回账户状态。发送 /setlot 0.3 ,把下单手数改成0.3。
你在地铁上,发现非农数据要公布了,直接发一条 /pause 。EA乖乖停下来,等你发 /resume 才继续。这种控制感,用过就回不去了。
第四层:信号分发
如果你的EA跑得好,你可以把交易信号自动转发到一个Telegram频道里。订阅者付费加入频道,就能实时看到你的交易信号。
这是一种变现方式。后面我会专门讲怎么搭建信号分发频道。
第一步:创建你的Telegram机器人
整个过程不到5分钟。
打开Telegram,搜索 @BotFather 。这是Telegram官方的机器人管理工具。
给BotFather发送 /newbot 。它会问你两个问题:机器人的显示名称和用户名。显示名称随便取,比如"我的EA监控"。用户名必须以bot结尾,比如 my_ea_monitor_bot 。
创建成功后,BotFather会给你一串API Token,长得像这样:
6123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw
把这串Token保存好。这是你的机器人的"钥匙",有了它就能控制机器人发消息。
接下来你需要获取你的Chat ID。给你刚创建的机器人发一条消息,然后在浏览器里访问:
https://api.telegram.org/bot你的Token/getUpdates
返回的JSON里面有一个 chat 对象,里面的 id 就是你的Chat ID。记下来,后面要用。
第二步:在MQL5里集成Telegram
MT5有一个内置函数叫 WebRequest() ,可以发送HTTP请求。我们用它来调用Telegram的API。
先做一个准备工作:打开MT5,点击"工具" -> "选项" -> "EA交易",在"允许的URL列表"里添加:
https://api.telegram.org
不加这一步,WebRequest会被拦截,什么消息都发不出去。很多人卡在这里,以为代码写错了,其实是忘了加白名单。
核心代码:发送交易通知
下面这段代码是最核心的部分。当EA执行OrderSend成功后,调用这个函数就能把交易信息发到Telegram。
// Telegram配置
string BotToken = "6123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw";
string ChatID = "987654321";
// 发送Telegram消息的函数
bool SendTelegramMessage(string message)
{
string url = "https://api.telegram.org/bot" + BotToken + "/sendMessage";
// 对消息进行URL编码处理
string params = "chat_id=" + ChatID + "&text=" + message + "&parse_mode=HTML";
char post[];
char result[];
string headers = "Content-Type: application/x-www-form-urlencoded\r\n";
StringToCharArray(params, post, 0, WHOLE_ARRAY, CP_UTF8);
int timeout = 5000; // 5秒超时
int res = WebRequest("POST", url, headers, timeout, post, result, headers);
if(res != 200)
{
Print("Telegram发送失败,错误码: ", res);
return false;
}
return true;
}
然后在你的EA里,OrderSend成功后调用它:
// 开仓成功后发送通知
void OnTradeNotification(string symbol, string direction, double lots,
double price, double sl, double tp)
{
string msg = symbol + " " + direction + " " + DoubleToString(lots, 2) + " Lot"
+ "\nEntry: " + DoubleToString(price, 5)
+ "\nSL: " + DoubleToString(sl, 5)
+ "\nTP: " + DoubleToString(tp, 5)
+ "\nTime: " + TimeToString(TimeCurrent(), TIME_SECONDS);
SendTelegramMessage(msg);
}
实际使用中,你在EA的交易逻辑里找到OrderSend的位置,在返回成功后加上这个调用就行。一共就这么多代码。
进阶:定时发送账户日报
每天定时发账户状态也很简单。在EA的OnTimer或OnTick里加一个时间判断:
datetime lastReportTime = 0;
void CheckDailyReport()
{
MqlDateTime dt;
TimeCurrent(dt);
// 每天早上8点发送日报
if(dt.hour == 8 && dt.min == 0)
{
if(TimeCurrent() - lastReportTime > 3600) // 防止重复发送
{
double balance = AccountInfoDouble(ACCOUNT_BALANCE);
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
int positions = PositionsTotal();
string report = "=== 每日报告 ==="
+ "\n余额: $" + DoubleToString(balance, 2)
+ "\n净值: $" + DoubleToString(equity, 2)
+ "\n持仓数: " + IntegerToString(positions)
+ "\n时间: " + TimeToString(TimeCurrent());
SendTelegramMessage(report);
lastReportTime = TimeCurrent();
}
}
}
你可以把这段代码放在OnTick里面,每次报价更新时检查一下时间。到了8点就自动发。
怎么实现远程指令控制?
这部分稍微复杂一点。原理是让EA定时去Telegram拉取新消息,看看你有没有发指令过来。
用的是Telegram的 getUpdates 接口:
string checkUrl = "https://api.telegram.org/bot" + BotToken
+ "/getUpdates?offset=" + IntegerToString(lastUpdateId + 1);
EA每隔几秒请求一次这个接口。如果返回的JSON里包含 /pause ,EA就把一个全局变量设为false,停止开新仓。包含 /resume 就恢复。包含 /closeall 就遍历所有持仓逐个平仓。
这里有个注意点:解析JSON在MQL5里比较麻烦,因为MQL5没有原生的JSON库。你可以用简单的字符串查找来处理,比如 StringFind(response, "/pause") 。不需要完整解析JSON,够用就行。
实际操作中建议把拉取间隔设为3-5秒。太频繁会被Telegram限流,太慢了指令响应不及时。
搭建信号分发频道赚钱
如果你的EA连续3个月以上盈利,月回报率稳定在5%-15%,你就有资格做信号分发了。
具体做法是这样的:
首先,在Telegram里创建一个频道(Channel),不是群组。频道适合单向发布信息,订阅者只能看不能说话,很适合做信号发布。
把频道设为私有。只有通过邀请链接才能加入。你的机器人需要被添加为频道管理员,这样它才有权限往频道里发消息。
然后修改代码。除了给你自己发通知之外,再给频道也发一份。频道的Chat ID是负数开头的,比如 -1001234567890 。你在代码里多调用一次SendTelegramMessage,把ChatID换成频道的就行。
收费模式可以灵活设计。按月收费是最常见的,比如每月200-500元人民币。新订阅者付费后,你把邀请链接发给他。每个月底换一次邀请链接,没续费的人自然就看不到新信号了。
信号消息的格式要专业一点:
EURUSD BUY 信号
入场: 1.0847
止损: 1.0817 (30点)
止盈: 1.0907 (60点)
风险比: 1:2
发布时间: 2025-03-14 21:35
注意:不要在信号里暴露你的手数和账户信息。只发方向、价格、止损止盈就够了。订阅者根据自己的资金量决定手数。
安全和隐私:这些坑别踩
第一,绝对不要在消息里发送你的账户号码。有人截图转发,你的账户信息就泄露了。
第二,Bot Token要当密码一样保管。任何拿到Token的人都能用你的机器人发消息。如果Token泄露了,立刻去BotFather用 /revoke 重新生成一个。
第三,Chat ID要限制。在EA里加一个判断,只响应你自己的Chat ID发来的指令。否则别人知道你机器人的用户名后,也能给它发指令。
// 只响应指定用户的指令
if(senderChatId != MyAuthorizedChatID)
{
SendTelegramMessage("未授权的访问");
return;
}
第四,如果你做信号分发,用私有频道,不要用公开频道。公开频道的内容任何人都能看到,相当于免费送。
第五,VPS上的MT5密码、Token等敏感信息不要写在EA的输入参数里。输入参数在MT5界面上是明文显示的。写在代码里或者用加密文件存储更安全。
为什么选Telegram而不是其他工具?
你可能会问,微信行不行?邮件行不行?MT5自带的推送行不行?
微信没有公开的机器人API。你要实现类似功能,得用第三方框架模拟登录,随时可能被封号。技术门槛高,稳定性差。不推荐。
邮件可以用,MQL5也支持发邮件。但邮件有延迟,通常几秒到几十秒不等。而且邮件没法做双向交互,你不能通过回复邮件来给EA发指令。只能做单向通知,功能受限。
MT5自带的Push通知可以发到手机MetaTrader App上。优点是不需要额外设置,缺点是消息格式简单,不能发复杂的结构化信息,也不能做指令控制,更不能做信号分发。
Telegram几乎是最佳选择。API免费、文档完善、全球可用、支持双向通信、支持频道分发。唯一的缺点是在国内需要特殊网络环境才能访问,但你的EA跑在海外VPS上,VPS本身是没有这个问题的。
实战中的几个小技巧
消息不要太频繁。 如果你的EA是剥头皮策略,一天开50单,每单都发通知,你的手机会响个不停。建议只在开仓和平仓时通知,修改止损之类的操作可以只记日志不发消息。或者做一个汇总,每小时发一次交易摘要。
加上回撤预警。 设定一个阈值,比如账户回撤超过10%就发送一条高优先级警报。这条消息可以加上特殊标记,让你在一堆通知里一眼看到。
记录消息发送日志。 有时候WebRequest会因为网络问题失败。在EA里把每次发送的成功和失败都记录到日志文件里,方便排查问题。
用不同的机器人分离功能。 一个机器人负责交易通知发给你自己,另一个机器人负责信号分发发到频道。这样即使信号分发的机器人出了问题,你自己的监控不受影响。
常见问题
WebRequest返回错误码-1是怎么回事?
大概率是你没有在MT5的"允许URL列表"里添加 https://api.telegram.org 。这是最常见的问题。添加后重启EA就好了。
消息有时候发得出去,有时候发不出去?
检查你的VPS网络是否稳定。Telegram的API服务器在欧洲,如果你的VPS在亚洲,偶尔会有延迟或超时。把WebRequest的超时时间从5000毫秒调到10000毫秒试试。
能不能发图片,比如把K线图发到Telegram?
可以,但比较复杂。你需要用ChartScreenShot函数截图保存为文件,然后通过Telegram的sendPhoto接口上传。涉及文件读取和multipart表单上传,MQL5里实现起来代码量不小。建议先把文字通知做好,图片功能以后再加。
一个机器人能同时监控多个EA吗?
可以。多个EA使用同一个Bot Token和Chat ID,消息都会发到同一个聊天窗口。为了区分来源,建议在消息前面加上EA名称或账户标识,比如"[趋势EA-账户A] EURUSD BUY..."。
Telegram机器人有调用频率限制吗?
有。Telegram官方限制是每秒最多30条消息,对同一个聊天每秒最多1条。正常的EA交易通知远远达不到这个上限,不用担心。但如果你做信号分发,同时往几百个用户私聊发消息,就需要做队列控制了。往频道发消息不受这个限制,这也是为什么建议用频道做信号分发。
把Telegram机器人接入EA这件事,技术门槛不高,但带来的便利性是实实在在的。你不再需要时刻守在电脑前,也不用担心错过关键的交易信号。花一个下午搭建好,能用好几年。如果你想了解更多EA开发和外汇交易的实战技巧,可以去 FXTool 看看,那里有不少实用的工具和资源。