如何使用MQL5的控件类创建交互式仪表板/面板(第一部分):设置面板·综合运用
🧩

如何使用MQL5的控件类创建交互式仪表板/面板(第一部分):设置面板·综合运用

(3/3)· 把导航、交易与信息三大区块焊进同一个EA面板,让图表不再只是K线

案例拆解新手友好 第 3/3 篇
很多人写完第一个按钮就以为面板成了,结果交易和止损控件各跑各的线程,点下去什么都没发生。MQL5的控件类不自动帮你管状态同步,漏掉事件绑定那一步,界面再好看也只是贴图。这篇收尾就把前面零散的零件拧成能用的整体。

◍ 在图表上搭一手交易参数输入面板

做半自动下单面板时,先得把手填的手数、止损、止盈控件画到主图。下面这段用 CTradeControls 风格的封装对象,在坐标 (40+偏移, 130/160) 附近落了三组「标签+编辑框」:手数默认 0.01、SL 默认 300 点、TP 编辑框宽 70 高 25。 标签统一用 Arial black 13 号字、白字;编辑框底色白、边框黑、字色黑,字体 Times new roman bold 13 号。手数框宽 50,SL/TP 框宽 70,高度都是 25——这些像素值直接决定你在 1080p 屏上能否一眼点中,建议开 MT5 把图表缩放到 100% 对着调。 外汇和贵金属杠杆高、滑点跳空频繁,面板里填的 SL=300 只是初始值,实盘里要按品种波动率重算,否则可能秒触止损。

MQL5 / C++
  obj_Lbl_LOTS.Create(class="num">0,Lbl_LOTS,class="num">0,class="num">40+class="num">160,class="num">130,class="num">0,class="num">0); class=class="str">"cmt">//--- Create the lot size label
  obj_Lbl_LOTS.Text("Lot size"); class=class="str">"cmt">//--- Set the label text
  obj_Lbl_LOTS.Color(clrWhite); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Lbl_LOTS.Font("Arial black"); class=class="str">"cmt">//--- Set the font style
  obj_Lbl_LOTS.FontSize(class="num">13); class=class="str">"cmt">//--- Set the font size  

  class=class="str">"cmt">//--- LOTS EDIT
  obj_Edit_LOTS.Create(class="num">0,Edit_LOTS,class="num">0,class="num">40+class="num">60+class="num">180,class="num">130,class="num">0,class="num">0); class=class="str">"cmt">//--- Create the lot size edit field
  obj_Edit_LOTS.Size(class="num">50,class="num">25); class=class="str">"cmt">//--- Set the edit field size
  obj_Edit_LOTS.ColorBackground(clrWhite); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
  obj_Edit_LOTS.ColorBorder(clrBlack); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Edit_LOTS.Text("class="num">0.01"); class=class="str">"cmt">//--- Set the class="kw">default text
  obj_Edit_LOTS.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Edit_LOTS.Font("Times new roman bold"); class=class="str">"cmt">//--- Set the font style
  obj_Edit_LOTS.FontSize(class="num">13); class=class="str">"cmt">//--- Set the font size

  class=class="str">"cmt">//--- SL LABEL
  obj_Lbl_SL.Create(class="num">0,Lbl_SL,class="num">0,class="num">40,class="num">160,class="num">0,class="num">0); class=class="str">"cmt">//--- Create the stop loss label
  obj_Lbl_SL.Text("SL"); class=class="str">"cmt">//--- Set the label text
  obj_Lbl_SL.Color(clrWhite); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Lbl_SL.Font("Arial black"); class=class="str">"cmt">//--- Set the font style
  obj_Lbl_SL.FontSize(class="num">13); class=class="str">"cmt">//--- Set the font size  

  class=class="str">"cmt">//--- SL EDIT
  obj_Edit_SL.Create(class="num">0,Edit_SL,class="num">0,class="num">40+class="num">30,class="num">160,class="num">0,class="num">0); class=class="str">"cmt">//--- Create the stop loss edit field
  obj_Edit_SL.Size(class="num">70,class="num">25); class=class="str">"cmt">//--- Set the edit field size
  obj_Edit_SL.ColorBackground(clrWhite); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
  obj_Edit_SL.ColorBorder(clrBlack); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Edit_SL.Text("class="num">300"); class=class="str">"cmt">//--- Set the class="kw">default text
  obj_Edit_SL.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Edit_SL.Font("Times new roman bold"); class=class="str">"cmt">//--- Set the font style
  obj_Edit_SL.FontSize(class="num">13); class=class="str">"cmt">//--- Set the font size

  class=class="str">"cmt">//--- TP LABEL
  obj_Lbl_TP.Create(class="num">0,Lbl_TP,class="num">0,class="num">40+class="num">190,class="num">160,class="num">0,class="num">0); class=class="str">"cmt">//--- Create the take profit label
  obj_Lbl_TP.Text("TP"); class=class="str">"cmt">//--- Set the label text
  obj_Lbl_TP.Color(clrWhite); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Lbl_TP.Font("Arial black"); class=class="str">"cmt">//--- Set the font style
  obj_Lbl_TP.FontSize(class="num">13); class=class="str">"cmt">//--- Set the font size  

  class=class="str">"cmt">//--- TP EDIT
  obj_Edit_TP.Create(class="num">0,Edit_TP,class="num">0,class="num">40+class="num">30+class="num">190,class="num">160,class="num">0,class="num">0); class=class="str">"cmt">//--- Create the take profit edit field
  obj_Edit_TP.Size(class="num">70,class="num">25); class=class="str">"cmt">//--- Set the edit field size
  obj_Edit_TP.ColorBackground(clrWhite); class=class="str">"cmt">//--- Set the background class="type">class="kw">color

「面板控件的外观与坐标落位」

在 MT5 自定义面板里,编辑框和按钮的视觉属性都得逐行钉死,否则实盘时一眼看错方向就麻烦。下面这段把止盈编辑框默认填了 750、边框与文字都用 clrBlack,字体锁 Times new roman bold、字号 13,属于偏稳重的显示配置。 按钮部分更讲究坐标与配色区分:Points 按钮落在 x=150、y=160 处,尺寸 70×25,背景 clrGoldenrod;Sell 按钮在 x=40、y=210,尺寸 100×25,背景 clrOrangeRed 配白字;Entry 按钮 x=150、y=210,背景同 Points;Buy 按钮 x=230、y=210,尺寸 100×25,背景 clrLimeGreen 配白字。所有按钮字体统一 Calibri bold、字号 14,这样扫一眼就能靠颜色判多空。 外汇与贵金属波动剧烈、杠杆高风险大,面板只是辅助下单的工具,真要批量挂单前先在策略测试器里跑一遍坐标覆盖,确认不挡 K 线再上真金。

MQL5 / C++
  obj_Edit_TP.ColorBorder(clrBlack); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Edit_TP.Text("class="num">750"); class=class="str">"cmt">//--- Set the class="kw">default text
  obj_Edit_TP.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Edit_TP.Font("Times new roman bold"); class=class="str">"cmt">//--- Set the font style
  obj_Edit_TP.FontSize(class="num">13); class=class="str">"cmt">//--- Set the font size

  class=class="str">"cmt">//--- POINTS BUTTON
  obj_Btn_POINTS.Create(class="num">0,Btn_POINTS,class="num">0,class="num">40+class="num">110,class="num">160,class="num">0,class="num">0); class=class="str">"cmt">//--- Create the points button
  obj_Btn_POINTS.Size(class="num">70,class="num">25); class=class="str">"cmt">//--- Set the button size
  obj_Btn_POINTS.ColorBackground(clrGoldenrod); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
  obj_Btn_POINTS.ColorBorder(clrGoldenrod); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Btn_POINTS.Text("Points"); class=class="str">"cmt">//--- Set the button text
  obj_Btn_POINTS.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Btn_POINTS.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
  obj_Btn_POINTS.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

  class=class="str">"cmt">//--- SELL BUTTON
  obj_Btn_SELL.Create(class="num">0,Btn_SELL,class="num">0,class="num">40,class="num">210,class="num">0,class="num">0); class=class="str">"cmt">//--- Create the sell button
  obj_Btn_SELL.Size(class="num">100,class="num">25); class=class="str">"cmt">//--- Set the button size
  obj_Btn_SELL.ColorBackground(clrOrangeRed); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
  obj_Btn_SELL.ColorBorder(clrOrangeRed); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Btn_SELL.Text("Sell"); class=class="str">"cmt">//--- Set the button text
  obj_Btn_SELL.Color(clrWhite); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Btn_SELL.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
  obj_Btn_SELL.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

  class=class="str">"cmt">//--- ENTRY BUTTON
  obj_Btn_ENTRY.Create(class="num">0,Btn_ENTRY,class="num">0,class="num">150,class="num">210,class="num">0,class="num">0); class=class="str">"cmt">//--- Create the entry button
  obj_Btn_ENTRY.Size(class="num">70,class="num">25); class=class="str">"cmt">//--- Set the button size
  obj_Btn_ENTRY.ColorBackground(clrGoldenrod); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
  obj_Btn_ENTRY.ColorBorder(clrGoldenrod); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Btn_ENTRY.Text("Entry"); class=class="str">"cmt">//--- Set the button text
  obj_Btn_ENTRY.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Btn_ENTRY.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
  obj_Btn_ENTRY.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

  class=class="str">"cmt">//--- BUY BUTTON
  obj_Btn_BUY.Create(class="num">0,Btn_BUY,class="num">0,class="num">40+class="num">190,class="num">210,class="num">0,class="num">0); class=class="str">"cmt">//--- Create the buy button
  obj_Btn_BUY.Size(class="num">100,class="num">25); class=class="str">"cmt">//--- Set the button size
  obj_Btn_BUY.ColorBackground(clrLimeGreen); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
  obj_Btn_BUY.ColorBorder(clrLimeGreen); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Btn_BUY.Text("Buy"); class=class="str">"cmt">//--- Set the button text
  obj_Btn_BUY.Color(clrWhite); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Btn_BUY.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
  obj_Btn_BUY.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

  class=class="str">"cmt">//--- SELL STOP BUTTON

挂单面板的四个按钮怎么排

