在MQL5中创建交易管理员面板(第十一部分):现代化功能通信接口(1)
内容:
概述
MetaTrader 5终端正迅速演变为一个更高效、更紧凑的交易工作空间。随着近期聊天功能的集成,交易者现在可以直接在终端内与MQL5好友进行私密交流、加入群组以及订阅频道。这标志着通过MQL5 API安全连接MQL5社区迈出了重要的一步。
要使用这些功能,用户必须在终端内登录其MQL5账户,且有好友在线,同时加入活跃的频道或群组。这些社区是宝贵的交易信息来源,专家们经常在其中分享观点、截图以及实时讨论——所有内容都无缝集成,不会干扰您的图表视图。
然而,目前存在一个限制:通信仅限于MQL5生态系统内部。当前缺失的功能是,无法将MetaTrader 5与外部社交平台打通连接。幸运的是,终端的API结合WebRequest功能,使我们能够接入第三方通信服务器——例如 Telegram、WhatsApp 等。
我们的交易管理员面板旨在通过引入现代化的通信面板来扩展这一功能——该面板采用像我们日常使用的消息应用程序那样直观友好的界面设计。我们正从类似计算器的原型过渡到更直观、更精致的设计。尽管原始版本为初期测试提供了良好的支持,但即将推出的版本将支持真正的双向通信。
现在不再只是管理员发送消息——接收方也将能够回复。这一转变需要实现一个完善的联系人系统,使用唯一的聊天ID来管理外部通信对象。
下图展示了如何从MetaTrader 5 交易平台访问MQL5社区和聊天功能。用户账户图标通常位于终端界面右上角,如图片中突出显示的位置所示。

从MetaTrader 5终端访问MQL5社区和聊天功能
如果您已经添加MQL5账户,终端通常会在启动日志中显示摘要信息,表明MQL5社区账户和聊天功能已激活。以下是我2025年4月16日的终端启动日志。
2025.04.16 08:44:10.343 Network '40538052': previous successful authorization performed from 197.221.254.8 on 2025.04.16 03:48:48 2025.04.16 08:44:10.461 Experts expert New_Admin_Panel- (Volatility 75 (1s) Index.0,M5) loaded successfully 2025.04.16 08:44:12.323 Experts expert New_Admin_Panel- (Volatility 10 (1s) Index.0,M1) loaded successfully 2025.04.16 08:44:12.324 Network '40538052': terminal synchronized with Deriv.com Limited: 0 positions, 0 orders, 150 symbols, 0 spreads 2025.04.16 08:44:12.324 Network '40538052': trading has been enabled - hedging mode 2025.04.16 08:44:14.354 Trades use MetaTrader VPS Hosting Service to speed up the execution: 2.26 ms via 'MQL5 Frankfurt FRA8 01' instead of 212.79 ms 2025.04.16 08:44:14.776 MQL5.community activated for 'Billionaire2024', balance: 0.00 2025.04.16 08:44:15.826 MQL5.chats activated for 'Billionaire2024'
以下概述中,我们将深入探讨实际设计方案,并阐述计划如何推动通信面板实现这一全新进化。
概览
得益于近期对代码结构的优化,程序的扩展性正日益凸显。正如您所见,我们现在能够专注于通信面板的开发,而无需被大型项目的其他组件分散注意力。这种模块化开发方式让我们得以充分发挥创造力并提升工作效率。
今天,我们将为通信面板迈出又一重要步伐——这类似于我们此前改进并简化管理员主页界面时取得的进展。当前通信面板存在视觉吸引力不足、用户体验欠佳等问题,这意味着我们需要在优化和增强功能方面投入更多精力。
在继续利用MQL5标准库的同时,本次迭代还将引入针对我们需求定制的新类。为确保开发路径清晰,我们将首先进行界面概念设计,明确核心组件及其各自功能。随后进入编码实现阶段。
基于主流即时通信应用的消息界面特征
在着手设计自有界面之前,让我们先回顾当今最受欢迎的即时通信应用所普遍具备的界面特征。通过分析这些常见设计模式,我们可以汲取灵感——根据当前目标对功能进行适配、增减或调整。
以下是我总结的十条关键特征供我们探讨。在逐一分析后,我们将通过事先准备的参考图片,直观感受这些元素在现实应用中的组合效果。
1. 简洁极简主义设计:
- 扁平化用户界面,搭配现代配色方案(支持亮色/暗色模式)
- 一致的间距与对齐方式
- 圆角消息气泡与流畅过渡效果
- 简单直观的图标(回形针、表情符号、麦克风等)布局
2. 消息线程区域(主聊天窗口):
- 可滚动区域,显示消息历史记录
- 消息时间戳
- 按发送者分组消息
- 视觉反馈:已送达、已读、已编辑、已置顶
- 支持多媒体内容(图片、视频、语音、文件)
3. 侧边栏——联系人或频道:
- 用户、群组或频道列表
- 在线状态指示器(绿色圆点、最后上线时间)
- 最近消息预览
- 搜索与筛选选项
4. 顶部导航栏:
- 聊天标题或联系人姓名
- 用户头像或群组图标
- 设置/选项下拉菜单(静音、归档、删除等)
- 查看用户或群组资料的信息按钮
5. 消息输入区域(底部面板):
- 带占位符的文本输入框(“输入消息……”)
- 按钮:
- 发送(纸飞机图标)
- 附加文件(回形针图标)
- 表情符号选择器(笑脸图标)
- 语音输入(麦克风图标)
- 键盘快捷键(按回车键发送,按Shift+回车键换行)
6. 媒体与附件预览:
- 图片、视频、文件的内联预览
- 展开/折叠视图
- 支持拖放上传
7. 通知与提醒:
- 应用内和系统通知
- 声音/振动切换
- 带高亮显示的提及(@用户名)
- 消息弹出窗口或徽章(未读消息计数)
8. 跨设备同步:
- 实时同步的网页、移动和桌面应用
- 跨会话的持久聊天历史记录
- 支持离线模式,重新上线后自动同步
9. 安全与隐私功能:
- 端到端加密(如WhatsApp)
- 消息定时/自毁(Telegram)
- 双因素身份验证和安全登录会话
10. 可扩展性与机器人:
- 支持机器人与自动化功能
- 与其他工具(日历、任务管理器、交易终端)的插件/集成
- 丰富的API接口与WebSocket支持
- 消息输入区域以红色边框标出。
- 聊天历史记录区域以蓝色边框标出。
- 顶部区域以绿色边框标出,包含联系人姓名、搜索按钮和三点菜单。

