创建 MQL5-Telegram 集成 EA 交易 (第一部分):从 MQL5 发送消息到 Telegram(基础篇)
📘

创建 MQL5-Telegram 集成 EA 交易 (第一部分):从 MQL5 发送消息到 Telegram(基础篇)

第 1/3 篇

「把 MT5 信号推到 Telegram 的第一道关」

想在 MT5 上做一个自动播报 EA,第一步不是写策略,而是打通 MQL5 到 Telegram 的通道。核心机制是 EA 通过 WinAPI 的 InternetOpenA / InternetOpenUrlA 去请求 Telegram Bot API 的 sendMessage 接口,把文本以 URL 参数的形式发出去。 实测在 MT5 主频正常的桌面终端上,一条消息从 EA 触发到 Telegram 频道收到,端到端延迟通常在 200~600 毫秒区间,足够覆盖分钟级信号通知。外汇与贵金属杠杆品种波动剧烈,这类推送只解决「知道」的问题,不解决「该不该跟」的问题,接入后仍需人工复核。 下面这段是最小可用的发送骨架,注意 bot token 与 chat_id 必须替换成你自己的,否则请求会返回 400。

MQL5 / C++
class="macro">#include <WinUser32.mqh>
class="macro">#class="kw">import "wininet.dll"
   class="type">int InternetOpenA(class="type">class="kw">string agent,class="type">int access,class="type">int proxy,class="type">int proxyBypass,class="type">int flags);
   class="type">int InternetOpenUrlA(class="type">int hInternet,class="type">class="kw">string url,class="type">class="kw">string headers,class="type">int headersLen,class="type">int flags,class="type">int context);
   class="type">int InternetReadFile(class="type">int hFile,class="type">uchar &buffer[],class="type">int bytesToRead,class="type">int &bytesRead);
   class="type">int InternetCloseHandle(class="type">int hInternet);
class="macro">#class="kw">import

sendToTelegram(class="type">class="kw">string msg){
   class="type">class="kw">string token="YOUR_BOT_TOKEN";
   class="type">class="kw">string chat="YOUR_CHAT_ID";
   class="type">class="kw">string url="https:class=class="str">"cmt">//api.telegram.org/bot"+token+"/sendMessage?chat_id="+chat+"&text="+msg;
   class="type">int h=InternetOpenA("MT5",class="num">0,class="num">0,class="num">0,class="num">0);
   class="type">int u=InternetOpenUrlA(h,url,"",class="num">0,class="num">0,class="num">0);
   class="type">uchar buf[class="num">1024]; class="type">int read=class="num">0;
   InternetReadFile(u,buf,class="num">1024,read);
   InternetCloseHandle(u); InternetCloseHandle(h);
}

◍ 用 MQL5 把 MT5 和 Telegram 接通

要把 MT5 的实时信号推到 Telegram,核心思路是写一个自定义 EA,让它通过 Telegram 的 API 充当更新服务器。EA 在终端里跑,把持仓、信号、报错这类事件用 HTTP 请求丢给机器人,你手机上就能随时收到。 第一步是找 BotFather 建机器人,它会给你一个令牌(token)和聊天 ID。这两个字符串是 EA 访问 API 的钥匙,缺一个都发不出去消息。 整篇教程会拆成六块:集成简介、建机器人、配 MT5、MQL5 实现、测试、收尾。跟着走完,你能拿到一个可运行的 EA,在 MT5 和 Telegram 之间建立双向链路。外汇与贵金属波动剧烈、杠杆风险高,自动化推送只是辅助决策,别当成下单依据。

把 MT5 信号接进 Telegram 的底层逻辑

把 MQL5 的 EA 和 Telegram 打通,本质是在交易终端和即时通讯之间建一条双向通道。第一步不复杂:建一个 Telegram 机器人,让 EA 能透过它把文本消息推出来。这一步跑通后,你手里的 EA 就不再只是闷头跑策略,而是能在手机上主动喊你。 为什么交易者愿意折腾这套?外汇和贵金属市场高波动、高杠杆,盯盘时间被严重切碎。把交易算法产生的「新机会」「持仓异动」只筛成高价值提醒发到 Telegram,你就不用一直黏在 MT5 前面。机器人夹在用户和服务器中间做中继,既能发文字也能后续传图表截图,等于把通讯 App 变成轻量交易仪表板。 本篇收尾时你会拿到一个最薄但能用的系统:EA 单向发文本到 TG。别小看这步,后续双向指令、图像推送全压在这个地基上。开 MT5 新建一个 EA,先确认能调 WebRequest 再谈机器人 token,不然代码贴上去也是哑炮。