在 MT5 里用 CButton 类画挂单快捷面板时,Sell Stop 与 Buy Stop 通常放在同一行,Sell Limit 与 Buy Limit 放在下一行,坐标靠左上角锚定。上面这段把 Sell Stop 放在 (40,240),Buy Stop 的 X 算成 40+190-40=190,也就是两个按钮水平间距 150 像素、自身宽 140,右边留 10 像素缝。 按钮尺寸统一设为 140×25,字体用 Calibri bold、字号 14,文字色白;止损类(Sell/Buy Stop)背景与边框用 clrOrangeRed / clrLimeGreen 区分买卖方向,限价类同理。这样一眼能分清挂单类型,也方便后面绑点击事件。 外汇和贵金属波动大,这类面板只是下单入口,真要发单还得在事件处理函数里校验点差和库存费,否则滑点可能吃掉策略空间。

MQL5 / C++
  obj_Btn_SELLSTOP.Create(class="num">0,Btn_SELLSTOP,class="num">0,class="num">40,class="num">240,class="num">0,class="num">0); class=class="str">"cmt">//--- Create the sell stop button
  obj_Btn_SELLSTOP.Size(class="num">140,class="num">25); class=class="str">"cmt">//--- Set the button size
  obj_Btn_SELLSTOP.ColorBackground(clrOrangeRed); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
  obj_Btn_SELLSTOP.ColorBorder(clrOrangeRed); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Btn_SELLSTOP.Text("Sell Stop"); class=class="str">"cmt">//--- Set the button text
  obj_Btn_SELLSTOP.Color(clrWhite); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Btn_SELLSTOP.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
  obj_Btn_SELLSTOP.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

  class=class="str">"cmt">//--- BUY STOP BUTTON
  obj_Btn_BUYSTOP.Create(class="num">0,Btn_BUYSTOP,class="num">0,class="num">40+class="num">190-class="num">40,class="num">240,class="num">0,class="num">0); class=class="str">"cmt">//--- Create the buy stop button
  obj_Btn_BUYSTOP.Size(class="num">140,class="num">25); class=class="str">"cmt">//--- Set the button size
  obj_Btn_BUYSTOP.ColorBackground(clrLimeGreen); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
  obj_Btn_BUYSTOP.ColorBorder(clrLimeGreen); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Btn_BUYSTOP.Text("Buy Stop"); class=class="str">"cmt">//--- Set the button text
  obj_Btn_BUYSTOP.Color(clrWhite); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Btn_BUYSTOP.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
  obj_Btn_BUYSTOP.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

  class=class="str">"cmt">//--- SELL LIMIT BUTTON
  obj_Btn_SELLLIMIT.Create(class="num">0,Btn_SELLLIMIT,class="num">0,class="num">40,class="num">270,class="num">0,class="num">0); class=class="str">"cmt">//--- Create the sell limit button
  obj_Btn_SELLLIMIT.Size(class="num">140,class="num">25); class=class="str">"cmt">//--- Set the button size
  obj_Btn_SELLLIMIT.ColorBackground(clrOrangeRed); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
  obj_Btn_SELLLIMIT.ColorBorder(clrOrangeRed); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Btn_SELLLIMIT.Text("Sell Limit"); class=class="str">"cmt">//--- Set the button text
  obj_Btn_SELLLIMIT.Color(clrWhite); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Btn_SELLLIMIT.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
  obj_Btn_SELLLIMIT.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

  class=class="str">"cmt">//--- BUY LIMIT BUTTON
  obj_Btn_BUYLIMIT.Create(class="num">0,Btn_BUYLIMIT,class="num">0,class="num">40+class="num">190-class="num">40,class="num">270,class="num">0,class="num">0); class=class="str">"cmt">//--- Create the buy limit button
  obj_Btn_BUYLIMIT.Size(class="num">140,class="num">25); class=class="str">"cmt">//--- Set the button size
  obj_Btn_BUYLIMIT.ColorBackground(clrLimeGreen); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
  obj_Btn_BUYLIMIT.ColorBorder(clrLimeGreen); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Btn_BUYLIMIT.Text("Buy Limit"); class=class="str">"cmt">//--- Set the button text
  obj_Btn_BUYLIMIT.Color(clrWhite); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Btn_BUYLIMIT.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
  obj_Btn_BUYLIMIT.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size
}
CButton obj_Btn_CLOSE_ALL;                                            class=class="str">"cmt">//--- Close All button object
CButton obj_Btn_CLOSE_ALL_SELL;                                       class=class="str">"cmt">//--- Close All Sell button object

◍ 一键平仓与账户面板的对象声明

在 MT5 自定义面板里,平仓和账户信息区通常先以对象变量形式声明,再于后续函数里绑定到具体坐标与事件。下面这段声明把平仓按钮和账户标签分成了两组,共 22 个界面对象。 平仓组有 15 个 CButton:覆盖平所有多单、平亏损空单、平亏损多单、平盈利空单、平盈利多单、平所有亏损、平所有盈利、平挂单,以及账户号、账户名、账户类型、杠杆、净值、余额、时间各一个按钮。 账户信息展示则用了 6 个 CLabel:账户号、账户名、账户类型、杠杆、净值、余额的文本标签,和上面按钮一一对应显示数值。 外汇与贵金属交易杠杆高、滑点大,这类一键平仓按钮若绑定了真实账户,误触可能在几秒内清空仓位,实盘前务必在策略测试器里先验证按钮逻辑。

MQL5 / C++
CButton obj_Btn_CLOSE_ALL_BUY;                                                                       class=class="str">"cmt">//--- Close All Buy button object
CButton obj_Btn_CLOSE_LOSS_SELL;                                                                     class=class="str">"cmt">//--- Close Loss Sell button object
CButton obj_Btn_CLOSE_LOSS_BUY;                                                                      class=class="str">"cmt">//--- Close Loss Buy button object
CButton obj_Btn_CLOSE_PROFIT_SELL;                                                                   class=class="str">"cmt">//--- Close Profit Sell button object
CButton obj_Btn_CLOSE_PROFIT_BUY;                                                                    class=class="str">"cmt">//--- Close Profit Buy button object
CButton obj_Btn_CLOSE_ALL_LOSS;                                                                      class=class="str">"cmt">//--- Close All Loss button object
CButton obj_Btn_CLOSE_ALL_PROFIT;                                                                    class=class="str">"cmt">//--- Close All Profit button object
CButton obj_Btn_CLOSE_PENDING;                                                                       class=class="str">"cmt">//--- Close Pending button object
class=class="str">"cmt">//--- 
CButton obj_Btn_ACC_NUMBER;                                                                          class=class="str">"cmt">//--- Account Number button object
CButton obj_Btn_ACC_NAME;                                                                            class=class="str">"cmt">//--- Account Name button object
CButton obj_Btn_ACC_TYPE;                                                                            class=class="str">"cmt">//--- Account Type button object
CButton obj_Btn_ACC_LEVERAGE;                                                                        class=class="str">"cmt">//--- Account Leverage button object
CButton obj_Btn_ACC_EQUITY;                                                                          class=class="str">"cmt">//--- Account Equity button object
CButton obj_Btn_ACC_BALANCE;                                                                         class=class="str">"cmt">//--- Account Balance button object
CButton obj_Btn_TIME;                                                                                class=class="str">"cmt">//--- Time button object
class=class="str">"cmt">//---
CLabel obj_Lbl_ACC_NUMBER;                                                                           class=class="str">"cmt">//--- Account Number label object
CLabel obj_Lbl_ACC_NAME;                                                                             class=class="str">"cmt">//--- Account Name label object
CLabel obj_Lbl_ACC_TYPE;                                                                             class=class="str">"cmt">//--- Account Type label object
CLabel obj_Lbl_ACC_LEVERAGE;                                                                         class=class="str">"cmt">//--- Account Leverage label object
CLabel obj_Lbl_ACC_EQUITY;                                                                           class=class="str">"cmt">//--- Account Equity label object
CLabel obj_Lbl_ACC_BALANCE;                                                                          class=class="str">"cmt">//--- Account Balance label object

「一键平仓面板的对象命名约定」

在 MT5 自建交易面板时,最容易被忽略的是控件 ID 的全局唯一性。上面这组宏把平仓按钮和账户信息标签统一用前缀 Btn_ / Lbl_ 定义,避免与图表上其他 EA 的对象名撞车。 从宏定义能看出面板覆盖了 13 类平仓动作:全平、按买卖方向平、按盈亏平、平挂单,以及分别针对亏损/盈利的卖单与买单。实际接 ChartRedraw 前,复制这组 #define 到头文件,改面板布局时只动字符串不碰逻辑。 账户区预留了号码、名称、类型、杠杆、净值、余额和时间共 7 个槽位,其中 Lbl_ACC_NUMBER 与 Btn_ACC_NUMBER 分离,意味着数值用静态标签、按钮可做点击复制。外汇与贵金属波动大,这类面板只负责执行,风控仍靠人工复核。

