用标准库类在图表上创建自定义市场报价面板
一、用标准库类做自定义文本表
MQL5 标准库提供了 CObject / CChartObject / CList 等基类,可快速搭出图表上的自定义信息面板。文章的目标是在图表上动态显示一组品种的买/卖价、涨跌色,替代或补充自带 Market Watch。核心是 TableDisplay 类继承 CList,把所有文本图形对象作为链表管理,支持添加/插入/删除/清空。
二、面板结构与对象管理
- CChartObjectLabel(OBJ_LABEL):显示文字,绑定像素坐标,滚动不移动,用于标题与字段。
- CChartObjectEdit(OBJ_EDIT):可交互输入字段,文中用作只读信息显示。
- CChartObjectText / CChartObjectButton:同系列的其他控件。
- 每个字段对象通过 AddFieldObject / AddTitleObject 加入链表,用 SetText 改文字、SetColor 改颜色。
三、定时器刷新机制
文中用 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)实现分辨率无关布局,避免不同图表尺寸下重叠。
五、坑与注意
六、用标准库组件搭面板
自定义报价面板可以用标准库的 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));
}
八、点击行切换图表品种
进阶体验:监听 OnChartEvent 的鼠标点击,点到哪行就把当前图表切到那个品种(ChartSetSymbolPeriod),做成一个迷你行情终端。这比反复手动换品种顺手得多。
实现时注意点击坐标到行号的映射,以及点击后要更新高亮行。交互细节决定面板好不好用。