一个用于通过 Google Chart API 构建图表的库·进阶篇
📘

一个用于通过 Google Chart API 构建图表的库·进阶篇

第 2/3 篇

用 AddLine 把多序列塞进一张自定义图表

在 MT5 里画自定义图表,核心是先准备数组再交给 AddLine。下面这段演示了四条序列:Y3 是 1000~600 的波动量,X3 是它的横轴坐标(2 到 23),Y2 和 Y 则是另两条带正负值的线。 三条线分别用 Red、Blue、Green 上图,其中第三条走的是 X3/Y3 配对坐标,其余两条默认按索引 0~9 排布。主轴用 SetAxis 锁在左下,范围 -1 到 10;第三条线被挂到右上次要轴,刻度 15、步长 2,等于给异量纲数据开了第二个坐标系。 细节修饰很关键:SetGrid 开网格,ShowLegend 放底部水平图例,SetTitle 写「My Chart」。SetLineMarker 给一线加钻石点、二线加十字,SetLineFilling 在两条线间填 Lime 色块,AddLabel 还能打 Flag 和 annotation 标注。 最后 SetLineScaling 对二线做 20% 压缩、三线挂次要轴也压 20%,再 GetChart 出图。外汇和贵金属行情高波动,这类图只作结构观察,不预示方向。

MQL5 / C++
class="type">class="kw">double Y3[class="num">10]={class="num">1000, class="num">1200, class="num">1800, class="num">1700, class="num">1300, class="num">900, class="num">700, class="num">750, class="num">800, class="num">600};
class="type">class="kw">double X3[class="num">10]={class="num">2, class="num">4, class="num">5, class="num">6, class="num">10, class="num">15, class="num">17, class="num">20, class="num">21, class="num">23};
class="type">class="kw">double Y2[class="num">10]={-class="num">70, -class="num">5, class="num">6, class="num">8, class="num">10, class="num">20, class="num">100, class="num">130, class="num">90, class="num">60};
class="type">class="kw">double Y[class="num">10]={-class="num">50, -class="num">40, -class="num">25, -class="num">35, class="num">10, class="num">50, class="num">70, class="num">40, class="num">15, class="num">80};
class=class="str">"cmt">//增加线
class="type">int first_line=chart.AddLine(Y, Red, class="num">0, "Test line");
class="type">int second_line=chart.AddLine(Y2, Blue, class="num">0, "Test line class="num">2");
class="type">int third_line=chart.AddLine(Y3, X3, Green, class="num">0, "Test line class="num">3");
class=class="str">"cmt">//主轴
chart.SetAxis(DIAGRAM_AXIS_BOTTOM|DIAGRAM_AXIS_LEFT, -class="num">1, class="num">0, class="num">0, class="num">10, class="num">0);
class=class="str">"cmt">//次要轴 
chart.SetAxis(DIAGRAM_AXIS_RIGHT|DIAGRAM_AXIS_TOP, third_line, class="num">0, Red, class="num">15, class="num">2);
class=class="str">"cmt">//网格
chart.SetGrid();
class=class="str">"cmt">//图例
chart.ShowLegend(DIAGRAM_LEGEND_POSITION_BOTTOM_HORIZONTAL);
class=class="str">"cmt">//标题
chart.SetTitle("My Chart", Green, class="num">15);
class=class="str">"cmt">//在图表上填充
chart.SetFill(Linen, Silver);
class=class="str">"cmt">//标注
chart.SetLineMarker(first_line, DIAGRAM_LINE_MARKERS_DIAMOND, BlueViolet, class="num">10);
chart.SetLineMarker(second_line, DIAGRAM_LINE_MARKERS_CROSS, YellowGreen, class="num">15);
class=class="str">"cmt">//在两线之间填充
chart.SetLineFilling(first_line, Lime , second_line);
class=class="str">"cmt">//增加标注
chart.AddLabel(first_line, DIAGRAM_LABEL_TYPE_FLAG, class="num">5, "Flag", Red, class="num">15);
chart.AddLabel(second_line, DIAGRAM_LABELS_TYPE_ANNOTATION, class="num">3, "annotation", Blue, class="num">25);
class=class="str">"cmt">//稍微压缩一下线 (压缩 class="num">20%)
chart.SetLineScaling(second_line, false, class="num">20);
class=class="str">"cmt">//把第三条线附加到次要轴
chart.SetLineScaling(third_line, true, class="num">20);
class=class="str">"cmt">//获取图表
chart.GetChart();