MQL5 / C++
CLabel obj_Lbl_TIME;                                                                       class=class="str">"cmt">//--- Time label object
class="macro">#define Btn_CLOSE_ALL "Btn_CLOSE_ALL"                                                          class=class="str">"cmt">//--- Button name for closing all trades
class="macro">#define Btn_CLOSE_ALL_SELL "Btn_CLOSE_ALL_SELL"                                                class=class="str">"cmt">//--- Button name for closing all sell trades
class="macro">#define Btn_CLOSE_ALL_BUY "Btn_CLOSE_ALL_BUY"                                                  class=class="str">"cmt">//--- Button name for closing all buy trades
class="macro">#define Btn_CLOSE_LOSS_SELL "Btn_CLOSE_LOSS_SELL"                                              class=class="str">"cmt">//--- Button name for closing all loss sell trades
class="macro">#define Btn_CLOSE_LOSS_BUY "Btn_CLOSE_LOSS_BUY"                                                class=class="str">"cmt">//--- Button name for closing all loss buy trades
class="macro">#define Btn_CLOSE_PROFIT_SELL "Btn_CLOSE_PROFIT_SELL"                                          class=class="str">"cmt">//--- Button name for closing all profit sell trades
class="macro">#define Btn_CLOSE_PROFIT_BUY "Btn_CLOSE_PROFIT_BUY"                                            class=class="str">"cmt">//--- Button name for closing all profit buy trades
class="macro">#define Btn_CLOSE_ALL_LOSS "Btn_CLOSE_ALL_LOSS"                                                class=class="str">"cmt">//--- Button name for closing all loss trades
class="macro">#define Btn_CLOSE_ALL_PROFIT "Btn_CLOSE_ALL_PROFIT"                                            class=class="str">"cmt">//--- Button name for closing all profit trades
class="macro">#define Btn_CLOSE_PENDING "Btn_CLOSE_PENDING"                                                  class=class="str">"cmt">//--- Button name for closing all pending trades
class="macro">#define Btn_ACC_NUMBER "Btn_ACC_NUMBER"                                                        class=class="str">"cmt">//--- Button name for the account number
class="macro">#define Btn_ACC_NAME "Btn_ACC_NAME"                                                            class=class="str">"cmt">//--- Button name for the account name
class="macro">#define Btn_ACC_TYPE "Btn_ACC_TYPE"                                                            class=class="str">"cmt">//--- Button name for the account type
class="macro">#define Btn_ACC_LEVERAGE "Btn_ACC_LEVERAGE"                                                    class=class="str">"cmt">//--- Button name for the account leverage
class="macro">#define Btn_ACC_EQUITY "Btn_ACC_EQUITY"                                                        class=class="str">"cmt">//--- Button name for the account equity
class="macro">#define Btn_ACC_BALANCE "Btn_ACC_BALANCE"                                                      class=class="str">"cmt">//--- Button name for the account balance
class="macro">#define Btn_TIME "Btn_TIME"                                                                    class=class="str">"cmt">//--- Button name for the time
class=class="str">"cmt">//---
class="macro">#define Lbl_ACC_NUMBER "Lbl_ACC_NUMBER"                                                        class=class="str">"cmt">//--- Label name for the account number
class="macro">#define Lbl_ACC_NAME "Lbl_ACC_NAME"                                                            class=class="str">"cmt">//--- Label name for the account name

一键平仓面板的按钮布局

在 MT5 自定义面板里批量平仓,最直观的做法是把「全平 / 只平多 / 只平空」做成三个独立按钮。下面这段创建逻辑把三个按钮的坐标和尺寸写死在代码里,开 MT5 挂上 EA 就能看到实际排布。 先定义一组标签宏,用来标记账户类型、杠杆、净值、余额和时间,方便后续在面板文本区引用,不影响按钮功能本身。 createSection_Close 函数里,Close All 按钮锚点在 (80,120),宽 210 高 25,底色 clrPeru;Close All Sell 在 (40,150),宽 140,底色 clrSalmon;Close All Buy 在 (190,150),宽 140,底色 clrMediumSeaGreen。三个按钮都用 Calibri bold 14 号字、白边黑字,视觉上多空和平仓总控一眼能区分。 外汇和贵金属杠杆高,这类一键全平按钮误触可能造成快速回撤,实盘前建议在策略测试器里先验证坐标是否被其他控件遮挡。

