用标准库类与 Google Chart API 做交易信息板
用 CObject 体系与 Google Chart API,把交易统计做成常驻信息板
本文演示如何把交易统计、余额曲线、品种占比饼图塞进图表子窗口的一个指标里,不阻塞主图。核心是用 MQL5 标准库(一套基于 CObject 的类)做面向对象封装,再用外部图表服务渲染可视化。
一、为什么用标准库做信息板
标准库位于 MQL5/Include,只提供类、不提供函数,需要一点 OOP 基础。它的价值是批量管理指标缓冲区、图表对象、数组,避免手写大量 ObjectCreate/Set,适合做复杂界面。
二、标准库的类体系
- CObject 基类:绝大多数库类的祖先;
- CArray* 数组类:动态数组的通用实现;
- CChart / CChartObject:图表与图形对象;
- CString / CFile:字符串与文件操作;
- CIndicator 指标基类、CDealInfo 成交信息类。
三、Board 类的设计
保护数据:子窗口号、成交数组、余额数组、编辑单元、图表对象、饼图数据。私有数据:约 30 个交易特征变量(净利润、盈利因子、回撤等)。公共方法:构造、析构、Refresh、CreateInterface。
四、交易特征指标怎么算
- 用 HistorySelect 选历史,CDealInfo 取每笔出场利润(含 swap/commission);
- 分买/卖、盈/亏累积 gross_profit / gross_loss;
- profit_factor = gross_profit / gross_loss;
- 连续盈亏笔数与金额、最大/相对/绝对回撤。
五、Google Chart API 集成
用 wininet.dll 下载 PNG 再转 BMP 显示;余额图 cht=lc,饼图 cht=p3;尺寸限制 1000x300。需要终端允许 DLL 导入,并附带三个自写 DLL(字体度量、PNG 转 BMP、wininet 封装)。
六、指标生命周期与事件
- OnInit:建 Board 实例、启定时器、记初值;
- OnDeinit:杀定时器、delete 对象(触发析构);
- OnCalculate:比历史成交数变化则 Refresh;
- OnTimer:每秒监窗口尺寸/成交数变化刷新。
七、Canvas 绘制坐标系与重绘时机
标准库信息板基于 CCanvas:在内存里画好文字、矩形、线,再贴到图表。坐标是相对画布的像素,原点在左上。重绘要挂在 OnChartEvent(如鼠标移动、新 tick)或定时器里,避免每 tick 全量重画拖慢终端。
实务要点:把「计算数值」和「画图」分开,数值变化时置脏标志,只在脏时重绘;文字用 CCanvas 的 Text 方法指定字体大小与对齐。画布尺寸要适配图表窗口,Resize 时重建缓冲区,否则高分屏会糊。
八、交易特征指标的计算坑
信息板常展示「胜率、盈亏比、平均持仓时长」等特征。计算时最大的坑是除零(总笔数为零时算胜率)和未初始化(首笔成交前字段是零或 EMPTY_VALUE)。任何比率都要先判分母,没成交就显示「—」而非百分之零。
九、Google Chart API 的离线替代
原文用 Google Chart API 把图表发到网页,但那需要联网且把数据传出终端。若你只想在终端内看,完全可用 CCanvas 自己画柱状或折线,零依赖、不上云。需要对外分享时,再把 CCanvas 导出成图片文件即可。
选型原则:纯本地监控用 CCanvas;要跨设备看盘用 Web 加 Chart API(注意数据出境合规)。信息板本质是「把交易统计可视化」,技术路线看你的部署场景,不必盲从原文的联网方案。