「柱形图类和分组排列的差异」

在 MT5 的图形库里,柱形图由 CBarChart 类接管绘制。它和折线图类 CLineXYChart 的最大区别是:柱形图不依赖 X 轴的一组独立数据,也没有散点标记,其余接口行为基本和折线图类一致。 从代码实例看,一次可叠 3 组数据(Y、Y2、Y3 各 10 个点),默认渲染是一根柱压在另一根上方以节省横向空间。若要改成按创建顺序并排,调用 SetGrouped(true) 即可切换布局。 外汇与贵金属波动剧烈,这类图表多用于复盘品种波动率分布,实盘前请在策略测试器里先验证渲染逻辑,避免误读分组导致的视觉偏差。

MQL5 / C++
CBarChart chart;
chart.Attach(class="num">0, "test diagram");
class=class="str">"cmt">//设置尺寸
chart.SetSize(class="num">700,class="num">400);
class=class="str">"cmt">//准备数据
class="type">class="kw">double Y3[class="num">10]={class="num">100, class="num">120, class="num">18, class="num">17, class="num">13, class="num">9, class="num">70, class="num">75, class="num">80, class="num">60};
class="type">class="kw">double Y2[class="num">10]={class="num">70, class="num">5, class="num">6, class="num">8, class="num">10, class="num">20, class="num">100, class="num">130, class="num">90, class="num">60};
class="type">class="kw">double Y[class="num">10]={class="num">50, class="num">40, class="num">25, class="num">35, class="num">10, class="num">50, class="num">70, class="num">40, class="num">15, class="num">80};
class=class="str">"cmt">//增加线
class="type">int first_line=chart.AddLine(Y, Red, class="num">0, "Test bar class="num">1");
class="type">int second_line=chart.AddLine(Y2, Blue, class="num">0, "Test bar class="num">2");
class="type">int third_line=chart.AddLine(Y3, Green, class="num">0, "Test bar class="num">3");
class=class="str">"cmt">//主轴
chart.SetAxis(DIAGRAM_AXIS_BOTTOM|DIAGRAM_AXIS_LEFT, -class="num">1, class="num">0, class="num">0, class="num">10, class="num">0);
class=class="str">"cmt">//网格
chart.SetGrid();
class=class="str">"cmt">//图例
chart.ShowLegend();
class=class="str">"cmt">//标题
chart.SetTitle("My Chart", Green, class="num">15);
class=class="str">"cmt">//填充图表
chart.SetFill(Linen, Silver);
class=class="str">"cmt">//获取图表
chart.GetChart();
 class=class="str">"cmt">// 设置分组 chart.SetGrouped(true);

◍ 用 CPieChart 画双环饼图

CPieChart 类能在 MT5 里直接生成饼图,支持 2D 与 3D 两种显示模式。切到 3D 只需调用 SetPieType() 并传入对应参数;但一旦要画多个同心环,就只能退回 2D 模式,因为多环特性仅在二维下可用。 加第二圈环的办法很直接:调 AddPieSlice() 时把维度参数设成非 0 值(例如 1),代码里第一圈用了 0、第二圈用了 1,就叠出同心结构。远程扇形标记靠 SetPieLabels() 控制,可替代图例,但标记尺寸不会随图表自动缩放,溢出边界时只能手动把图表宽度加大。 这套图表没有网格、坐标轴、刻度等配置项,结构比折线图简单得多。想去掉某块扇形用 DeleteLine() 即可。外汇与贵金属行情分布可视化时需注意,这类品种波动剧烈、高风险,饼图只反映样本占比,不预示走向。 下面这段代码挂到图表 0 上生成 300×200 的图,先加三块主环再开 2D 模式,随后补第二环三块,可直接拷进 EA 的 OnStart 验证。

MQL5 / C++
CPieChart chart;
chart.Attach(class="num">0, "test diagram");
class=class="str">"cmt">//设置尺寸
chart.SetSize(class="num">300,class="num">200);
class=class="str">"cmt">//增加部分
chart.AddPieSlice(class="num">10, class="num">0, Red, class="num">0, "Test slice class="num">1");
chart.AddPieSlice(class="num">20, class="num">0, Green, class="num">0, "Test slice class="num">2");
chart.AddPieSlice(class="num">30, class="num">0, Blue, class="num">0, "Test slice class="num">3");
class=class="str">"cmt">//图例
chart.ShowLegend();
class=class="str">"cmt">//标题
chart.SetTitle("My Chart", Green, class="num">15);
class=class="str">"cmt">//显示模式 - 2D
chart.SetPieType(true);
class=class="str">"cmt">//获取图表
chart.GetChart(); 
class=class="str">"cmt">//增加第二个环
chart.AddPieSlice(class="num">50, class="num">1, YellowGreen, class="num">0, "Test ring class="num">1");
chart.AddPieSlice(class="num">20, class="num">1, Magenta, class="num">0, "Test ring class="num">2");
chart.AddPieSlice(class="num">70, class="num">1, Maroon, class="num">0, "Test ring class="num">3");