MQL5 / C++
class="macro">#define Lbl_ACC_TYPE "Lbl_ACC_TYPE"                      class=class="str">"cmt">//--- Label name for the account type
class="macro">#define Lbl_ACC_LEVERAGE "Lbl_ACC_LEVERAGE"                class=class="str">"cmt">//--- Label name for the account leverage
class="macro">#define Lbl_ACC_EQUITY "Lbl_ACC_EQUITY"                    class=class="str">"cmt">//--- Label name for the account equity
class="macro">#define Lbl_ACC_BALANCE "Lbl_ACC_BALANCE"                  class=class="str">"cmt">//--- Label name for the account balance
class="macro">#define Lbl_TIME "Lbl_TIME"                                class=class="str">"cmt">//--- Label name for the time
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|      FUNCTION TO CREATE THE CLOSE SECTION                        |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void createSection_Close(){
   class=class="str">"cmt">//--- CLOSE ALL BUTTON
   obj_Btn_CLOSE_ALL.Create(class="num">0, Btn_CLOSE_ALL, class="num">0, class="num">80, class="num">120, class="num">0, class="num">0); class=class="str">"cmt">//--- Create the close all button
   obj_Btn_CLOSE_ALL.Size(class="num">210, class="num">25); class=class="str">"cmt">//--- Set the button size
   obj_Btn_CLOSE_ALL.ColorBackground(clrPeru); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
   obj_Btn_CLOSE_ALL.ColorBorder(clrWhite); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
   obj_Btn_CLOSE_ALL.Text("Close All"); class=class="str">"cmt">//--- Set the button text
   obj_Btn_CLOSE_ALL.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
   obj_Btn_CLOSE_ALL.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
   obj_Btn_CLOSE_ALL.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

   class=class="str">"cmt">//--- CLOSE ALL SELL BUTTON
   obj_Btn_CLOSE_ALL_SELL.Create(class="num">0, Btn_CLOSE_ALL_SELL, class="num">0, class="num">40, class="num">150, class="num">0, class="num">0); class=class="str">"cmt">//--- Create the close all sell button
   obj_Btn_CLOSE_ALL_SELL.Size(class="num">140, class="num">25); class=class="str">"cmt">//--- Set the button size
   obj_Btn_CLOSE_ALL_SELL.ColorBackground(clrSalmon); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
   obj_Btn_CLOSE_ALL_SELL.ColorBorder(clrWhite); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
   obj_Btn_CLOSE_ALL_SELL.Text("Close All Sell"); class=class="str">"cmt">//--- Set the button text
   obj_Btn_CLOSE_ALL_SELL.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
   obj_Btn_CLOSE_ALL_SELL.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
   obj_Btn_CLOSE_ALL_SELL.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

   class=class="str">"cmt">//--- CLOSE ALL BUY BUTTON
   obj_Btn_CLOSE_ALL_BUY.Create(class="num">0, Btn_CLOSE_ALL_BUY, class="num">0, class="num">190, class="num">150, class="num">0, class="num">0); class=class="str">"cmt">//--- Create the close all buy button
   obj_Btn_CLOSE_ALL_BUY.Size(class="num">140, class="num">25); class=class="str">"cmt">//--- Set the button size
   obj_Btn_CLOSE_ALL_BUY.ColorBackground(clrMediumSeaGreen); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
   obj_Btn_CLOSE_ALL_BUY.ColorBorder(clrWhite); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
   obj_Btn_CLOSE_ALL_BUY.Text("Close All Buy"); class=class="str">"cmt">//--- Set the button text
   obj_Btn_CLOSE_ALL_BUY.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
   obj_Btn_CLOSE_ALL_BUY.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
   obj_Btn_CLOSE_ALL_BUY.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

◍ 按盈亏方向拆出的平仓按钮布局

在 MT5 图表上做一键平仓面板时,把「平亏损卖单」「平亏损买单」「平盈利卖单」「平盈利买单」拆成四个独立按钮,比单个全平按钮更利于手动风控。上面这段对象初始化把每个按钮的锚点坐标、尺寸和配色都写死了,可直接拷进 EA 的 OnCreate 里验证。 四个按钮统一用 140×25 像素、Calibri bold 14 号字,文字色全是 clrBlack,边框统一 clrWhite。亏损类背景用 clrSalmon(鲑红),盈利类用 clrMediumSeaGreen(海绿),视觉上把「割肉」和「落袋」区分开,扫一眼就知道点哪边。 坐标排布上有个细节:亏损卖/盈利卖的 X 锚点是 40,亏损买/盈利买的 X 锚点是 190;Y 轴上亏损对落在 180,盈利对落在 210。也就是说同方向盈亏按钮上下错开 30 像素,不同方向左右错开 150 像素,四颗按钮刚好铺成 2×2 矩阵,不会重叠。 外汇和贵金属杠杆高、滑点可能瞬间吃掉预期,这种按钮只解决「点得快」,不解决「该不该平」。真要挂实盘,先开模拟账户把坐标和颜色跑一遍,确认面板在你屏幕分辨率下没被遮挡再说。

MQL5 / C++
  obj_Btn_CLOSE_ALL_BUY.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
  obj_Btn_CLOSE_ALL_BUY.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

  class=class="str">"cmt">//--- CLOSE LOSS SELL BUTTON
  obj_Btn_CLOSE_LOSS_SELL.Create(class="num">0, Btn_CLOSE_LOSS_SELL, class="num">0, class="num">40, class="num">180, class="num">0, class="num">0); class=class="str">"cmt">//--- Create the close loss sell button
  obj_Btn_CLOSE_LOSS_SELL.Size(class="num">140, class="num">25); class=class="str">"cmt">//--- Set the button size
  obj_Btn_CLOSE_LOSS_SELL.ColorBackground(clrSalmon); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
  obj_Btn_CLOSE_LOSS_SELL.ColorBorder(clrWhite); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Btn_CLOSE_LOSS_SELL.Text("Close Loss Sell"); class=class="str">"cmt">//--- Set the button text
  obj_Btn_CLOSE_LOSS_SELL.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Btn_CLOSE_LOSS_SELL.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
  obj_Btn_CLOSE_LOSS_SELL.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

  class=class="str">"cmt">//--- CLOSE LOSS BUY BUTTON
  obj_Btn_CLOSE_LOSS_BUY.Create(class="num">0, Btn_CLOSE_LOSS_BUY, class="num">0, class="num">190, class="num">180, class="num">0, class="num">0); class=class="str">"cmt">//--- Create the close loss buy button
  obj_Btn_CLOSE_LOSS_BUY.Size(class="num">140, class="num">25); class=class="str">"cmt">//--- Set the button size
  obj_Btn_CLOSE_LOSS_BUY.ColorBackground(clrMediumSeaGreen); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
  obj_Btn_CLOSE_LOSS_BUY.ColorBorder(clrWhite); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Btn_CLOSE_LOSS_BUY.Text("Close Loss Buy"); class=class="str">"cmt">//--- Set the button text
  obj_Btn_CLOSE_LOSS_BUY.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Btn_CLOSE_LOSS_BUY.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
  obj_Btn_CLOSE_LOSS_BUY.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

  class=class="str">"cmt">//--- CLOSE PROFIT SELL BUTTON
  obj_Btn_CLOSE_PROFIT_SELL.Create(class="num">0, Btn_CLOSE_PROFIT_SELL, class="num">0, class="num">40, class="num">210, class="num">0, class="num">0); class=class="str">"cmt">//--- Create the close profit sell button
  obj_Btn_CLOSE_PROFIT_SELL.Size(class="num">140, class="num">25); class=class="str">"cmt">//--- Set the button size
  obj_Btn_CLOSE_PROFIT_SELL.ColorBackground(clrSalmon); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
  obj_Btn_CLOSE_PROFIT_SELL.ColorBorder(clrWhite); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Btn_CLOSE_PROFIT_SELL.Text("Close Profit Sell"); class=class="str">"cmt">//--- Set the button text
  obj_Btn_CLOSE_PROFIT_SELL.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Btn_CLOSE_PROFIT_SELL.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
  obj_Btn_CLOSE_PROFIT_SELL.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

  class=class="str">"cmt">//--- CLOSE PROFIT BUY BUTTON
  obj_Btn_CLOSE_PROFIT_BUY.Create(class="num">0, Btn_CLOSE_PROFIT_BUY, class="num">0, class="num">190, class="num">210, class="num">0, class="num">0); class=class="str">"cmt">//--- Create the close profit buy button
  obj_Btn_CLOSE_PROFIT_BUY.Size(class="num">140, class="num">25); class=class="str">"cmt">//--- Set the button size
  obj_Btn_CLOSE_PROFIT_BUY.ColorBackground(clrMediumSeaGreen); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
  obj_Btn_CLOSE_PROFIT_BUY.ColorBorder(clrWhite); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
  obj_Btn_CLOSE_PROFIT_BUY.Text("Close Profit Buy"); class=class="str">"cmt">//--- Set the button text
  obj_Btn_CLOSE_PROFIT_BUY.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
  obj_Btn_CLOSE_PROFIT_BUY.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
  obj_Btn_CLOSE_PROFIT_BUY.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

「一键平仓面板的按钮与账户标签绘制」

在 MT5 自定义面板里批量平仓最忌讳手点错单,把「砍亏损」「平盈利」「撤挂单」做成独立按钮能直接降低误操作概率。下面这段对象创建代码把三个按钮排在图表右侧坐标 (240,40) 起纵向分布,亏损按钮用 Salmon 红、盈利用 SeaGreen、挂单用 Peru 棕,尺寸分别是 140x25 和 210x25,字体统一 Calibri bold 14 号。 //--- CLOSE ALL LOSS BUTTON obj_Btn_CLOSE_ALL_LOSS.Create(0, Btn_CLOSE_ALL_LOSS, 0, 40, 240, 0, 0); // 在图表子窗口0、坐标X40 Y240处创建亏损平仓按钮对象 obj_Btn_CLOSE_ALL_LOSS.Size(140, 25); // 按钮宽140高25像素 obj_Btn_CLOSE_ALL_LOSS.ColorBackground(clrSalmon); // 背景填鲑鱼红 obj_Btn_CLOSE_ALL_LOSS.ColorBorder(clrWhite); // 边框白色 obj_Btn_CLOSE_ALL_LOSS.Text("CLOSE LOSS"); // 显示文字CLOSE LOSS obj_Btn_CLOSE_ALL_LOSS.Color(clrBlack); // 文字黑色 obj_Btn_CLOSE_ALL_LOSS.Font("Calibri bold"); // 粗体Calibri obj_Btn_CLOSE_ALL_LOSS.FontSize(14); // 字号14 //--- CLOSE ALL PROFIT BUTTON obj_Btn_CLOSE_ALL_PROFIT.Create(0, Btn_CLOSE_ALL_PROFIT, 0, 190, 240, 0, 0); // 盈利按钮放在Y190位置 obj_Btn_CLOSE_ALL_PROFIT.Size(140, 25); // 同尺寸140x25 obj_Btn_CLOSE_ALL_PROFIT.ColorBackground(clrMediumSeaGreen); // 背景海中绿 obj_Btn_CLOSE_ALL_PROFIT.ColorBorder(clrWhite); // 白边 obj_Btn_CLOSE_ALL_PROFIT.Text("CLOSE PROFIT"); // 文字CLOSE PROFIT obj_Btn_CLOSE_ALL_PROFIT.Color(clrBlack); // 黑字 obj_Btn_CLOSE_ALL_PROFIT.Font("Calibri bold"); // 粗体 obj_Btn_CLOSE_ALL_PROFIT.FontSize(14); // 14号 //--- CLOSE ALL PENDING BUTTON obj_Btn_CLOSE_PENDING.Create(0, Btn_CLOSE_PENDING, 0, 80, 270, 0, 0); // 撤挂单按钮Y80 X270 obj_Btn_CLOSE_PENDING.Size(210, 25); // 更宽210适配长文字 obj_Btn_CLOSE_PENDING.ColorBackground(clrPeru); // 秘鲁棕背景 obj_Btn_CLOSE_PENDING.ColorBorder(clrWhite); // 白边 obj_Btn_CLOSE_PENDING.Text("Close All Pending"); // 英文原样 obj_Btn_CLOSE_PENDING.Color(clrBlack); // 黑字 obj_Btn_CLOSE_PENDING.Font("Calibri bold"); // 粗体 obj_Btn_CLOSE_PENDING.FontSize(14); // 14号 面板主体用 createSection_Close() 调出平仓区,信息区函数则单独列账户号标签:obj_Lbl_ACC_NUMBER 在 (100,40) 起创建,白字粗体14号显示「Account Number」。外汇与贵金属杠杆高,这类一键脚本若绑定实盘账户,误触可能在几秒内清空持仓,建议先在策略测试器或模拟账户验证按钮事件回调。

MQL5 / C++
class=class="str">"cmt">//--- CLOSE ALL LOSS BUTTON
obj_Btn_CLOSE_ALL_LOSS.Create(class="num">0, Btn_CLOSE_ALL_LOSS, class="num">0, class="num">40, class="num">240, class="num">0, class="num">0); class=class="str">"cmt">//--- Create the close all loss button
obj_Btn_CLOSE_ALL_LOSS.Size(class="num">140, class="num">25); class=class="str">"cmt">//--- Set the button size
obj_Btn_CLOSE_ALL_LOSS.ColorBackground(clrSalmon); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
obj_Btn_CLOSE_ALL_LOSS.ColorBorder(clrWhite); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
obj_Btn_CLOSE_ALL_LOSS.Text("CLOSE LOSS"); class=class="str">"cmt">//--- Set the button text
obj_Btn_CLOSE_ALL_LOSS.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
obj_Btn_CLOSE_ALL_LOSS.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
obj_Btn_CLOSE_ALL_LOSS.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

class=class="str">"cmt">//--- CLOSE ALL PROFIT BUTTON
obj_Btn_CLOSE_ALL_PROFIT.Create(class="num">0, Btn_CLOSE_ALL_PROFIT, class="num">0, class="num">190, class="num">240, class="num">0, class="num">0); class=class="str">"cmt">//--- Create the close all profit button
obj_Btn_CLOSE_ALL_PROFIT.Size(class="num">140, class="num">25); class=class="str">"cmt">//--- Set the button size
obj_Btn_CLOSE_ALL_PROFIT.ColorBackground(clrMediumSeaGreen); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
obj_Btn_CLOSE_ALL_PROFIT.ColorBorder(clrWhite); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
obj_Btn_CLOSE_ALL_PROFIT.Text("CLOSE PROFIT"); class=class="str">"cmt">//--- Set the button text
obj_Btn_CLOSE_ALL_PROFIT.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
obj_Btn_CLOSE_ALL_PROFIT.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
obj_Btn_CLOSE_ALL_PROFIT.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size

class=class="str">"cmt">//--- CLOSE ALL PENDING BUTTON
obj_Btn_CLOSE_PENDING.Create(class="num">0, Btn_CLOSE_PENDING, class="num">0, class="num">80, class="num">270, class="num">0, class="num">0); class=class="str">"cmt">//--- Create the close all pending button
obj_Btn_CLOSE_PENDING.Size(class="num">210, class="num">25); class=class="str">"cmt">//--- Set the button size
obj_Btn_CLOSE_PENDING.ColorBackground(clrPeru); class=class="str">"cmt">//--- Set the background class="type">class="kw">color
obj_Btn_CLOSE_PENDING.ColorBorder(clrWhite); class=class="str">"cmt">//--- Set the border class="type">class="kw">color
obj_Btn_CLOSE_PENDING.Text("Close All Pending"); class=class="str">"cmt">//--- Set the button text
obj_Btn_CLOSE_PENDING.Color(clrBlack); class=class="str">"cmt">//--- Set the text class="type">class="kw">color
obj_Btn_CLOSE_PENDING.Font("Calibri bold"); class=class="str">"cmt">//--- Set the font style
obj_Btn_CLOSE_PENDING.FontSize(class="num">14); class=class="str">"cmt">//--- Set the font size
}

