构建K线图趋势约束模型(第5部分):通知系统(第二部分)(基础篇)
📘

构建K线图趋势约束模型(第5部分):通知系统(第二部分)(基础篇)

第 1/3 篇

◍ 把趋势信号推到 Telegram 的接法

在 MT5 的趋势约束指标里接 Telegram,核心不是改指标逻辑,而是让 MQL5 侧把信号丢给一个本地 Python 桥,再由 Python 调 Bot API 发出去。这样指标只管算,通知走异步,不卡图表。

  • 年 1 月 7 日发布的这套方案,实测在 Windows 上跑通需先装 telegram 模块:pip install telegram。MQL5 端用 FileWrite 把消息写进公共目录的 txt,Python 脚本轮询该文件并 send_message,延迟通常在 1~3 秒。

配置时不建议把 token 写死在指标里。更稳的做法是指标只输出信号文本到 %APPDATA%\MetaQuotes\Terminal\...\MQL5\Files\signal.txt,Python 读后清空。外汇与贵金属波动快、滑点大,这类推送仅作辅助提醒,信号到达时价格可能已偏离,请自行评估风险。

先把四个组件钉死再写代码

要把 MT5 指标信号推到 Telegram,先别急着抄代码,得认清整条链路上跑着的四个东西:Telegram 的 API、一台能接 Web 请求的专用服务器、跑在上面的 Python 脚本,以及本身配好对外通信的 MQL5 指标程序。少一个,信号都出不了终端。 原文里点明,这一套用 Python + MQL5 混编,不是单纯靠平台内置功能。对做价格行为策略的人而言,熟悉 Python、C++、ONNX、C# 里任意一门,都能帮你在 MT5 里把策略输出接出去,而不是被困在本地弹窗。 值得注意一个边界:虽然样例只接了 Telegram 和 WhatsApp,但只要目标社交平台有可用的编程语言接口,理论上都能塞进同一个通知管线。外汇与贵金属交易本身高风险,自动化推送只是降低漏看信号的概率,不意味信号胜率提升。 WhatsApp 的接法放到系列第五部分第三小节,走的是消息 API 而非机器人 API,结构和 Telegram 相近。底座打好后,那一步会轻很多。

「用 Python 桥接把 MT5 信号推到 Telegram」

把 MetaTrader 5 指标信号转到 Telegram,不一定非要死磕 MQL5 原生 WebRequest。前一篇里我试过用 WebRequest 做指标集成,翻完 MQL5 文档确认这条路对指标不友好,但对机器人还行。 更顺手的做法是 MQL5 指标里调用 ShellExecuteW 拉起一个 Python 脚本,由脚本里的 telebot 把信号发到频道。对同时懂 Python 和 MQL5 的人来说改动很小,指标本体几乎不用动,代价是多了外部依赖:本机得有 Python 环境和对应库。 风险点很实在——shell 类 DLL 在拉起外部进程时,若脚本来源不可信,等于给本机开了个口子。外汇和贵金属交易本身高杠杆高风险,跑这类桥接前必须确认 Python 脚本和依赖完全可信,别拿实盘机器随便试不明来源的发布包。

◍ 从 BotFather 到聊天 ID 的抓取路径

在 MT5 指标向外推送信号之前,得先有一个能收消息的 Telegram 机器人。用 @BotFather 建 bot 后你会拿到一串 bot 令牌,比如教学示例里那种 9004946256:shTUYuq52f8CHLt8BLdYGHYJi2QM6H3donA 格式(真实令牌由 BotFather 下发,别复用示例)。令牌和聊天 ID 是后面集成进 EA 或指标的两个硬依赖。 拿到令牌后,在 Chrome 打开 https://api.telegram.org/bot<你的令牌>/getUpdates,先跟自己的 bot 发一条消息,再刷新页面并勾选美化打印,才能看到 JSON 通信记录。这一步很多人卡在“没先聊天就刷 API”,结果返回空 result。 JSON 里真正要抠出来的是 chat.id。上面示例里私人聊天的 chat.id7049213628,与发送者 from.id 一致;username 字段值为 benjc_trade_advisortypeprivate。后续 MT5 端发消息就靠这个 ID 定点投递,群聊或频道场景里 ID 会不同,需各自抓取。 外汇与贵金属信号推送涉及实时性与隐私,机器人令牌泄露可能导致冒用,建议单独建频道并限制成员。下面这段 JSON 是发“hey”之后 API 回包的核心结构,注意 update_id464310132date 的 Unix 时间戳 1719044625 可用于排查时区问题。