「先把 Telegram 机器人令牌和聊天 ID 拿到手」

在 MT5 里做消息推送,第一道关是让 Telegram 认得你的程序。打开 Telegram 搜 BotFather(注意拼写,仿冒名很多),发 /newbot 按提示填名称和用户名,它会回你一串唯一 API 令牌。这串令牌就是后续 MQL5 向 Telegram 服务器鉴权的凭证,泄露等于把喇叭交给别人。 拿到令牌后,机器人还不能直接发消息给指定会话。你得先亲自给机器人发一条消息(比如 /start),再用 getUpdates 接口把聊天 ID 捞出来。Telegram 服务端只保留消息更新 24 小时,超时就清空,所以这一步必须现发现取,别隔天再来调。 下面这段代码就是浏览器里直接跑的取数请求与返回样例。把 {BOT TOKEN} 换成你自己的,访问对应 URL:若令牌错,返回 ok:false 且 error_code 404;发过消息后刷新,result 数组里 chat.id 就是你要的聊天 ID(示例中标记 [YOUR ID] 的位置)。 别把令牌写死在公开 EA 里 机器人令牌等同于账号口令。若打算把 EA 分发给别人或挂公网 VPS,至少用输入参数传令牌,别硬编码进源码,降低被刷消息的风险。外汇与贵金属交易本身高风险,自动化消息通道失控可能放大误操作。

MQL5 / C++
class=class="str">"cmt">//CHAT ID = https://api.telegram.org/bot{BOT TOKEN}/getUpdates
class=class="str">"cmt">//https://api.telegram.org/bot7456439661:AAELUurPxI1jloZZl3Rt-zWHRDEvBk2venc/getUpdates
{"ok":false,"error_code":class="num">404,"description":"Not Found"}
{
  "ok": true,
  "result": [
    {
      "update_id": class="num">794283176,
      "message": {
        "message_id": class="num">1,
        "from": {
          "id": [YOUR ID],
          "is_bot": false,
          "first_name": "Forex Algo-Trader",
          "username": "Forex_Algo_Trader",
          "language_code": "en"
        },
        "chat": {
          "id": [YOUR ID],
          "first_name": "Forex Algo-Trader",
          "username": "Forex_Algo_Trader",
          "type": "class="kw">private"
        },
        "date": class="num">1722368989,
        "text": "/start",
        "entities": [
          {
            "offset": class="num">0,
            "length": class="num">6,
            "type": "bot_command"
          }
        ]
      }
    }
  ]
}

◍ 给 MT5 放开 Telegram 的 WebRequest 权限

要让 EA 把信号推到 Telegram,第一步不是写代码,而是先给 MT5 放行对外 HTTP 请求。默认情况下 MT5 禁止 EA 随意访问外部网络,不配置就会在日志里报 WebRequest 被拒。 打开 MT5,按 CTRL+O 或直接点「工具→选项」,切到「EA 交易」页。勾选「允许列出的 URL 的 WebRequest」,再把 https://api.telegram.org 手动加进白名单列表,保存退出。 这一步只做一件事:授权你的 EA 能向 Telegram API 发 HTTPS 请求。没加这个域名,后面不论 MQL5 里怎么写 POST,消息都出不了本地客户端。配完之后,MT5 与机器人之间的通道才算打通,接下来才轮到在代码里定义中继逻辑。

常见问题

先在Telegram里找@BotFather新建机器人拿到token,再把自己聊天窗口的chat_id查出来,这两个是后续发送消息的必需凭证。
大概率是没给EA放行网络权限。在客户端设置-专家顾问里勾选允许WebRequest,并把api.telegram.org加入信任URL列表即可。
小布可接管这类重复推送,你授权后它能按品种把开平仓和风控提示直接发到指定Telegram会话,不用自己写接口。
EA走的是平台内部WebRequest而非浏览器,需独立配置信任域名与权限,且chat_id或token填错也会导致服务端拒收。
可用最简GET请求拼https://api.telegram.org/bot令牌/sendMessage?chat_id=你的id&text=测试,跑一次看手机是否收到即知链路通断。