class=class="str">"cmt">// BODY OF THE PANEL
class=class="str">"cmt">//createSection_Trade(); //--- Call function to create the trade section
createSection_Close(); class=class="str">"cmt">//--- Call function to create the close section
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|          FUNCTION TO CREATE THE INFO SECTION                    |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void createSection_Information() {
class=class="str">"cmt">//--- Create Account Number Label
obj_Lbl_ACC_NUMBER.Create(class="num">0, Lbl_ACC_NUMBER, class="num">0, class="num">40, class="num">100, class="num">0, class="num">0); class=class="str">"cmt">//--- Initialize label for Account Number
obj_Lbl_ACC_NUMBER.Text("Account Number"); class=class="str">"cmt">//--- Set label text to "Account Number"
obj_Lbl_ACC_NUMBER.Color(clrWhite); class=class="str">"cmt">//--- Set label class="type">class="kw">color to white
obj_Lbl_ACC_NUMBER.Font("Calibri bold"); class=class="str">"cmt">//--- Set label font to Calibri bold
obj_Lbl_ACC_NUMBER.FontSize(class="num">14); class=class="str">"cmt">//--- Set label font size to class="num">14

把账户信息钉在图表左上角

做面板时最容易被忽略的是账户基础信息的实时呈现。下面这段在坐标 (40+140, 100+2) 处画了一个 150×20 的按钮,背景用 Gainsboro、边框白色,直接把登录账号用 IntegerToString(AccountInfoInteger(ACCOUNT_LOGIN)) 刷进文本,字体 Calibri bold、字号 13,黑字白边在深色图表上辨识度够用。 账号名和账户类型走的是同样套路,但位置往下挪了 25 像素:标签在 y=125 / y=150,按钮则分别偏移 122 和 112 像素。账户名按钮宽度拉到 170,文本取 AccountInfoString(ACCOUNT_SERVER) 显示服务器名;账户类型按钮宽 180,背景同样 Gainsboro。 这几个对象创建完,图表左上就会常驻一组账号面板。外汇和贵金属交易杠杆高、滑点随机,面板只做信息展示不替你下单,真要批量盯多账户建议自己跑一遍看坐标是否撞到其他 HUD。

MQL5 / C++
  class=class="str">"cmt">//--- Create Account Number Button
  obj_Btn_ACC_NUMBER.Create(class="num">0, Btn_ACC_NUMBER, class="num">0, class="num">40 + class="num">140, class="num">100 + class="num">2, class="num">0, class="num">0); class=class="str">"cmt">//--- Initialize button for Account Number
  obj_Btn_ACC_NUMBER.Size(class="num">150, class="num">20); class=class="str">"cmt">//--- Set button size to 150x20
  obj_Btn_ACC_NUMBER.ColorBackground(clrGainsboro); class=class="str">"cmt">//--- Set button background class="type">class="kw">color to Gainsboro
  obj_Btn_ACC_NUMBER.ColorBorder(clrWhite); class=class="str">"cmt">//--- Set button border class="type">class="kw">color to white
  obj_Btn_ACC_NUMBER.Text(IntegerToString(AccountInfoInteger(ACCOUNT_LOGIN))); class=class="str">"cmt">//--- Set button text with account number
  obj_Btn_ACC_NUMBER.Color(clrBlack); class=class="str">"cmt">//--- Set button text class="type">class="kw">color to black
  obj_Btn_ACC_NUMBER.Font("Calibri bold"); class=class="str">"cmt">//--- Set button font to Calibri bold
  obj_Btn_ACC_NUMBER.FontSize(class="num">13); class=class="str">"cmt">//--- Set button font size to class="num">13
}
  class=class="str">"cmt">//--- Create Account Name Label
  obj_Lbl_ACC_NAME.Create(class="num">0, Lbl_ACC_NAME, class="num">0, class="num">40, class="num">125, class="num">0, class="num">0); class=class="str">"cmt">//--- Initialize label for Account Name
  obj_Lbl_ACC_NAME.Text("Account Name"); class=class="str">"cmt">//--- Set label text to "Account Name"
  obj_Lbl_ACC_NAME.Color(clrWhite); class=class="str">"cmt">//--- Set label class="type">class="kw">color to white
  obj_Lbl_ACC_NAME.Font("Calibri bold"); class=class="str">"cmt">//--- Set label font to Calibri bold
  obj_Lbl_ACC_NAME.FontSize(class="num">14); class=class="str">"cmt">//--- Set label font size to class="num">14
  class=class="str">"cmt">//--- Create Account Name Button
  obj_Btn_ACC_NAME.Create(class="num">0, Btn_ACC_NAME, class="num">0, class="num">40 + class="num">120, class="num">125 + class="num">2, class="num">0, class="num">0); class=class="str">"cmt">//--- Initialize button for Account Name
  obj_Btn_ACC_NAME.Size(class="num">170, class="num">20); class=class="str">"cmt">//--- Set button size to 170x20
  obj_Btn_ACC_NAME.ColorBackground(clrGainsboro); class=class="str">"cmt">//--- Set button background class="type">class="kw">color to Gainsboro
  obj_Btn_ACC_NAME.ColorBorder(clrWhite); class=class="str">"cmt">//--- Set button border class="type">class="kw">color to white
  obj_Btn_ACC_NAME.Text(AccountInfoString(ACCOUNT_SERVER)); class=class="str">"cmt">//--- Set button text with account server name
  obj_Btn_ACC_NAME.Color(clrBlack); class=class="str">"cmt">//--- Set button text class="type">class="kw">color to black
  obj_Btn_ACC_NAME.Font("Calibri bold"); class=class="str">"cmt">//--- Set button font to Calibri bold
  obj_Btn_ACC_NAME.FontSize(class="num">13); class=class="str">"cmt">//--- Set button font size to class="num">13
  class=class="str">"cmt">//--- Create Account Type Label
  obj_Lbl_ACC_TYPE.Create(class="num">0, Lbl_ACC_TYPE, class="num">0, class="num">40, class="num">150, class="num">0, class="num">0); class=class="str">"cmt">//--- Initialize label for Account Type
  obj_Lbl_ACC_TYPE.Text("Account Type"); class=class="str">"cmt">//--- Set label text to "Account Type"
  obj_Lbl_ACC_TYPE.Color(clrWhite); class=class="str">"cmt">//--- Set label class="type">class="kw">color to white
  obj_Lbl_ACC_TYPE.Font("Calibri bold"); class=class="str">"cmt">//--- Set label font to Calibri bold
  obj_Lbl_ACC_TYPE.FontSize(class="num">14); class=class="str">"cmt">//--- Set label font size to class="num">14
  class=class="str">"cmt">//--- Create Account Type Button
  obj_Btn_ACC_TYPE.Create(class="num">0, Btn_ACC_TYPE, class="num">0, class="num">40 + class="num">110, class="num">150 + class="num">2, class="num">0, class="num">0); class=class="str">"cmt">//--- Initialize button for Account Type
  obj_Btn_ACC_TYPE.Size(class="num">180, class="num">20); class=class="str">"cmt">//--- Set button size to 180x20
  obj_Btn_ACC_TYPE.ColorBackground(clrGainsboro); class=class="str">"cmt">//--- Set button background class="type">class="kw">color to Gainsboro

◍ 在面板里把账户类型与杠杆读出来

做 MT5 自定义面板时,账户基础信息最好用按钮对象实时呈现,避免交易者切窗口去账户栏翻看。下面这段把交易模式(demo / contest / real)和杠杆直接写进 GUI 控件,逻辑不复杂但容易漏掉类型强转。 先取 ACCOUNT_TRADE_MODE 整型再转成 ENUM_ACCOUNT_TRADE_MODE 枚举,switch 里未命中前两种就一律按真实账户处理;按钮文字用 trade_mode 变量填充,边框白色、文字黑色、Calibri bold 13 号,视觉上能和标签区分开。 杠杆部分更简单:AccountInfoInteger(ACCOUNT_LEVERAGE) 拿到整数后用 IntegerToString 转字符串塞进按钮,背景 Gainsboro、尺寸 140x20。外汇和贵金属保证金随杠杆波动,高杠杆意味着强平概率倾向升高,开实盘前应在面板确认该数值。 权益标签用了 Aqua 配 Cooper Black,纯粹是面板配色分层,和取数无关;如果你复制代码,记得 obj_Lbl_ACC_EQUITY 后面的按钮创建段原文被截断,需要自己补 Create / Size / Text 调用才能编译过。

MQL5 / C++
  obj_Btn_ACC_TYPE.ColorBorder(clrWhite); class=class="str">"cmt">//--- Set button border class="type">class="kw">color to white
  ENUM_ACCOUNT_TRADE_MODE account_type = (ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE); class=class="str">"cmt">//--- Retrieve account type
  class="type">class="kw">string trade_mode; class=class="str">"cmt">//--- Initialize variable for trade mode description
  class="kw">switch (account_type) { class=class="str">"cmt">//--- Determine account type
    case ACCOUNT_TRADE_MODE_DEMO: trade_mode = "Demo Account"; break; class=class="str">"cmt">//--- Set trade_mode for Demo account
    case ACCOUNT_TRADE_MODE_CONTEST: trade_mode = "Contest Account"; break; class=class="str">"cmt">//--- Set trade_mode for Contest account
    class="kw">default: trade_mode = "Real Account"; break; class=class="str">"cmt">//--- Set trade_mode for Real account
  }
  obj_Btn_ACC_TYPE.Text(trade_mode); class=class="str">"cmt">//--- Set button text to account type description
  obj_Btn_ACC_TYPE.Color(clrBlack); class=class="str">"cmt">//--- Set button text class="type">class="kw">color to black
  obj_Btn_ACC_TYPE.Font("Calibri bold"); class=class="str">"cmt">//--- Set button font to Calibri bold
  obj_Btn_ACC_TYPE.FontSize(class="num">13); class=class="str">"cmt">//--- Set button font size to class="num">13

  class=class="str">"cmt">//--- Create Account Leverage Label
  obj_Lbl_ACC_LEVERAGE.Create(class="num">0, Lbl_ACC_LEVERAGE, class="num">0, class="num">40, class="num">175, class="num">0, class="num">0); class=class="str">"cmt">//--- Initialize label for Account Leverage
  obj_Lbl_ACC_LEVERAGE.Text("Account Leverage"); class=class="str">"cmt">//--- Set label text to "Account Leverage"
  obj_Lbl_ACC_LEVERAGE.Color(clrWhite); class=class="str">"cmt">//--- Set label class="type">class="kw">color to white
  obj_Lbl_ACC_LEVERAGE.Font("Calibri bold"); class=class="str">"cmt">//--- Set label font to Calibri bold
  obj_Lbl_ACC_LEVERAGE.FontSize(class="num">14); class=class="str">"cmt">//--- Set label font size to class="num">14
  class=class="str">"cmt">//--- Create Account Leverage Button
  obj_Btn_ACC_LEVERAGE.Create(class="num">0, Btn_ACC_LEVERAGE, class="num">0, class="num">40 + class="num">150, class="num">175 + class="num">2, class="num">0, class="num">0); class=class="str">"cmt">//--- Initialize button for Account Leverage
  obj_Btn_ACC_LEVERAGE.Size(class="num">140, class="num">20); class=class="str">"cmt">//--- Set button size to 140x20
  obj_Btn_ACC_LEVERAGE.ColorBackground(clrGainsboro); class=class="str">"cmt">//--- Set button background class="type">class="kw">color to Gainsboro
  obj_Btn_ACC_LEVERAGE.ColorBorder(clrWhite); class=class="str">"cmt">//--- Set button border class="type">class="kw">color to white
  obj_Btn_ACC_LEVERAGE.Text(IntegerToString(AccountInfoInteger(ACCOUNT_LEVERAGE))); class=class="str">"cmt">//--- Set button text with account leverage
  obj_Btn_ACC_LEVERAGE.Color(clrBlack); class=class="str">"cmt">//--- Set button text class="type">class="kw">color to black
  obj_Btn_ACC_LEVERAGE.Font("Calibri bold"); class=class="str">"cmt">//--- Set button font to Calibri bold
  obj_Btn_ACC_LEVERAGE.FontSize(class="num">13); class=class="str">"cmt">//--- Set button font size to class="num">13
  class=class="str">"cmt">//--- Create Account Equity Label
  obj_Lbl_ACC_EQUITY.Create(class="num">0, Lbl_ACC_EQUITY, class="num">0, class="num">40, class="num">220, class="num">0, class="num">0); class=class="str">"cmt">//--- Initialize label for Account Equity
  obj_Lbl_ACC_EQUITY.Text("Account Equity"); class=class="str">"cmt">//--- Set label text to "Account Equity"
  obj_Lbl_ACC_EQUITY.Color(clrAqua); class=class="str">"cmt">//--- Set label class="type">class="kw">color to Aqua
  obj_Lbl_ACC_EQUITY.Font("Cooper Black"); class=class="str">"cmt">//--- Set label font to Cooper Black
  obj_Lbl_ACC_EQUITY.FontSize(class="num">14); class=class="str">"cmt">//--- Set label font size to class="num">14
  class=class="str">"cmt">//--- Create Account Equity Button