Telegram聊天界面参考图
另一个相近的参考案例是MQL5消息界面,这是我从之前创建的MQL5频道中截取的。请查看以下布局——与前一张Telegram图片相比,您会发现设计上有一些相似之处和细微差异。我们可以从这个通用消息界面布局中汲取一些有用的见解。

MQL5消息界面参考
可作为参考的案例实际上不胜枚举。无论是带有回复按钮和附加功能的电子邮件系统、聊天机器人界面,还是其他类似系统,许多都遵循相似的布局。这些案例都为我们了解通信界面通常需要哪些功能提供了宝贵的见解。基于这些参考,我们现在可以进一步考虑最适合我们交易通信面板的设计方案,同时牢记其局限性以及它将处理的特定通信类型。
设计与代码实现
至此,迁移工作正式启动——从当前面板过渡到新面板。不过,在此之前,我们需要考虑交易管理员与其他交易员互动时的关键通信需求。这些需求通常包括:
1. 向交易员发送特别指令
我们已经采用了快捷消息按钮的想法,以减少撰写和发送消息之间的时间。这样确保交易员能尽快收到重要信息。不过,管理员还需要能够发送自定义消息,而消息输入区域的设计正是为了满足这一需求。我们将改进快捷消息的访问方式。
2. 单向通信与双向通信
通常情况下,只有管理员可以发送消息,这构成了一个单向通信系统。然而,在某些场景下,允许交易社区进行回复可能很有用。我们应考虑在新面板设计中支持这种互动方式。
3. 截图分享与可视化分析
分享图片——尤其是标注过的图表或截图——正变得越来越重要。MQL5终端已包含截图工具,可直接将截图上传至MQL5社区图表。我们希望添加一个按钮,用于捕获截图并将其附加到消息中,以便快速分享。这将使管理员能够更有效地通过可视化方式传达交易见解。
4. 联系人管理
由于Telegram提供了多种通信模式——如一对一聊天、频道和群组——我们可以使用唯一的聊天ID来分配联系人,并将通信组织为个人和群组类别。这也意味着我们需要在应用程序中有效管理联系人的存储和检索方式。
以下是我们的概念设计,随后我们将进行代码实现:

