在 MQL5 中创建交易管理员面板(第一部分):构建消息接口·综合运用
🛰️

在 MQL5 中创建交易管理员面板(第一部分):构建消息接口·综合运用

(3/3)· 前兩篇铺好地基,这一篇把 GUI 坐标、库封装、面板算法与消息接口一次打通并给出压测建议

含代码示例实战向 第 3/3 篇
很多开发者写完 EA 信号逻辑就卡在“怎么让人介入”这一步——系统自动发单却没法让管理员在图表上确认或喊停。把通讯甩给第三方脚本往往延迟高、权限乱。本篇用 MQL5 原生面板 + Telegram API 把这条链路收口。

「面板按钮的事件分发与折叠逻辑」

这段处理代码把图表事件按 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 面板属高风险操作,事件丢失可能导致指令未发出。

MQL5 / C++
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 环境可直接复用。外汇与指数差价合约波动剧烈,自动化推送仅作辅助监控,不替代风控。

MQL5 / C++
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 拖进图表,发条测试消息看手机端延迟,比读十篇综述都实在。

让小布替你跑这套联调
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到面板坐标偏移与消息送达率的异常提示,把重复劳动交给小布,你专注决策。

常见问题

原点在图表窗口左上角 (0,0),用左上 (x1,y1) 和右下 (x2,y2) 两点定位,宽高分别由 x2-x1 与 y2-y1 得出,需注意不同 DPI 下的缩放偏差。
面板回调里改写全局信号标志位,EA 主循环在下单前检查该标志,若被否决则跳过发送并写本地日志,概率上可降低误发。
目前小布盯盘内置的是通用品种页诊断与消息触达监控,自写 ex5 面板需你在终端部署;小布可帮你盯接口送达与坐标异常,不替代面板本身。
主要看 VPS 到 TG 服务器的网络路由、MQL5 定时器触发粒度以及 JSON 封装体积,实盘外汇贵金属属高风险,建议先在模拟环境压测再上真实账户。