「在图表上钉死权益、余额与服务器时间」

做价格行为分析时,账户权益和服务器时间若不在图表一眼可见,就容易在手动复盘时漏掉关键上下文。下面这段 MT5 面板初始化代码,把 Equity、Balance、Server Time 三个只读字段直接画到主图左侧,坐标 Y 从 220 到 270 像素逐行排开。 权益按钮的文本用 DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY),2) 取两位小数,背景黑、边框 BlanchedAlmond、白字 Times New Roman Bold 13 号;余额按钮复用同一套样式,仅 Y 坐标下移 25 像素到 245。两个按钮宽度均设 120、高 20,X 基址 40 再右偏 170,实际落点在 210。 服务器时间标签用 Lime 色 Cooper Black 14 号字,按钮宽度拉到 170 以容纳时分秒字符串,X 偏移改为 +120 故落点 160。外汇与贵金属杠杆高,这类面板只做状态展示,不代替风控,实盘前请在策略测试器或模拟盘确认坐标不被其他指标遮挡。

MQL5 / C++
  obj_Btn_ACC_EQUITY.Create(class="num">0, Btn_ACC_EQUITY, class="num">0, class="num">40 + class="num">170, class="num">220 + class="num">2, class="num">0, class="num">0); class=class="str">"cmt">//--- Initialize button for Account Equity
  obj_Btn_ACC_EQUITY.Size(class="num">120, class="num">20); class=class="str">"cmt">//--- Set button size to 120x20
  obj_Btn_ACC_EQUITY.ColorBackground(clrBlack); class=class="str">"cmt">//--- Set button background class="type">class="kw">color to black
  obj_Btn_ACC_EQUITY.ColorBorder(clrBlanchedAlmond); class=class="str">"cmt">//--- Set button border class="type">class="kw">color to Blanched Almond
  obj_Btn_ACC_EQUITY.Text(DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY), class="num">2)); class=class="str">"cmt">//--- Set button text with account equity
  obj_Btn_ACC_EQUITY.Color(clrWhite); class=class="str">"cmt">//--- Set button text class="type">class="kw">color to white
  obj_Btn_ACC_EQUITY.Font("Times new roman bold"); class=class="str">"cmt">//--- Set button font to Times New Roman bold
  obj_Btn_ACC_EQUITY.FontSize(class="num">13); class=class="str">"cmt">//--- Set button font size to class="num">13
  class=class="str">"cmt">//--- Create Account Balance Label
  obj_Lbl_ACC_BALANCE.Create(class="num">0, Lbl_ACC_BALANCE, class="num">0, class="num">40, class="num">245, class="num">0, class="num">0); class=class="str">"cmt">//--- Initialize label for Account Balance
  obj_Lbl_ACC_BALANCE.Text("Account Balance"); class=class="str">"cmt">//--- Set label text to "Account Balance"
  obj_Lbl_ACC_BALANCE.Color(clrAqua); class=class="str">"cmt">//--- Set label class="type">class="kw">color to Aqua
  obj_Lbl_ACC_BALANCE.Font("Cooper Black"); class=class="str">"cmt">//--- Set label font to Cooper Black
  obj_Lbl_ACC_BALANCE.FontSize(class="num">14); class=class="str">"cmt">//--- Set label font size to class="num">14
  class=class="str">"cmt">//--- Create Account Balance Button
  obj_Btn_ACC_BALANCE.Create(class="num">0, Btn_ACC_BALANCE, class="num">0, class="num">40 + class="num">170, class="num">245 + class="num">2, class="num">0, class="num">0); class=class="str">"cmt">//--- Initialize button for Account Balance
  obj_Btn_ACC_BALANCE.Size(class="num">120, class="num">20); class=class="str">"cmt">//--- Set button size to 120x20
  obj_Btn_ACC_BALANCE.ColorBackground(clrBlack); class=class="str">"cmt">//--- Set button background class="type">class="kw">color to black
  obj_Btn_ACC_BALANCE.ColorBorder(clrBlanchedAlmond); class=class="str">"cmt">//--- Set button border class="type">class="kw">color to Blanched Almond
  obj_Btn_ACC_BALANCE.Text(DoubleToString(AccountInfoDouble(ACCOUNT_BALANCE), class="num">2)); class=class="str">"cmt">//--- Set button text with account balance
  obj_Btn_ACC_BALANCE.Color(clrWhite); class=class="str">"cmt">//--- Set button text class="type">class="kw">color to white
  obj_Btn_ACC_BALANCE.Font("Times new roman bold"); class=class="str">"cmt">//--- Set button font to Times New Roman bold
  obj_Btn_ACC_BALANCE.FontSize(class="num">13); class=class="str">"cmt">//--- Set button font size to class="num">13
  class=class="str">"cmt">//--- Create Server Time Label
  obj_Lbl_TIME.Create(class="num">0, Lbl_TIME, class="num">0, class="num">40, class="num">270, class="num">0, class="num">0); class=class="str">"cmt">//--- Initialize label for Server Time
  obj_Lbl_TIME.Text("Server Time"); class=class="str">"cmt">//--- Set label text to "Server Time"
  obj_Lbl_TIME.Color(clrLime); class=class="str">"cmt">//--- Set label class="type">class="kw">color to Lime
  obj_Lbl_TIME.Font("Cooper Black"); class=class="str">"cmt">//--- Set label font to Cooper Black
  obj_Lbl_TIME.FontSize(class="num">14); class=class="str">"cmt">//--- Set label font size to class="num">14
  class=class="str">"cmt">//--- Create Server Time Button
  obj_Btn_TIME.Create(class="num">0, Btn_TIME, class="num">0, class="num">40 + class="num">120, class="num">270 + class="num">2, class="num">0, class="num">0); class=class="str">"cmt">//--- Initialize button for Server Time
  obj_Btn_TIME.Size(class="num">170, class="num">20); class=class="str">"cmt">//--- Set button size to 170x20
  obj_Btn_TIME.ColorBackground(clrBlack); class=class="str">"cmt">//--- Set button background class="type">class="kw">color to black

在 OnInit 里搭控制面板的骨架

这段初始化逻辑把 EA 的图形界面底子一次性铺好:主按钮 310×300 像素、背景取 C'070,070,070' 深灰,头部条 310×25 用浅蓝,关闭叉号按钮则靠 Wingdings 字体加 CharToString(255) 画出那个「X」。坐标全部以 (30,30) 为锚点偏移,X 按钮实际落在 310,31 附近,比头部条右端缩进 1 像素,避免边框重叠。 时间按钮的写法值得单独看:TimeToString(TimeTradeServer(), TIME_DATE|TIME_SECONDS) 把服务器时间刷成「日期+秒」格式,边框设成 clrBlanchedAlmond、文字白色、Times New Roman Bold 13 号。这样盯盘时面板直接显示经纪商服务器时间,不用再去 MT5 状态栏找。 createSection_Information() 在初始化末尾被调用,交易段和平仓段的函数调用还注释着没放开。如果你要加自己的指标读数,直接在这个函数里补控件就行,主框尺寸已经留足。外汇与贵金属杠杆高,面板只是辅助,下单前仍要人工核对。

MQL5 / C++
  obj_Btn_TIME.ColorBorder(clrBlanchedAlmond); class=class="str">"cmt">//--- 按钮边框设为 BlanchedAlmond
  obj_Btn_TIME.Text(TimeToString(TimeTradeServer(), TIME_DATE | TIME_SECONDS)); class=class="str">"cmt">//--- 文本设为服务器时间(日期+秒)
  obj_Btn_TIME.Color(clrWhite); class=class="str">"cmt">//--- 文字颜色白
  obj_Btn_TIME.Font("Times new roman bold"); class=class="str">"cmt">//--- 字体 Times New Roman 粗体
  obj_Btn_TIME.FontSize(class="num">13); class=class="str">"cmt">//--- 字号 class="num">13
  class=class="str">"cmt">// BODY OF THE PANEL
  class=class="str">"cmt">//createSection_Trade(); //--- 创建交易区(注释未启用)
  class=class="str">"cmt">//createSection_Close(); //--- 创建平仓区(注释未启用)
  createSection_Information(); class=class="str">"cmt">//--- 创建信息区