用 CRadarChart 画多维指标雷达

在 MT5 的自定义指标或 EA 里,CRadarChart 类可以直接挂到图表对象上画雷达图,它和 CLineXYChart 共用同一套方法接口,只是呈现形态从折线变成环状多维。 下面这段代码把一张 300×300 的雷达图 attach 到 0 号图表、名叫 "test diagram" 的对象上。三组长度 10 的数组 Y、Y2、Y3 分别代表 10 个维度的数值,例如某货币对的多周期动量、波动率、持仓分布等,范围从 5 到 130 不等。 AddLine 把三条线加进图,颜色分别是红、蓝、绿;SetLineFilling 把第一条和第二条线之间填成 Lime 色,形成面积对比。标记点用圆形和菱形区分,标题设为 "My Chart",底部横排图例,最后 GetChart 触发绘制。 实盘里你可以把 10 个维度的数组换成实时计算的 RSI、ATR、乖离率等,外汇和贵金属波动剧烈、杠杆高风险大,雷达图只帮你快速扫多个维度背离,不代表任何方向确定性。

MQL5 / C++
CRadarChart chart;
chart.Attach(class="num">0, "test diagram");
class=class="str">"cmt">//设置尺寸
chart.SetSize(class="num">300,class="num">300);
class=class="str">"cmt">//增加线
class="type">class="kw">double Y3[class="num">10]={class="num">100, class="num">120, class="num">18, class="num">17, class="num">13, class="num">9, class="num">70, class="num">75, class="num">80, class="num">60};
class="type">class="kw">double Y2[class="num">10]={class="num">70, class="num">5, class="num">6, class="num">8, class="num">10, class="num">20, class="num">100, class="num">130, class="num">90, class="num">60};
class="type">class="kw">double Y[class="num">10]={class="num">50, class="num">40, class="num">25, class="num">35, class="num">10, class="num">50, class="num">70, class="num">40, class="num">15, class="num">80};
class="type">int first_line=chart.AddLine(Y, Red, class="num">0, "Test line");
class="type">int second_line=chart.AddLine(Y2, Blue, class="num">0, "Test line class="num">2");
class="type">int third_line=chart.AddLine(Y3, Green, class="num">0, "Test line class="num">3");
class=class="str">"cmt">//在两线之间填充
chart.SetLineFilling(first_line, Lime , second_line);
class=class="str">"cmt">//标注
chart.SetLineMarker(first_line, DIAGRAM_LINE_MARKERS_CIRCLE, BlueViolet, class="num">10);
chart.SetLineMarker(second_line, DIAGRAM_LINE_MARKERS_DIAMOND, YellowGreen, class="num">15);
class=class="str">"cmt">//标题
chart.SetTitle("My Chart", Green, class="num">15);
class=class="str">"cmt">//网格
chart.SetGrid();
class=class="str">"cmt">//图例
chart.ShowLegend(DIAGRAM_LEGEND_POSITION_BOTTOM_HORIZONTAL);
class=class="str">"cmt">//获取图表
chart.GetChart();

「用 CCandleChart 手搓一张裸烛图」

