自定义图形控件。第 2 部分 控件库(基础篇)
「从零搭一套 MT5 自定义控件库」
在 MT5 里做面板或 HUD,系统只给基础 OBJ_RECTANGLE、OBJ_LABEL 这类原生对象,复杂交互得自己封装。2013 年 Dmitry Fedoseev 发布的控件库示例,到今天仍能在 MT5 里直接编译跑通,说明底层图形接口没大改,老代码复用价值还在。 这套库把按钮、编辑框、滑块都做成类,开发者 new 一个对象就能挂到图表。对做价格行为辅助工具的交易者来说,比每次手搓几十行对象创建代码省事得多,尤其适合把小布盯盘的信号面板固化成可拖拽控件。 外汇和贵金属图表上叠自定义控件有高风险:对象层级没管好会挡 K 线,回测时更不能直接依赖界面控件出信号。建议先在 EURUSD 的 M1 上开个测试指标,确认控件刷新不卡顿再上实盘观察。
◍ GUI 库这次升级了什么
上一篇文章讲了图形控件的基础创建原则,这一版在此基础上把常用交互控件补齐了。绝大多数控件对标终端标准元素,少数针对 MT5 特性单独设计,全部以独立类形式塞进 IncGUI_v2.mqh(旧版叫 IncGUI.mqh)。 底层类有几处实打实的改动:CGraphicObjectShell 新增 SetXYDistance() 和 SetXYSize(),一次性同步坐标与尺寸,同时把方法名里的 Distanse 拼写错误修正为 Distance。CInputBox 里 SetValueStrind 改成 SetValueString,并加了 SetReadOnly() 和 ReadOnly()——前者开关键盘输入,后者返回当前是否只读。 CColorSchemes 的 Show() 调整了色板排布:方案竖排、颜色横排,因为新配色比原计划还多。该文件现共包含 16 个控件类,覆盖输入框、微调框、复选框、单选组、双向滚动条、列表与多选列表、下拉框、横竖菜单、进度条、拨号器及表格。 除 CInputBox 已在首篇详述外,其余控件都会结合调用示例逐个拆。开 MT5 把 IncGUI_v2.mqh 拖进 include 目录,就能直接 #include 验证这些类是否存在。
带步进按钮的数值输入框怎么玩
CSpinInputBox 是一个带 + / - 微调按钮的数值输入框,点一下按钮,框里的值就按你设的步长走一格,再点就继续加减。除了戳按钮,还能用 SetReadOnly(false) 放开键盘直输,手敲数字也行。 它继承自 CInputBox 并锁定在数值模式,边界靠 SetMaxValue() 和 SetMinValue() 卡死,和父类用法一致。区别在 Init():这里不传初始数字,而是传一个“变更”步长参数,这个步长同时决定小数位数和显示格式。 想用代码拿当前值就调 Value(),要改值用 SetValue(),而 Digits() 能告诉你现在按几位小数在显示。配套验证文件是 eIncGUI_v2_Test_CSpinInputBox.mq5,开 MT5 加载即可看实际步进表现,外汇贵金属面板开发里这类控件适合做手数或点数微调,注意杠杆品种误触步长可能引发大风险敞口。
「CCheckBox:两态开关的取数接口」
CCheckBox 是标准库里最轻量的控件之一,只承载布尔语义:要么 off 要么 on。off 时画面仅留一个空方框,on 时在框内补一道对勾,视觉状态与内部值严格一一对应。 想读状态就调 Value(),想改状态就调 SetValue()。这两个方法构成该类的核心存取接口,不依赖任何事件回调也能在 EA 逻辑里直接轮询。 实盘里常见用法是把「是否启用某过滤条件」绑到一个 CCheckBox 上,主循环每 tick 用 Value() 判断开关,避免写死宏常量。配套验证文件 eIncGUI_v2_Test_CCheckBox.mq5 已随库发布,开 MT5 加载即可看到两态切换与取值打印。
◍ 用 CRadioGroup 搭可任意排布的单选组
CRadioGroup 是标准库里专门做「多选一」的控件,典型场景是排序方式切换。它和别的 GUI 类一样,先调 Init() 并传入组名,再逐个塞按钮。 AddButton() 第一个参数是按钮右侧的说明文字,后面跟 X、Y 是相对整个组原点的坐标。这意味着组内按钮不必规整排成横排或竖排,你完全可以东一个西一个;之后只要挪组坐标,整组跟着走,不用重算每个按钮位置。 建完按钮用 SetValue() 指定默认选中项,索引从 0 开始按 AddButton 调用顺序递增;读当前选中用 Value()。想直接看跑起来的效果,打开随附的 eIncGUI_v2_Test_CRadioGroup.mq5 在 MT5 里编译运行即可。
垂直滚动条的取值与跳转逻辑
CVSсrollBar 是 MT5 自定义 GUI 里最常见的垂直滚动条封装,核心属性就四个:最小值 Min、最大值 Max 框定有效值域,SmallChange 管点上下按钮时的步进,LargeChange 管点滑块与按钮之间空白区时的一次跳变。 交互上除了常规点按,还能把滑块先点选(选中后变色)再点目标位置,滑块会直接跳过去并自动取消选中;要是误选了,再点一下滑块本身就能撤掉选中态。 一个容易踩的坑:滑块处于选中态时去点上下按钮,滑块会直接跑到 Max 或 Min 端点,控件值瞬间被拉满或归零,写面板逻辑时得防这种意外赋值。 初始化走 Init(名称, 高度, 条件尺寸1~4),随后用 SetMin/SetMax 设范围,SetSmallChange/SetLargeChange 设步长;读位置用 Value(),代码里强制定位滑块用 SetValue()。随附 eIncGUI_v2_Test_CVSсrollBar.mq5 可直接开 MT5 跑一遍验证上述行为。