首页 / 交易学院 / 小布知识库 / 用标准库类在图表上创建自定义市场报价面板
用标准库类在图表上创建自定义市场报价面板
🧩

用标准库类在图表上创建自定义市场报价面板

MQL5 编程 难度 · 进阶 2013 11 分钟阅读
图形对象标准库面板

一、用标准库类做自定义文本表

MQL5 标准库提供了 CObject / CChartObject / CList 等基类,可快速搭出图表上的自定义信息面板。文章的目标是在图表上动态显示一组品种的买/卖价、涨跌色,替代或补充自带 Market Watch。核心是 TableDisplay 类继承 CList,把所有文本图形对象作为链表管理,支持添加/插入/删除/清空。

二、面板结构与对象管理

三、定时器刷新机制

文中用 EventSetTimer(1) 每秒触发 OnTimer,在 OnTimer 里用 SymbolInfoTick 取买卖价,与上次价格比较决定涨跌色,再 SetText/SetColor 更新并 ChartRedraw。注意:用 OnTimer 而非 OnTick,这样不依赖报价跳动也能稳定刷新。

void OnTimer()
  {
   for(int i=0; i<NUMBER; i++)
     {
      MqlTick tick; SymbolInfoTick(names[i], tick);
      if(tick.time>times[i])
        {
         Table1.SetText(i, DoubleToString(tick.bid, (int)SymbolInfoInteger(names[i],SYMBOL_DIGITS)));
         if(tick.bid>rates[i])      Table1.SetColor(i,Lime);
         else if(tick.bid<rates[i]) Table1.SetColor(i,Red);
         else                       Table1.SetColor(i,Yellow);
         rates[i]=tick.bid; times[i]=tick.time;
        }
     }
   ChartRedraw(0);
  }

四、唯一名与坐标网格

图表上每个图形对象必须有唯一名,否则会互相覆盖。文章用 GetTickCount 生成唯一名,并加 ObjectFind 校验避免同毫秒冲突。定位用网格步长(GetSystemMetrics 算 chart_width_step/height_step)实现分辨率无关布局,避免不同图表尺寸下重叠。

五、坑与注意

⚠ 面板类 EA 的常见雷
1) 对象名冲突:连续 GetTickCount 可能同毫秒,必须用静态计数+ObjectFind 校验,否则新对象覆盖旧的。2) 坐标重算:像素坐标随图表尺寸变化,要用网格步长自适应,别写死像素。3) 性能:品种多、刷新频繁时对象数量大,OnDeinit 里务必 EventKillTimer + Table1.Clear() 释放,防止内存泄漏。4) 本文未含点击下单,要下单需自己加 OnChartEvent 处理 OBJ_EVENT_CLICK。

六、用标准库组件搭面板

自定义报价面板可以用标准库的 CListView 或 CObjListView 在图表上画一个可滚动的列表,每行展示一个品种的买价卖价与涨跌色。比终端自带市场报价更灵活,能按你的关注列表定制。

面板本质是「图表对象加数据绑定」:建好控件后,每 tick 或定时把最新报价写进对应行。控件坐标要适配窗口,Resize 时重排。

七、实时刷新报价

刷新逻辑放在 OnTick 或定时器里,读 SymbolInfoDouble 的 BID/ASK 写回控件。注意高频刷新会拖慢终端,用定时器(如每秒一次)通常足够,不必每 tick 重绘。

for(int i=0;i<Symbols.Total();i++)
{
   string s = Symbols.At(i);
   double bid = SymbolInfoDouble(s, SYMBOL_BID);
   ListViewUpdateRow(i, bid, SymbolInfoDouble(s, SYMBOL_ASK));
}
✦ 别每 tick 重绘
面板用定时器每秒刷一次就够,每 tick 重绘列表既没必要又吃 CPU。可视化要省资源。

八、点击行切换图表品种

进阶体验:监听 OnChartEvent 的鼠标点击,点到哪行就把当前图表切到那个品种(ChartSetSymbolPeriod),做成一个迷你行情终端。这比反复手动换品种顺手得多。

实现时注意点击坐标到行号的映射,以及点击后要更新高亮行。交互细节决定面板好不好用。

九、小结

✦ 小结
自定义报价面板用标准库 CListView 在图上画可滚动列表,定时读 SYMBOL_BID/ASK 刷新,别每 tick 重绘。进阶监听 OnChartEvent 点击行切换图表品种,做迷你行情终端。坐标适配窗口、点击映射行号,交互细节决定可用性。

常见问题

OnTick 只在有报价跳动时触发,若行情清淡可能几秒不刷新,面板看着像卡住。OnTimer(1) 每秒稳定触发一次,无论有没有报价都能更新买卖价与涨跌色,体验更顺畅。
MT5 的图形对象靠名字区分,同名对象会被后者覆盖或冲突。面板里每个标题、每个字段都是独立对象,必须用唯一名(如带时间戳/计数的名字)才能保证它们各显示各的、互不覆盖。
原文没有点击下单功能,只做信息展示。要加下单,需要在 OnChartEvent 里处理 OBJ_EVENT_CLICK,判断点到的是哪一行对象,再调 CTrade 下单。这属于在原文基础上的二次开发。