在 MT5 里画自定义烛形图,核心是 CCandleChart 类。它不像常规图表那样自带坐标标签、图例或标记,适合做轻量化的局部形态观察——比如只盯最近 10 根 K 线的高开低收。 实例化后先 Attach 到图表窗口并给个名称,再用 SetSize 定死画布像素。下面这段代码把当前品种、当前周期的最新 10 根烛形的四个价格数组拷出来,直接喂给 AddCandles,就能在 300×300 的区域里生成图。 [CODE] CCandleChart chart; chart.Attach(0, "test diagram"); //设置尺寸 chart.SetSize(300,300); //在当前图表上增加10个烛形 double Open[10], Close[10], High[10], Low[10]; CopyOpen(Symbol(), PERIOD_CURRENT, 0, 10, Open); CopyClose(Symbol(), PERIOD_CURRENT, 0, 10, Close); CopyHigh(Symbol(), PERIOD_CURRENT, 0, 10, High); CopyLow(Symbol(), PERIOD_CURRENT, 0, 10, Low); chart.AddCandles(Open, Close, High, Low); //标题 chart.SetTitle(Symbol(), Green, 15); //网格 chart.SetGrid(); //主轴 chart.SetAxis(DIAGRAM_AXIS_LEFT, -1, 0, 0, 10, 4); //获取图表 chart.GetChart(); [/CODE] 逐行看:Attach(0,"test diagram") 把图挂到主窗口;SetSize 定 300×300 像素;四个 double 数组长度都是 10,对应 CopyOpen/CopyClose/CopyHigh/CopyLow 的拷贝根数。AddCandles 吃进这四组数组即出图。SetTitle 用绿色 15 号字写品种名,SetGrid 画网格,SetAxis 设左轴范围与刻度密度,最后 GetChart 触发渲染。 外汇和贵金属波动大、杠杆高,这类裸图只作形态速览,不能单独作为入场依据。把 10 改成 20 或 50,能快速比对不同回看窗口下的烛形密度差异。

MQL5 / C++
CCandleChart chart;
chart.Attach(class="num">0, "test diagram");
class=class="str">"cmt">//设置尺寸
chart.SetSize(class="num">300,class="num">300);
class=class="str">"cmt">//在当前图表上增加10个烛形
class="type">class="kw">double Open[class="num">10], Close[class="num">10], High[class="num">10], Low[class="num">10];
CopyOpen(Symbol(), PERIOD_CURRENT, class="num">0, class="num">10, Open);
CopyClose(Symbol(), PERIOD_CURRENT, class="num">0, class="num">10, Close);
CopyHigh(Symbol(), PERIOD_CURRENT, class="num">0, class="num">10, High);
CopyLow(Symbol(), PERIOD_CURRENT, class="num">0, class="num">10, Low);
chart.AddCandles(Open, Close, High, Low);
class=class="str">"cmt">//标题
chart.SetTitle(Symbol(), Green, class="num">15);
class=class="str">"cmt">//网格
chart.SetGrid();
class=class="str">"cmt">//主轴
chart.SetAxis(DIAGRAM_AXIS_LEFT, -class="num">1, class="num">0, class="num">0, class="num">10, class="num">4);
class=class="str">"cmt">//获取图表
chart.GetChart();

◍ 用 CFormulaChart 把公式画进图表

在 MT5 自定义指标或 EA 里,想让关键数学关系直接显示在图上,可以用 CFormulaChart 类。它只认 TeX 语法的字符串,通过 SetFormulaString() 传进去,不支持别的渲染方式。 实际能调的参数很有限:尺寸用 SetSize() 定,公式内容用 SetFormulaString() 给,颜色靠 SetFormulaColor(),填充靠 SetFill(),没有更复杂的排版接口。 下面这段把二次方程求根式画成 300×75 的蓝字公式,Attach 到 0 号图表、名为 test diagram 的子窗口。跑之前确认 standard library 的 Include\Canvas\Chart 路径已挂上,否则编译期就报找不到类。 外汇与贵金属行情受杠杆影响波动剧烈,这类公式图只是辅助标注,不构成任何方向暗示。

MQL5 / C++
CFormulaChart chart;
chart.Attach(class="num">0, "test diagram");
class=class="str">"cmt">//设置尺寸
chart.SetSize(class="num">300,class="num">75);
class=class="str">"cmt">//添加公式
chart.SetFormulaString("x=-b\pm\sqrt{b^class="num">2-4ac}\over(2a)");
class=class="str">"cmt">//颜色
chart.SetFormulaColor(Blue);
class=class="str">"cmt">//标题
chart.GetChart();

常见问题

用 AddLine 把多个序列逐个塞进图表对象,各自指定颜色和轴范围,避免量级差异导致一条被压成直线。
分组排列会把同组柱子并排开,适合对比类别;重叠排列让柱子同轴叠放,适合看累计趋势,按场景选类。
小布可读取你的指标配置自动调用图表库生成多序列图,你只需选序列和排列方式,不用手搓代码。
内环外环分别传独立数据数组,外环每项可绑定内环分类,渲染时按层级套环,注意数据长度匹配。
用 CCandleChart 需给每根 K 线传开盘、最高、最低、收盘四值,时间轴对齐后蜡烛宽度自动算,缺值会错位。