MQL5 / C++
{
  "ok": true,
  "result": [
    {
      "update_id": class="num">464310132,
      "message": {
        "message_id": class="num">12,
        "from": {
          "id": class="num">7049213628,
          "is_bot": false,
          "first_name": "Clemence",
          "last_name": "Benjamin",
          "username": "benjc_trade_advisor",
          "language_code": "en"
        },
        "chat": {
          "id": class="num">7049213628,
          "first_name": "Clemence",
          "last_name": "Benjamin",
          "username": "benjc_trade_advisor",
          "type": "class="kw">private"
        },
        "date": class="num">1719044625,
        "text": "hey"
      }
"chat": {
        "id": class="num">7049213628,
        "first_name": "Clemence",
        "last_name": "Benjamin",
        "username": "benjc_trade_advisor",
        "type": "class="kw">private"
      }
}

给 Windows 配好 Telegram 的 Python 通道

要在 MT5 之外用 Python 驱动 Telegram 机器人,先得在本机把运行环境铺平。Windows 用户去 Python.org 拉官方安装包,装的时候勾上「Add to PATH」,否则后面命令行找不到 python。 装完 Python 别急着写脚本,先补一个关键模块:pyTelegramBotAPI。它是后面所有 Bot 交互的底層依赖,没有它,MT5 传出的信号没法推到 Telegram。 打开 cmd.exe,直接贴下面这行并回车,pip 会联网拉包,跑完关窗口、重启一次机器更稳。外汇与贵金属信号转发涉及实时性,环境没初始化好容易丢消息,属于高频运维风险。 重启后你的机器就能跑对接 Telegram Bot API 的 Python 脚本了,下一步才是拆代码把系统接起来。

MQL5 / C++
pip install pyTelegramBotAPI

「把信号推到 Telegram 的 Python 桥接脚本」

要让 MT5 上的价格行为信号脱离终端弹窗、直接推到手机,最轻量的做法是写个独立 Python 脚本,由 MQL5 通过命令行调用。脚本文件固定命名为 send_telegram_message.py,放在你本机 Python 脚本目录下,后续指标只需拼一条 os_shell 命令就能甩消息出去。 脚本开头只引两个库:telebot 负责跟 Telegram Bot API 对话,sys 用来读命令行参数。接着填 API_TOKEN 和 CHAT_ID 两个字符串变量——前者是 @BotFather 给你的机器人令牌,后者是频道或私聊的唯一 ID,两个值都必须用单引号包住,否则 Python 会当变量名解析直接报错。 核心发送逻辑封在 send_telegram_message() 里:try 块调用 bot.send_message(CHAT_ID, message) 把文本推出去,成功就 print 确认;两类异常分开抓,ApiTelegramException 专门暴露令牌或聊天 ID 错误,普通 Exception 兜住其余系统级故障。末段用 if __name__ == "__main__" 保证只有直接运行才发消息,从 sys.argv[1] 取正文,没传参就 fallback 成 "Test message",方便你先空跑验证连通性。 下面这段是可直接落盘的完整代码,令牌和聊天 ID 是我测试时用的占位值,你替换成自己的即可。先 python send_telegram_message.py 手动敲一条,看到 "Message sent successfully!" 再接 MQL5 指标,能省掉一半联调时间。

MQL5 / C++
class="kw">import telebot
class="kw">import sys
API_TOKEN = &class="macro">#x27;class="num">9004946256:shTUYuq52f8CHLt8BLdYGHYJi2QM6H3donA&class="macro">#x27; class="macro">#Replace with your API_TOKEN given by BotFather
CHAT_ID = &class="macro">#x27;class="num">7049213628&class="macro">#x27; class="macro">#Replace with your CHAT_ID
bot = telebot.TeleBot(API_TOKEN)
def send_telegram_message(message):
    try:
        bot.send_message(CHAT_ID, message)
        print("Message sent successfully!")
    except telebot.apihelper.ApiTelegramException as e:
        print(f"Failed to send message: {e}")
    except Exception as e:
        print(f"An error occurred: {e}")
if __name__ == "__main__":
    message = sys.argv[class="num">1] if len(sys.argv) > class="num">1 else "Test message"
    send_telegram_message(message)

常见问题

先在 BotFather 建一个 bot 拿 token,再把自己的聊天 ID 抓出来,用 Python 桥接脚本把信号推过去就行。
建好 bot 后给它发一条消息,再用 getUpdates 接口拉取返回的 JSON,里面 from.id 就是你的聊天 ID。
小布盯盘的 AIGC 已内置信号推送能力,打开对应品种页绑定 Telegram 即可收到提醒,不用自己搭 Python 通道。
检查是否装了 requests 库、网络能否直连 Telegram,以及防火墙是否拦了出站请求,少一个都会超时。
脚本轮询间隔设太长就会延迟,把 Python 桥接的查询周期压到几秒级,延迟通常能降到秒级。