用 MQL5 标准库自建图形面板:从 CAppDialog 到可交互控件
想给指标或 EA 做个好看的显示面板,不一定要手写所有绘图。MQL5 标准库提供了一组控件类,基于图表内嵌对象和事件驱动模型,让你用很少代码就能搭出自定义界面:独立子窗口的显示面板、EA 控制面板、自定义监控面板都行。
一、标准库提供了哪些控件
标准库开箱即用的控件分两类。简单控件:带文本/图像的按钮(保证鼠标与程序交互)、文本输入/只读显示、辅助标签、分组控件、装饰控件。复杂控件:列表视图、带下拉的字段、下拉选择、增减字段、枚举值、单选按钮、复选框、选项组、标志编辑组。这些足以拼出绝大多数交易面板。
- 简单控件:按钮、文本/只读编辑、标签、分组框、装饰
- 复杂控件:列表、下拉字段、增量/减量、枚举、单选、复选、选项组
- 底层:全部基于 CAppDialog + 图表对象 + OnChartEvent
- 事件驱动:点击/输入都走 OnChartEvent 重定向
二、显示面板是什么
“显示面板”指没有任何绘图缓冲区的独立窗口,只用图表内嵌对象显示信息:数值、文本、颜色。它常放在独立图表子窗口里。相比把信息画进指标缓冲,面板更灵活、能放交互控件,适合做“监控 + 操作”二合一的界面。
三、两个文件:类描述 + 指标
建一个面板需要两个文件:包含文件(描述面板对话框类,如 PanelDialog.mqh)和指标源文件(PanelIndicator.mq5)。可用 MQL5 向导生成模板:在 Indicators 目录下新建 MyIndicators 文件和 MyPanel 子文件夹,向导里选 New Class 生成类骨架,再选 Custom Indicator 生成指标骨架。
// PanelDialog.mqh 类骨架(节选)
#include <Controls\Dialog.mqh>
class CPanelDialog : public CAppDialog {
private:
public:
CPanelDialog(void);
~CPanelDialog(void);
};
四、指标骨架与对话框挂载
指标用向导生成时,要勾选 OnChartEvent 和 OnTimer,并选“Separate Window Indicator(独立窗口指标)”。在 OnInit 里 Create 对话框、Run 启动应用、EventSetTimer 建定时器;OnDeinit 里 Destroy 并杀定时器;OnChartEvent 把事件转给对话框。编译后拖到图表,会在独立窗口显示为空对话框。
// OnInit:创建并启动对话框
int OnInit() {
if(!ExtDialog.Create(0,"Panel Indicator",0,0,0,0,130)) return(-1);
if(!ExtDialog.Run()) return(-2);
EventSetTimer(1);
return(0);
}
// OnDeinit:销毁
int OnDeinit() {
ExtDialog.Destroy();
EventKillTimer();
return(0);
}
五、让面板显示信息:三步
面板要显示什么,由三个问题决定:显示哪类信息?加哪些控件?控件怎么交互?文章示例用 RGB 三色阶演示:红随 OnCalculate 随机变、绿随 OnTimer 随机变、蓝用手动微调控件变,并把值显示出来。需要 Panel(颜色)、只读 Edit(红/绿值)、SpinEdit(蓝值)、Label(说明)这些控件。
// 在类里声明附加控件
#include <Controls\Panel.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Label.mqh>
#include <Controls\SpinEdit.mqh>
class CPanelDialog : public CAppDialog {
private:
CPanel m_color; // 颜色显示
CLabel m_label_red; // “红”标题
CEdit m_field_red; // “红”数值
CLabel m_label_blue; // “蓝”标题
CSpinEdit m_edit_blue; // “蓝”微调
int m_red, m_green, m_blue;
};
六、布局与坐标:缩进常量
控件位置靠一组布局常量约束:INDENT_LEFT/TOP/RIGHT/BOTTOM 是边框缩进,CONTROLS_GAP_X/Y 是控件间距,LABEL_WIDTH/EDIT_WIDTH/EDIT_HEIGHT 是尺寸。所有 Create 方法里按这些常量算坐标,界面就能整齐对齐。掌握这套常量,复刻任意标准库面板布局都不难。
// 布局常量(节选) #define INDENT_LEFT (11) #define INDENT_TOP (11) #define INDENT_RIGHT (11) #define INDENT_BOTTOM (11) #define CONTROLS_GAP_X (10) #define CONTROLS_GAP_Y (10) #define LABEL_WIDTH (50) #define EDIT_WIDTH (50) #define EDIT_HEIGHT (20)
七、小结
用标准库自建面板,核心是“两个文件 + 一套控件类”:PanelDialog.mqh 描述界面、PanelIndicator.mq5 挂载并驱动。CAppDialog 管对话框生命周期,具体控件(Panel/Edit/Label/SpinEdit)在 Create 里按布局常量摆好,事件经 OnChartEvent 流入。它比手写 Canvas 绘制省事太多,是做 EA 控制面板、监控面板的首选起点。