新设计:通信面板
当前,我们的首要任务是优化界面设计。在本文的后续部分,我们将以此为基础——添加新功能并进一步提升用户体验。
MQL5标准库提供了多个#include指令,我们将利用这些指令来设计我们的界面。下表列出了相关的头文件,并描述了它们在项目中的预期用途。
| 头文件 | 目的 |
|---|---|
| Dialog.mqh | 为对话框窗口提供基类,负责管理用户界面(UI)组件、事件处理及渲染。 |
| Panel.mqh | 用于对控件进行可视化分组和排列,实现主区域和撰写面板等布局分区。 |
| Label.mqh | 用于显示不可编辑的文本,例如输入字段标签和“用户名”或“聊天ID”等分区标题。 |
| Edit.mqh | 提供可编辑的文本框供用户输入信息,包括撰写消息和填写Telegram账号凭证。 |
| Button.mqh | 支持创建可点击按钮,用于实现用户操作,如“发送”、“附加文件”、“截图”或“主题切换”。 |
| VirtualKeys.mqh | 定义用于处理键盘输入事件的常量,例如检测消息输入框中的回车键按下操作。 |
| Telegram.mqh | 处理通过Telegram机器人API发送消息的逻辑,包括URL请求和HTTP通信。 |
通信对话框类头文件(CommunicationsDialog.mqh)
在本节中,我将详细解析代码的工作原理,并强调将其组织为特定、可复用模块的优势。通过将每个面板的逻辑隔离到独立的头文件中(包含定义、枚举、类声明和方法实现),我们使主程序保持简洁、易于维护,并可在多个EA中轻松共享。当您包含这些头文件之一时,无需担心内部GUI细节,只需调用其接口即可。现在,让我们逐步探索通信面板的改进。
类头文件结构
在文件的最顶部,我们防止重复包含,并引入所有必要的依赖项:
- 包含文件: MQL5标准UI控件(对话框、面板、编辑框、按钮、标签),以及虚拟键(用于键码)和我们自定义的Telegram.mqh文件。
- 常量与枚举:面板几何尺寸宏、UI间距,以及两个枚举类型,分别用于定义消息类型(OUTGOING、NCOMING、SYSTEM)和状态(SENT、FAILED)。
- 类定义:CCommunicationDialog类继承自CAppDialog类,并声明:
- 私有成员变量,用于面板、按钮、标签、编辑框以及深色模式标志。
- 公有方法,包括构造函数、初始化凭证(InitCredentials)、创建面板(CreatePanel)、事件处理(OnEvent)以及动作处理器(如OnSendMessage等)。
- 私有辅助方法,用于构建每个UI区域、主题设置、历史记录输入/输出以及消息格式化。
#ifndef COMMUNICATIONS_MQH #define COMMUNICATIONS_MQH #include <Controls\Dialog.mqh> #include <Controls\Panel.mqh> #include <Controls\Edit.mqh> #include <Controls\Button.mqh> #include <Controls\Label.mqh> #include <VirtualKeys.mqh> #include "Telegram.mqh" #define COMM_PANEL_LEFT 80 … enum ENUM_UI_CONSTANTS { UI_INDENT=10, UI_GAP=5, … }; enum ENUM_MESSAGE_TYPE { MSG_OUTGOING, MSG_INCOMING, MSG_SYSTEM }; enum ENUM_MESSAGE_STATUS { STATUS_SENT, STATUS_FAILED }; class CCommunicationDialog : public CAppDialog { private: CPanel m_mainPanel, m_composePanel; CButton m_toggleSidebar, m_sendButton, m_attachButton, m_screenshotButton; CLabel m_usernameLabel, m_chatIdLabel, m_tokenLabel, m_mainUserLabel; CEdit m_usernameInput, m_chatIdInput, m_tokenInput, m_messageThread, m_messageInput; bool m_isDarkMode; public: CCommunicationDialog():m_isDarkMode(false){} bool CreatePanel(...); virtual bool OnEvent(...); void OnSendMessage(); … private: bool CreateSidebar(); bool CreateMainContent(); bool CreateComposeArea(); void ApplyTheme(); void LoadChatHistory(string); void SaveMessageToHistory(...); string FormatMessage(...); void AddMessageToHistory(...); }; #endif // COMMUNICATIONS_MQH
1. CreatePanel:组装对话框
此方法负责协调整个对话框的设置工作。其首先调用基础对话框创建函数,然后按顺序构建侧边栏、主消息显示区域和撰写区域。每一步都会检查是否成功——若任何一步失败,对话框将立即终止构建。待所有区域都构建完成后,将应用当前主题、加载保存的历史记录,并重绘图表以呈现完整的界面。
bool CCommunicationDialog::CreatePanel(const long chart,const string name,const int subwin, const int x1,const int y1,const int x2,const int y2) { if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2)) return(false); if(!CreateSidebar()) { Destroy(); return(false); } if(!CreateMainContent()) { Destroy(); return(false); } Add(m_mainPanel); Add(m_messageThread); Add(m_mainUserLabel); if(!CreateComposeArea()){ Destroy(); return(false); } Add(m_composePanel); Add(m_messageInput); Add(m_screenshotButton); Add(m_attachButton); Add(m_sendButton); ApplyTheme(); LoadChatHistory(m_chatIdInput.Text()); ChartRedraw(); return(true); }
2. CreateSidebar:凭证与主题切换功能
在侧边栏设置中,我们在顶部放置一个主题切换按钮,随后依次排列三个带标签的输入框:用户名、聊天ID和机器人令牌。这些输入框允许用户手动输入Telegram账户凭证。尽管目前需手动输入,但该面板为未来开发联系人管理系统奠定了基础——届时用户可存储并选择已保存的聊天ID,无需重复输入。
bool CCommunicationDialog::CreateSidebar() { int x=UI_INDENT, y=UI_INDENT, w=UI_SIDEBAR_WIDTH-2*UI_INDENT, h=16; m_toggleSidebar.Create(m_chart_id,m_name+"_Toggle",m_subwin,x,y,x+h,y+h); m_toggleSidebar.Text("🌙"); Add(m_toggleSidebar); y+=h+UI_GAP; m_usernameLabel.Create(...); m_usernameLabel.Text("Username:"); m_usernameInput.Create(...); Add(m_usernameLabel); Add(m_usernameInput); y+=h+UI_GAP; m_chatIdLabel.Create(...); m_chatIdLabel.Text("Chat ID:"); m_chatIdInput.Create(...); Add(m_chatIdLabel); Add(m_chatIdInput); y+=h+UI_GAP; m_tokenLabel.Create(...); m_tokenLabel.Text("Bot Token:"); m_tokenInput.Create(...); Add(m_tokenLabel); Add(m_tokenInput); return(true); }
3. CreateMainContent:消息历史记录展示
本章节对中央面板及其只读编辑控件进行初始化,该控件用于显示对话线程。顶部有一个标签,用于显示当前用户的名称。用户无法直接编辑过往消息——新消息将通过程序自动追加——从而以简洁的单行视图呈现聊天历史记录。
bool CCommunicationDialog::CreateMainContent() { int x1=UI_SIDEBAR_WIDTH, y1=0; int x2=ClientAreaWidth(), y2=ClientAreaHeight()-UI_COMPOSE_HEIGHT; m_mainPanel.Create(...); m_messageThread.Create(...); m_messageThread.ReadOnly(true); m_messageThread.FontSize(9); m_messageThread.TextAlign(ALIGN_LEFT); m_mainUserLabel.Create(...); m_mainUserLabel.Text(m_usernameInput.Text()); return(true); }
4. CreateComposeArea:输入与操作按钮区域
在此我们构建底部消息撰写区域,用户可在此输入新消息。该区域包含一个占位文本框和三个操作按钮:截图、附加文件和发送。文本框初始显示提示文字,并采用柔和色调,引导用户在点击操作按钮前输入消息内容。
bool CCommunicationDialog::CreateComposeArea() { int caW=ClientAreaWidth(), caH=ClientAreaHeight(); int y1=caH-UI_COMPOSE_HEIGHT, y2=caH; int x1=UI_SIDEBAR_WIDTH, x2=caW; m_composePanel.Create(...); m_screenshotButton.Create(...); m_screenshotButton.Text(StringFormat("%c",58)); m_attachButton. Create(...); m_attachButton. Text(StringFormat("%c",49)); m_sendButton. Create(...); m_sendButton. Text(StringFormat("%c",216)); m_messageInput.Create(...); m_messageInput.Text("Type here..."); m_messageInput.Color(clrGray); return(true); }
5. OnCaptureScreenshot:GIF格式快照
当用户点击截图按钮时,该方法会将当前图表捕获为带有时间戳命名的GIF文件,将其保存到MQL5 Files文件夹中,并记录一条系统风格的消息,以指示操作成功或失败。这就为交易者提供了一种快速方法,可直接通过Telegram分享图表快照。
void CCommunicationDialog::OnCaptureScreenshot() { datetime ts=TimeCurrent(); string tstr=TimeToString(ts, TIME_DATE|TIME_MINUTES|TIME_SECONDS); StringReplace(tstr,":",""); string path=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Files\\"; string fn=path+"shot_"+tstr+".gif"; bool ok=ChartScreenShot(m_chart_id,fn,0,0); m_messageThread.Text( FormatMessage(ok ? "Screenshot saved: "+fn : "Screenshot failed", MSG_SYSTEM, ok ? STATUS_SENT : STATUS_FAILED, ts)); ChartRedraw(); }
6. OnSendMessage:消息发送与历史记录
该处理器会验证消息输入内容是否为空,以及是否已提供账户凭证。它会调用我们的Telegram发送功能,将发送结果记录到历史记录文件中,并在对话显示区域追加新消息——同时根据发送状态显示勾选标记(成功)或叉号图标(失败)。最后,会将输入框重置为占位符状态,并触发界面重绘。
void CCommunicationDialog::OnSendMessage() { string txt=m_messageInput.Text(); if(txt==""||txt=="Type here...") { /* show error */ return; } string chatId=m_chatIdInput.Text(), token=m_tokenInput.Text(); if(chatId==""||token=="") { /* show error */ return; } datetime ts=TimeCurrent(); bool sent = SendMessageToTelegram(txt, chatId, token); SaveMessageToHistory(chatId, ts, MSG_OUTGOING, sent ? STATUS_SENT : STATUS_FAILED, txt); m_messageThread.Text(FormatMessage(txt, MSG_OUTGOING, sent ? STATUS_SENT : STATUS_FAILED, ts)); m_messageInput.Text("Type here..."); m_messageInput.Color(clrGray); ChartRedraw(); }
7. 主题与格式化辅助方法
配套方法负责动态主题切换和消息格式化处理。ApplyTheme方法可根据深色或浅色模式切换背景和文本颜色。FormatMessage方法构建带时间戳的消息行,并添加用户/系统前缀以及发送成功/失败图标。历史记录输入/输出方法将对话内容保存到按聊天分组的数据文件中,并支持从这些文件加载,确保会话内容在多次运行间持久化存储。
void CCommunicationDialog::ApplyTheme() { color bg = m_isDarkMode ? (color)0x2E2E35 : clrWhite; color txt= m_isDarkMode ? clrWhite : clrBlack; m_mainPanel.ColorBackground(bg); m_composePanel.ColorBackground(bg); m_messageThread.Color(txt); m_messageInput.Color(txt); … } string CCommunicationDialog::FormatMessage(const string message, ENUM_MESSAGE_TYPE type, ENUM_MESSAGE_STATUS status, datetime ts) { string user = (type==MSG_OUTGOING ? m_mainUserLabel.Text() : type==MSG_INCOMING ? "Them" : "System"); string ico = (status==STATUS_SENT ? ShortToString(0x2713) : ShortToString(0x2717)); return StringFormat("[%s] %s: %s %s", TimeToString(ts,TIME_MINUTES), user, message, (type==MSG_SYSTEM ? "" : ico)); }
将CommunicationsDialog类集成到EA中
在主EA文件(New_Admin_Pane.mq5)中,Communications.mqh头文件通过HandleCommunications函数得以具体实现。当用户点击“通信”按钮时,代码会检查是否已存在CCommunicationDialog类的实例:如果存在,则切换其可见性;如果是首次使用,则实例化该对话框,使用存储的聊天ID和机器人令牌对其进行初始化,并通过调用CreatePanel方法构建其用户界面。最后,调用show()方法将面板渲染到图表上。这种模式——首次点击时延迟创建,后续仅通过简单的显示/隐藏逻辑控制——可最大程度减少资源占用,同时将CommunicationsDialog界面与EA的其余部分清晰分离。
// handle showing/hiding communications panel void HandleCommunications() { if(g_commPanel) { // toggle visibility if already created if(g_commPanel.IsVisible()) g_commPanel.Hide(); else g_commPanel.Show(); ChartRedraw(); return; } // first‐time creation g_commPanel = new CCommunicationDialog(); // build the UI if(!g_commPanel.CreatePanel(g_chart_id, "CommunicationsPanel", g_subwin, 80, 100, 430, 500)) { delete g_commPanel; g_commPanel = NULL; Print("CommPanel creation failed: ", GetLastError()); return; } // pre‐fill credentials and display g_commPanel.InitCredentials(TwoFactorChatID, TwoFactorBotToken); g_commPanel.Show(); ChartRedraw(); }
测试结果
我在MetaTrader 5中编译该EA,未出现任何错误或警告。启动后,主界面按预期显示,包含切换按钮、“交易”、“通信”、“分析”以及“全部显示/全部隐藏”按钮。
1. 启动通信面板
点击“通信”按钮后,CCommunicationDialog实例化。对话框在分配的图表区域中显示,这证实了 CreatePanel 函数及其侧边栏、主线程和撰写区域均已正确构建。
2. 输入凭证
我测试了两种输入凭证的方法:在EA输入参数(TwoFactorChatID和TwoFactorBotToken)中设置值,以及直接通过侧边栏的“聊天ID”和“机器人令牌”字段进行编辑。在这两种情况下,InitCredentials均正确填充了字段,并更新了“You”标签。
3. 发送消息
输入有效凭证后,我在撰写框中输入了一条示例消息,然后按回车键或点击“发送”按钮。该消息显示在对话线程中,并带有✓图标,同时我在Telegram聊天中也收到了相同的消息——这表明WebRequest逻辑和JSON转义功能按预期工作。
4. 主题切换
点击月亮/太阳按钮可立即在浅色和深色模式之间切换。面板的背景和文本颜色随之更新,同时向对话线程中添加了一条系统消息(“已启用深色模式”或“已启用浅色模式”)。
5. 截图与附件按钮
按下截图按钮后,预期会捕获并保存一个GIF文件至MQL5\Files目录,然后打印确认消息(或报告失败)。附件按钮目前仅记录一条占位系统消息(“Attachment TBD”),表明完整的文件上传功能仍有待实现。

测试通信面板更新
结论
在EA中完全集成一个现代化的功能消息面板绝对是可行的,但当前标准库控件存在一些限制——最显著的是,内置的CEdit控件仅支持单行输入,且字符数量有限。在第一阶段,我们已经提供了一个扎实的基础布局,包括凭证输入、消息撰写、主题设置以及Telegram集成功能。通过研究,我还发现了一些社区开发的扩展工具,可以克服同样的限制;我将在下一次更新中分享这些参考资料。
展望下一篇文章,我们预期的主要目标如下:
1. 多行聊天历史记录
- 收到的消息左对齐;发送的消息右对齐
- 当内容超出可视区域时,自动换行并显示滚动条
2. 联系人管理系统
- 一个简单的通讯录,支持通过用户名或聊天ID进行持久化存储和检索
3. 可靠的截图和附件支持
- 确保文件创建和上传流程的可靠性
- 这样一来将帮助交易者即时分享实时图表见解,对于团队协作和交易复盘至关重要。
4. 增强的键盘快捷键
- 为常用消息和命令设置发送快捷键
这些只是我们计划中的部分改进内容。我们始终欢迎您的反馈和建议——这是一个持续学习、协作和改进的过程。不久的将来,我们将在MetaTrader 5中庆祝一个完全打磨好的外部API消息交互体验的诞生。希望这篇文章能为您的编程思维带来至少一个新的想法。
祝您交易顺利,敬请期待下一篇文章!
| 文件 | 说明 |
|---|---|
| New_Admin_Panel.mq5 | 面向MetaTrader 5高级交易管理的多面板集成型EA。 |
| CommunicationsDialog.mqh | 通信面板模块: 为MetaTrader 5的EA定义了一个基于Telegram的现代化消息交互界面面板。将其放置在终端的include文件夹中。 |
| All Modules.zip | 包含所有必需的头文件。请将这些文件添加至MQL5/Include文件夹。 |
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/17869
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。
使用 MetaTrader 5 Python 构建类似 MQL5 的交易类
从新手到专家:自动几何分析系统
新手在交易中的10个基本错误
MQL5开发专属调试与性能分析工具(第一部分):高级日志记录