基于画布的指标:为通道填充透明度(基础篇)
📘

基于画布的指标:为通道填充透明度(基础篇)

第 1/3 篇

◍ 给通道填色加透明度

在 MT5 里画通道类指标,很多人直接把背景涂死,结果价格蜡烛被盖住一半,盯盘时反而看不清。给填充区域加透明度,是画布指标里最实用的一招。 关键在 CCanvas 的填充函数配合 ColorToARGB 做 alpha 通道。把 alpha 值设到 30–80 之间(0 全透明、255 不透明),通道带就能透出后面的 K 线。社区示例帖(2023-08-22 发布,浏览 1479)里用 50 的 alpha 做布林通道填充,实测在 1 分钟图上既不挡价格也不显脏。 外汇与贵金属波动大、滑点高,这类视觉优化只解决读图效率,不预示方向,任何形态都可能失效,请务必用小资金或模拟盘验证。

为什么用画布来画填充区

想在 MT5 里做一条「两条线之间用纯色填充」的指标,常规 DRAW_FILLING 只能填不透明色块,要控制透明度、做渐变或贴图,标准库的 CCanvas 类是目前最干净的路子。它把图表区域当成一张位图来画,线条、填充、透明通道都能按像素操控。 本文系列只先在主图表窗口里折腾这套逻辑,搞定之后再扩展到子窗口指标。系列会依次覆盖:为何选画布、图表窗口属性、属性查看器指标、坐标转换、带透明的 DRAW_FILLING,以及子窗口扩展方法。 对交易者来说,这类指标的价值在于能把「通道厚度 = 波动概率带」画得更直观,但外汇/贵金属杠杆高,任何可视化工具都只是辅助,信号失效时该砍就砍。

「为什么不用 DRAW_FILLING 而选画布」

在 MT5 自定义指标里,DRAW_FILLING 是最直觉的填充画法,但实战中它有两个硬伤。 第一,指标自身的填充色会和图表上的蜡烛、趋势线、其它指标的颜色叠在一起,肉眼很难分清边界,盯盘时容易误读支撑阻力区。 第二,DRAW_FILLING 不支持 alpha 通道,你没法用半透明去压低视觉权重。贵金属与外汇市场波动剧烈、高风险,界面越干净越不容易被杂色带偏。 所以改用 Canvas 直接绘制,颜色与透明度全由代码控制,图层干净,也方便后续接小布这类 AIGC 分析做叠加标注。

◍ 拿到图表窗口的尺寸与刻度

在 MT5 里画任何自定义图形前,先要把图表窗口的物理与价格边界问清楚。获取这些属性靠的是 ChartGetInteger 和 ChartGetDouble 两个函数,字符串类属性这次用不到,可以忽略 ChartGetString。 CHART_WIDTH_IN_PIXELS 返回图表区宽度(像素),不含右侧价格标尺;CHART_HEIGTH_IN_PIXELS 是子窗口高度,不含底部日期标尺。这两个值决定了你能往哪片画布落笔。 价格映射方面,CHART_PRICE_MAX 对应子窗口顶部的价格,CHART_PRICE_MIN 对应底部价格。把像素 y 坐标和这两个值做线性插值,就能把任意价格换算成屏幕纵坐标。 缩放系数 CHART_SCALE 值得注意:实测它不是直接像素间距,而是 2 的幂次。柱线间距约等于 pow(2, CHART_SCALE),调大该值图形会显著变疏。 可见范围由 CHART_FISRT_VISIBLE_BAR(从左起第一根可见柱)和 CHART_VISIBLE_BARS(可见柱总数)给出。外汇与贵金属波动快、跳空多,基于这些属性重绘时务必考虑刷新延迟带来的高风险误绘。

窗口尺寸变了画布就得跟着改

MT5 图表对象里有两个底层属性值得盯死:CHART_WIDTH_IN_PIXELS 和 CHART_HEIGTH_IN_PIXELS(后者原文拼写如此,实际应为 CHART_HEIGHT_IN_PIXELS)。它们返回的是当前图表窗口以像素为单位的宽与高,是你在用 Canvas 画图时决定作图缓冲区大小的硬依据。 当用户拖拽边框、切品种、或价格跳动触发坐标轴重算导致窗口重绘,这两个值可能实时变动。若你的自定义画布对象还按旧尺寸申请内存,轻则图形被截断,重则在 OnChartEvent 里反复申请资源拖慢终端。外汇与贵金属品种波动剧烈,窗口重绘频率偏高,这类隐性开销在高周期多图表布局下风险不小。 最直白的验证办法:写一个极简指标,把这两个属性直接 Print 或 Comment 出来,然后手动缩放窗口、切换时间帧,观察数值跳变规律。我们借这个动作顺便把 Canvas 的初始化流程跑通,后面做复杂绘图就有了基准。

常见问题

在画布填充时用带 alpha 通道的颜色值(如 0x33FFFFFF),alpha 越低越透明,建议 20%-30% 避免遮挡价格。
内置填充无法灵活控制透明度和边界样式,画布能精确指定每像素颜色和层级,适合做轻量叠加诊断。
小布可在对应品种页直接生成带透明度的通道图层,你只需选区间,无需手写画布代码。
监听窗口尺寸变化事件,在 OnChartEvent 里重设画布宽高并重新绘制,否则坐标会偏移。
用 ChartGetInteger(0, CHART_WIDTH_IN_PIXELS) 和 CHART_HEIGHT_IN_PIXELS 取像素宽高,再换算数据坐标。