class="type">int OnInit() {
  class=class="str">"cmt">//--- 主按钮
  obj_Btn_MAIN.Create(class="num">0, Btn_MAIN, class="num">0, class="num">30, class="num">30, class="num">0, class="num">0); class=class="str">"cmt">//--- 在(class="num">30,class="num">30)创建主按钮
  class=class="str">"cmt">//obj_Btn_MAIN.Width(class="num">310); //--- 宽310(注释)
  class=class="str">"cmt">//obj_Btn_MAIN.Height(class="num">300); //--- 高300(注释)
  obj_Btn_MAIN.Size(class="num">310, class="num">300); class=class="str">"cmt">//--- 尺寸310x300
  obj_Btn_MAIN.ColorBackground(C&class="macro">#x27;class="num">070,class="num">070,class="num">070&class="macro">#x27;); class=class="str">"cmt">//--- 背景深灰
  obj_Btn_MAIN.ColorBorder(clrBlack); class=class="str">"cmt">//--- 边框黑
  class=class="str">"cmt">//--- 头部按钮
  obj_Btn_HEADER.Create(class="num">0, Btn_HEADER, class="num">0, class="num">30, class="num">30, class="num">0, class="num">0); class=class="str">"cmt">//--- 在(class="num">30,class="num">30)创建头部
  obj_Btn_HEADER.Size(class="num">310, class="num">25); class=class="str">"cmt">//--- 尺寸310x25
  obj_Btn_HEADER.ColorBackground(clrLightBlue); class=class="str">"cmt">//--- 背景浅蓝
  obj_Btn_HEADER.ColorBorder(clrBlack); class=class="str">"cmt">//--- 边框黑
  class=class="str">"cmt">//--- X按钮
  obj_Btn_X.Create(class="num">0, Btn_X, class="num">0, class="num">30 + class="num">280, class="num">30 + class="num">1, class="num">0, class="num">0); class=class="str">"cmt">//--- 在(class="num">310,class="num">31)创建关闭钮
  obj_Btn_X.Size(class="num">30 - class="num">1, class="num">25 - class="num">1 - class="num">1); class=class="str">"cmt">//--- 尺寸28x23
  obj_Btn_X.ColorBackground(clrLightBlue); class=class="str">"cmt">//--- 背景浅蓝
  obj_Btn_X.ColorBorder(clrLightBlue); class=class="str">"cmt">//--- 边框浅蓝
  obj_Btn_X.Text(CharToString(class="num">255)); class=class="str">"cmt">//--- 文本为字符255(X形)
  obj_Btn_X.Color(clrBlack); class=class="str">"cmt">//--- 文字黑
  obj_Btn_X.Font("Wingdings"); class=class="str">"cmt">//--- 字体Wingdings
  obj_Btn_X.FontSize(class="num">17); class=class="str">"cmt">//--- 字号17
  class=class="str">"cmt">//--- 头部标签
  obj_Lbl_HEADER.Create(class="num">0, Lbl_HEADER, class="num">0, class="num">40, class="num">30, class="num">0, class="num">0); class=class="str">"cmt">//--- 在(class="num">40,class="num">30)创建标签
  obj_Lbl_HEADER.Text("Control Panel"); class=class="str">"cmt">//--- 文本Control Panel

◍ 面板控件的坐标与配色落地

这套自定义面板的头部标签用 Cooper Black 14 号字、红色文本,视觉上和后续按钮明显分层。想在 MT5 里复刻,先把 obj_Lbl_HEADER 的 Color、Font、FontSize 三行抄进 OnInit,头部风格就定了。 交易按钮画在 X=40、Y=60 处,尺寸 90×30,黄底黑字 Arial Black 13 号;关闭与信息按钮则靠前一个按钮的 Width() 动态右移 10 像素排开,避免写死坐标导致重叠。这种链式偏移写法,改按钮宽度时后面元素会自动让位。 面板主体只实跑了 createSection_Trade(),关闭与信息分区函数被注释未调用,说明当前版本面板只暴露交易区。footer 按钮落在 Y=304、宽 308、高 25,刚好压在面板下沿做状态条。外汇与贵金属图表加载此类 EA 控件属高风险操作,参数误改可能引发意外下单。

MQL5 / C++
  obj_Lbl_HEADER.Color(clrRed); class=class="str">"cmt">//--- Set text class="type">class="kw">color of the header label
  obj_Lbl_HEADER.Font("Cooper black"); class=class="str">"cmt">//--- Set font of the header label to Cooper Black
  obj_Lbl_HEADER.FontSize(class="num">14); class=class="str">"cmt">//--- Set font size of the header label

  class=class="str">"cmt">//--- TRADE BUTTON
  obj_Btn_TRADE.Create(class="num">0, Btn_TRADE, class="num">0, class="num">40, class="num">60, class="num">0, class="num">0); class=class="str">"cmt">//--- Create the trade button at specified coordinates
  obj_Btn_TRADE.Size(class="num">90, class="num">30); class=class="str">"cmt">//--- Set size of the trade button
  obj_Btn_TRADE.ColorBackground(clrYellow); class=class="str">"cmt">//--- Set background class="type">class="kw">color of the trade button
  obj_Btn_TRADE.ColorBorder(clrYellow); class=class="str">"cmt">//--- Set border class="type">class="kw">color of the trade button
  obj_Btn_TRADE.Text("Trade"); class=class="str">"cmt">//--- Set text of the trade button
  obj_Btn_TRADE.Color(clrBlack); class=class="str">"cmt">//--- Set text class="type">class="kw">color of the trade button
  obj_Btn_TRADE.Font("Arial Black"); class=class="str">"cmt">//--- Set font of the trade button to Arial Black
  obj_Btn_TRADE.FontSize(class="num">13); class=class="str">"cmt">//--- Set font size of the trade button

  class=class="str">"cmt">//--- CLOSE BUTTON
  obj_Btn_CLOSE.Create(class="num">0, Btn_CLOSE, class="num">0, class="num">40 + obj_Btn_TRADE.Width() + class="num">10, class="num">60, class="num">0, class="num">0); class=class="str">"cmt">//--- Create the close button at specified coordinates
  obj_Btn_CLOSE.Size(class="num">90, class="num">30); class=class="str">"cmt">//--- Set size of the close button
  obj_Btn_CLOSE.ColorBackground(clrSilver); class=class="str">"cmt">//--- Set background class="type">class="kw">color of the close button
  obj_Btn_CLOSE.ColorBorder(clrSilver); class=class="str">"cmt">//--- Set border class="type">class="kw">color of the close button
  obj_Btn_CLOSE.Text("Close"); class=class="str">"cmt">//--- Set text of the close button
  obj_Btn_CLOSE.Color(clrBlack); class=class="str">"cmt">//--- Set text class="type">class="kw">color of the close button
  obj_Btn_CLOSE.Font("Arial Black"); class=class="str">"cmt">//--- Set font of the close button to Arial Black
  obj_Btn_CLOSE.FontSize(class="num">13); class=class="str">"cmt">//--- Set font size of the close button
  class=class="str">"cmt">//--- INFO BUTTON
  obj_Btn_INFO.Create(class="num">0, Btn_INFO, class="num">0, class="num">40 + obj_Btn_TRADE.Width() + class="num">10 + obj_Btn_CLOSE.Width() + class="num">10, class="num">60, class="num">0, class="num">0); class=class="str">"cmt">//--- Create the info button at specified coordinates
  obj_Btn_INFO.Size(class="num">90, class="num">30); class=class="str">"cmt">//--- Set size of the info button
  obj_Btn_INFO.ColorBackground(clrSilver); class=class="str">"cmt">//--- Set background class="type">class="kw">color of the info button
  obj_Btn_INFO.ColorBorder(clrSilver); class=class="str">"cmt">//--- Set border class="type">class="kw">color of the info button
  obj_Btn_INFO.Text("Inform&class="macro">#x27;n"); class=class="str">"cmt">//--- Set text of the info button
  obj_Btn_INFO.Color(clrBlack); class=class="str">"cmt">//--- Set text class="type">class="kw">color of the info button
  obj_Btn_INFO.Font("Arial Black"); class=class="str">"cmt">//--- Set font of the info button to Arial Black
  obj_Btn_INFO.FontSize(class="num">13); class=class="str">"cmt">//--- Set font size of the info button

  class=class="str">"cmt">// BODY OF THE PANEL
  createSection_Trade(); class=class="str">"cmt">//--- Call function to create the trade section
  class=class="str">"cmt">//createSection_Close(); //--- (Commented out) Call function to create the close section
  class=class="str">"cmt">//createSection_Information(); //--- (Commented out) Call function to create the information section
  class=class="str">"cmt">//--- FOOTER BUTTON
  obj_Btn_FOOTER.Create(class="num">0, Btn_FOOTER, class="num">0, class="num">30 + class="num">1, class="num">305 - class="num">1, class="num">0, class="num">0); class=class="str">"cmt">//--- Create the footer button at specified coordinates
  obj_Btn_FOOTER.Size(class="num">310 - class="num">1 - class="num">1, class="num">25); class=class="str">"cmt">//--- Set size of the footer button

「面板销毁时的对象清理顺序」

初始化收尾阶段,底部按钮被统一着色为深灰底(RGB 070,070,070)、白字、Calibri 粗斜体 12 号,并嵌入了 0x23F0 时钟字符与电报链接文本,最后用 ChartRedraw(0) 强制重绘让面板生效。 当指标或 EA 卸载时,必须显式销毁所有通过 CWnd 派生类创建的 OBJ_BITMAP_LABEL / 按钮对象,否则 MT5 图表会残留不可交互的幽灵控件。destroySection_Main_Panel 一口气清掉 8 个主面板元素,包括主按钮、头部、关闭 X 以及底部链接按钮。 destroySection_Trade 负责拆掉交易区的 18 个控件:从风险输入、价格/手数/SL/TP 编辑框,到市价买卖、挂单四类按钮。destroySection_Close 则针对性地销毁 10 个平仓按钮,按全平、分方向平、盈亏平、挂单平做了细分。外汇与贵金属杠杆交易高风险,这类一键平仓 UI 若销毁不净,可能在切换周期时引发对象 ID 冲突报错。 信息区的销毁函数虽在原文截断,但套路一致:按 obj_ 前缀逐个 Destroy(),保持与主面板相同的回收节奏即可。

MQL5 / C++
  obj_Btn_FOOTER.ColorBackground(C&class="macro">#x27;class="num">070,class="num">070,class="num">070&class="macro">#x27;); class=class="str">"cmt">//--- Set background class="type">class="kw">color of the footer button
  obj_Btn_FOOTER.ColorBorder(C&class="macro">#x27;class="num">070,class="num">070,class="num">070&class="macro">#x27;); class=class="str">"cmt">//--- Set border class="type">class="kw">color of the footer button
  obj_Btn_FOOTER.Text(ShortToString(0x23F0) + "https:class=class="str">"cmt">//t.me/Forex_Algo_Trader"); //--- Set text of the footer button with a link
  obj_Btn_FOOTER.Color(clrWhite); class=class="str">"cmt">//--- Set text class="type">class="kw">color of the footer button
  obj_Btn_FOOTER.Font("Calibri bold italic"); class=class="str">"cmt">//--- Set font of the footer button to Calibri bold italic
  obj_Btn_FOOTER.FontSize(class="num">12); class=class="str">"cmt">//--- Set font size of the footer button
  ChartRedraw(class="num">0); class=class="str">"cmt">//--- Redraw the chart to update the panel
  class=class="str">"cmt">//--- End of initialization function
  class="kw">return(INIT_SUCCEEDED); class=class="str">"cmt">//--- Return initialization success status
}
class=class="str">"cmt">//--- Function to destroy main panel objects
class="type">void destroySection_Main_Panel() {
  obj_Btn_MAIN.Destroy(); class=class="str">"cmt">//--- Destroy the main button
  obj_Btn_HEADER.Destroy(); class=class="str">"cmt">//--- Destroy the header button
  obj_Btn_X.Destroy(); class=class="str">"cmt">//--- Destroy the close(X) button
  obj_Lbl_HEADER.Destroy(); class=class="str">"cmt">//--- Destroy the header label
  obj_Btn_TRADE.Destroy(); class=class="str">"cmt">//--- Destroy the trade section button
  obj_Btn_CLOSE.Destroy(); class=class="str">"cmt">//--- Destroy the close section button
  obj_Btn_INFO.Destroy(); class=class="str">"cmt">//--- Destroy the information section button
  obj_Btn_FOOTER.Destroy(); class=class="str">"cmt">//--- Destroy the footer button
}
class=class="str">"cmt">//--- Function to destroy trade section objects
class="type">void destroySection_Trade() {
  obj_Btn_RISK.Destroy(); class=class="str">"cmt">//--- Destroy the risk button
  obj_Edit_RISK.Destroy(); class=class="str">"cmt">//--- Destroy the risk input field
  obj_Lbl_PRICE.Destroy(); class=class="str">"cmt">//--- Destroy the price label
  obj_Edit_PRICE.Destroy(); class=class="str">"cmt">//--- Destroy the price input field
  obj_Lbl_LOTS.Destroy(); class=class="str">"cmt">//--- Destroy the lot size label
  obj_Edit_LOTS.Destroy(); class=class="str">"cmt">//--- Destroy the lot size input field
  obj_Lbl_SL.Destroy(); class=class="str">"cmt">//--- Destroy the stop loss label
  obj_Edit_SL.Destroy(); class=class="str">"cmt">//--- Destroy the stop loss input field
  obj_Lbl_TP.Destroy(); class=class="str">"cmt">//--- Destroy the take profit label
  obj_Edit_TP.Destroy(); class=class="str">"cmt">//--- Destroy the take profit input field
  obj_Btn_POINTS.Destroy(); class=class="str">"cmt">//--- Destroy the points button
  obj_Btn_SELL.Destroy(); class=class="str">"cmt">//--- Destroy the sell button
  obj_Btn_ENTRY.Destroy(); class=class="str">"cmt">//--- Destroy the entry button
  obj_Btn_BUY.Destroy(); class=class="str">"cmt">//--- Destroy the buy button
  obj_Btn_SELLSTOP.Destroy(); class=class="str">"cmt">//--- Destroy the sell stop button
  obj_Btn_BUYSTOP.Destroy(); class=class="str">"cmt">//--- Destroy the buy stop button
  obj_Btn_SELLLIMIT.Destroy(); class=class="str">"cmt">//--- Destroy the sell limit button
  obj_Btn_BUYLIMIT.Destroy(); class=class="str">"cmt">//--- Destroy the buy limit button
}
class=class="str">"cmt">//--- Function to destroy close section objects
class="type">void destroySection_Close() {
  obj_Btn_CLOSE_ALL.Destroy(); class=class="str">"cmt">//--- Destroy the button to close all positions
  obj_Btn_CLOSE_ALL_SELL.Destroy(); class=class="str">"cmt">//--- Destroy the button to close all sell positions
  obj_Btn_CLOSE_ALL_BUY.Destroy(); class=class="str">"cmt">//--- Destroy the button to close all buy positions
  obj_Btn_CLOSE_LOSS_SELL.Destroy(); class=class="str">"cmt">//--- Destroy the button to close losing sell positions
  obj_Btn_CLOSE_LOSS_BUY.Destroy(); class=class="str">"cmt">//--- Destroy the button to close losing buy positions
  obj_Btn_CLOSE_PROFIT_SELL.Destroy(); class=class="str">"cmt">//--- Destroy the button to close profitable sell positions
  obj_Btn_CLOSE_PROFIT_BUY.Destroy(); class=class="str">"cmt">//--- Destroy the button to close profitable buy positions
  obj_Btn_CLOSE_ALL_LOSS.Destroy(); class=class="str">"cmt">//--- Destroy the button to close all losing positions
  obj_Btn_CLOSE_ALL_PROFIT.Destroy(); class=class="str">"cmt">//--- Destroy the button to close all profitable positions
  obj_Btn_CLOSE_PENDING.Destroy(); class=class="str">"cmt">//--- Destroy the button to close pending orders
}
class=class="str">"cmt">//--- Function to destroy information section objects
class="type">void destroySection_Information() {

退出时清掉面板对象别留垃圾

EA 卸载或图表关闭时,如果 GUI 对象不主动销毁,MT5 会在图表上留下残留的标签和按钮,下次加载可能重叠或报错。上面这段把账户信息区的 14 个对象逐一 Destroy,覆盖账号、名称、类型、杠杆、净值、余额和服务器时间共 7 组标签加按钮。 OnDeinit 里依次调用了四个销毁函数,分别清理主面板、交易区、平仓区和信息区,最后用 ChartRedraw(0) 强制重绘让残留立刻消失。 实盘外汇和贵金属波动大、EA 切换频繁,建议在自己的面板代码里也照这个粒度拆函数,卸载时逐区回收,避免图表越用越脏。

MQL5 / C++
  obj_Lbl_ACC_NUMBER.Destroy(); class=class="str">"cmt">//--- Destroy the account number label
  obj_Btn_ACC_NUMBER.Destroy(); class=class="str">"cmt">//--- Destroy the account number button
  obj_Lbl_ACC_NAME.Destroy(); class=class="str">"cmt">//--- Destroy the account name label
  obj_Btn_ACC_NAME.Destroy(); class=class="str">"cmt">//--- Destroy the account name button
  obj_Lbl_ACC_TYPE.Destroy(); class=class="str">"cmt">//--- Destroy the account type label
  obj_Btn_ACC_TYPE.Destroy(); class=class="str">"cmt">//--- Destroy the account type button
  obj_Lbl_ACC_LEVERAGE.Destroy(); class=class="str">"cmt">//--- Destroy the account leverage label
  obj_Btn_ACC_LEVERAGE.Destroy(); class=class="str">"cmt">//--- Destroy the account leverage button
  obj_Lbl_ACC_EQUITY.Destroy(); class=class="str">"cmt">//--- Destroy the account equity label
  obj_Btn_ACC_EQUITY.Destroy(); class=class="str">"cmt">//--- Destroy the account equity button
  obj_Lbl_ACC_BALANCE.Destroy(); class=class="str">"cmt">//--- Destroy the account balance label
  obj_Btn_ACC_BALANCE.Destroy(); class=class="str">"cmt">//--- Destroy the account balance button
  obj_Lbl_TIME.Destroy(); class=class="str">"cmt">//--- Destroy the server time label
  obj_Btn_TIME.Destroy(); class=class="str">"cmt">//--- Destroy the server time button
}
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Expert deinitialization function                                 |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnDeinit(const class="type">int reason) {
  class=class="str">"cmt">//--- Start of the deinitialization function
  destroySection_Main_Panel(); class=class="str">"cmt">//--- Call function to destroy the main panel section
  destroySection_Trade(); class=class="str">"cmt">//--- Call function to destroy the trade section
  destroySection_Close(); class=class="str">"cmt">//--- Call function to destroy the close section
  destroySection_Information(); class=class="str">"cmt">//--- Call function to destroy the information section

  ChartRedraw(class="num">0);

  class=class="str">"cmt">//--- End of deinitialization function
}

◍ 下一步让面板真正活起来

这一篇里我们用 Controls 类把仪表板的基础骨架搭起来了:按钮、标签、编辑框各自独立创建,文本颜色字号都可单独定制,一个能看的静态面板核心已经成型。 附带工程文件 CONTROL_PANEL_PART_1.mq5 体积 46.27 KB,直接丢进 MT5 的 MQL5 目录就能编译运行,先确认你的环境能渲染出这套基础控件。 外汇和贵金属交易界面若接实时信号,杠杆与滑点风险会被放大,任何面板都只是辅助,下单前自己核对账户状态。 下一篇的技术落点是给按钮挂点击事件、做实时数据回写,静态面板才会变成能用的交易助手;这部分逻辑不复杂,但要在 OnChartEvent 里自己接消息循环,建议先吃透本篇的坐标与重绘机制再动手。

让小布替你跑这套编译校验
这些控件组装和事件绑定的重复校验,小布盯盘的AIGC已内置,打开对应品种页就能看到结构是否缺漏,你专注决策逻辑就好。

常见问题

大概率是没有在OnChartEvent里把控件ID和交易函数绑定,或者EA没有附加到图表。检查事件分发和按钮的OBJPROP_ONCLICK映射。
可以,用分组容器管理就行。但建议分开写回调,避免遍历持仓时把挂单状态误判为盈利仓位。
目前小布内置的是诊断与结构提示,不代写完整EA;你可以把拼好的框架贴进去让它标出遗漏的事件钩子。
可能是用了低频定时器刷新,改用OnTick或账户变更事件推送,能把延迟压到tick级,但高频刷新会增加CPU占用。
必须隐藏或禁用,否则重叠命中区域会让点击错乱,用ChartRedraw配合OBJPROP_STATE管理可见性最稳。