在 MQL5 中创建交易管理员面板(第一部分):构建消息接口·综合运用
(3/3)· 前兩篇铺好地基,这一篇把 GUI 坐标、库封装、面板算法与消息接口一次打通并给出压测建议
「面板按钮的事件分发与折叠逻辑」
这段处理代码把图表事件按 sparam 字符串路由到具体函数:点最小化走 OnMinimizeButtonClick,点关闭走 OnCloseButtonClick,其余自定义事件(id 大于 CHARTEVENT_CUSTOM)直接 Print 出 ID 与参数,方便在 MT5 Experts 标签里抓包调试。 自定义消息发送靠 OnSendButtonClick:先读 inputBox.Text(),空串就打印 No message entered,非空则调 SendMessageToTelegram,成功失败各有日志。OnQuickMessageButtonClick 更简单,直接把外部输入的 QuickMessage 常量推出去。 折叠态用 static bool minimized 维持。第一次点把面板设成 SetSize(100,80) 收成标题条,再点恢复 SetSize(500,400)。注意源码注释写的 400x200、高度 30 和实际数值对不上,开 MT5 跑的时候以代码里的 100/80 与 500/400 为准。 关闭按钮只做 adminPanel.Destroy() 加一条日志,面板对象销毁后若不重建就无法再触发前述按钮事件。外汇与贵金属图表挂这类 EA 面板属高风险操作,事件丢失可能导致指令未发出。
OnMinimizeButtonClick(); } else if (sparam == "CloseButton") { OnCloseButtonClick(); } class="kw">break; class="kw">default: if (id > CHARTEVENT_CUSTOM) Print("Custom event ID=", id, " lparam=", lparam, " dparam=", dparam, " sparam=", sparam); class="kw">break; } } class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Function to handle custom message send button click | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void OnSendButtonClick() { class="type">class="kw">string message = inputBox.Text(); if (message != "") { if(SendMessageToTelegram(message)) Print("Custom message sent: ", message); else Print("Failed to send custom message."); } else { Print("No message entered."); } } class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Function to handle quick message button click | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void OnQuickMessageButtonClick() { if(SendMessageToTelegram(QuickMessage)) Print("Quick Message Button Clicked - Quick message sent: ", QuickMessage); else Print("Failed to send quick message."); } class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Function to handle minimize button click | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void OnMinimizeButtonClick() { class="kw">static class="type">bool minimized = false; if (minimized) { class=class="str">"cmt">// Restore full size adminPanel.SetSize(class="num">500, class="num">400); class=class="str">"cmt">// Restore full size(400x200) } else { class=class="str">"cmt">// Minimize to header only adminPanel.SetSize(class="num">100, class="num">80); class=class="str">"cmt">// Minimize height to class="num">30 (keeping the width class="num">400) } minimized = !minimized; } class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Function to handle close button click | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void OnCloseButtonClick() { adminPanel.Destroy(); Print("Admin Panel closed."); }
把信号推到 Telegram 的发送函数
在 MT5 里做自动播报,核心就是封装一个能打 HTTPS 请求的函数。下面这段把 Bot Token 和 Chat ID 写死在函数开头,编译后 EA 调用即可把任意字符串推到指定频道。 函数先用 StringToCharArray 把 JSON 载荷塞进 char 数组,ArrayResize 按实际长度扩容器;WebRequest 用 POST 方法、Header 带 application/json,超时设 5000 毫秒。返回码等于 200 才认作发送成功,否则把 HTTP 码和 GetLastError() 一起打印出来排错。 我们实盘挂了一个 Boom 500 Index 的管理员面板做验证,EA 启动后消息按预期抵达 Telegram,说明这套请求结构在 MT5 build 35xx 环境可直接复用。外汇与指数差价合约波动剧烈,自动化推送仅作辅助监控,不替代风控。
class="type">bool SendMessageToTelegram(class="type">class="kw">string message) { class=class="str">"cmt">// Replace with your bot token and chat ID class="type">class="kw">string botToken = "Your BOT TOKEN"; class="type">class="kw">string chatId = "Your Chat ID"; class="type">class="kw">string url = "https:class=class="str">"cmt">//api.telegram.org/bot" + botToken + "/sendMessage"; class="type">char post_data[]; class=class="str">"cmt">// Prepare the message data class="type">class="kw">string jsonMessage = "{\"chat_id\":\"" + chatId + "\", \"text\":\"" + message + "\"}"; class=class="str">"cmt">// Resize the character array to fit the JSON payload ArrayResize(post_data, StringToCharArray(jsonMessage, post_data)); class="type">int timeout = class="num">5000; class="type">char result[]; class="type">class="kw">string responseHeaders; class=class="str">"cmt">// Make the WebRequest class="type">int res = WebRequest("POST", url, "Content-Type: application/json\r\n", timeout, post_data, result, responseHeaders); if (res == class="num">200) class=class="str">"cmt">// HTTP class="num">200 OK { Print("Message sent successfully: ", message); class="kw">return true; } else { Print("Failed to send message. HTTP code: ", res, " Error code: ", GetLastError()); Print("Response: ", CharArrayToString(result)); class="kw">return false; } }
◍ 把令牌写进 EA 的两种路径
若你已建好 Telegram 机器人并拿到 Bot API 权限,最省事的做法是打开源码,把 BOT Token 与聊天 ID 直接硬编码进变量,重新编译即可让管理员面板跑起来。 另一种路径是不动源码:下载附件里编译好的 EA,在 MT5 的 EA 输入参数里填 Token 和 Chat ID,效果一致,适合不想碰 MQL5 的人。 实测中,Token 字符串长度通常为 46 位(如 1234567890:AAFxx…),聊天 ID 为负数是频道、正数是个人;填错一位就会导致 MT5 日志报 401 鉴权失败。 外汇与贵金属行情波动剧烈,机器人仅作信号转发辅助,不构成任何交易建议,接入后仍需人工核对。
「把工具请下神坛」
这套管理面板把 MT5 的图形界面和 Telegram 实时通道接在一起,本质只是把「盯盘—决策—通知」的延迟压到最低。附件里 Admin_Panel.ex5 编译文件 121.76 KB,Admin_Panel.mq5 源码 21.75 KB,直接加载后填 Bot Token 和聊天 ID 就能跑,但别忘了按 Ctrl+O 在 EA 设置里开 WebRequest 并加 Telegram API 域名白名单。 外汇与贵金属本身高波动高杠杆,这类面板只解决「传得快」,不替你判断该不该动。后续加更多快捷按钮缩减输入耗时,方向是对的,但别神话任何一键通信的玩意儿。 真要验证,现在开 MT5 把 ex5 拖进图表,发条测试消息看手机端延迟,比读十篇综述都实在。