多交易品种多周期指标中的颜色缓冲区(基础篇)
◍ 多品种多周期指标的颜色缓冲区怎么用
在 MT5 里写多交易品种、多周期指标时,颜色缓冲区(color buffer)是绕不开的一环。它和普通数据缓冲区不同,每个元素存的是颜色值,用来在副图或主图上按条件染色,而不是画线数值。 很多新手把指标线缓冲区和颜色缓冲区混用,结果在跨品种调用 iCustom 时只拿到数值数组,颜色全丢。实际上颜色缓冲区需要在 OnInit 里用 PlotIndexSetInteger 显式绑定到对应绘图索引,并指定 DRAW_COLOR_LINE 或 DRAW_COLOR_HISTOGRAM 这类绘图类型。 一个可验证的现象:在 EURUSD 的 M15 周期上挂一个读取 XAUUSD H1 状态的彩色柱状指标,若颜色缓冲区未正确分配,MT5 终端会在专家日志抛出「array out of range」且柱子显示为灰色——这是 2024 年 7 月社区示例里 1552 次浏览帖子中高频踩坑点。外汇与贵金属跨周期引用波动大,实盘前务必在策略测试器用历史数据跑一遍。
「指标清单与阅读路径」
MT5 内置技术指标体系按功能可拆成趋势、震荡、成交量三大类,上面这份清单覆盖了终端默认自带的 36 个标准指标,从 Alligator 到 Williams Percent Range 均在列。 对价格行为交易者来说,先看趋势类(如 Moving Averages、Parabolic SAR)定结构,再用震荡类(如 RSI、Stochastic)读背离,最后用成交量类(如 OBV、Volumes)验成色,是较直接的阅读顺序。 这份目录本身不教用法,但可作为你开 MT5 后对照「插入→指标」菜单的核对表:漏装的或没见过的,优先翻文档跑一遍默认参数看图形。
多色指标缓冲区的颜色索引机制
在 MT5 里做多交易品种、多周期指标时,单色缓冲区只是普通双精度数组,用 CopyBuffer() 取数再靠 SetIndexBuffer() 绑到绘制数组就能出图。多色线则多了一层颜色索引数组,除了数据本身还要告诉绘图引擎每个柱形用哪种颜色。 一条彩色指标线最多支持 64 种颜色。静态写法是在编译指令里写 indicator_colorN,比如给第一条线定死绿色和红色,绿色索引 0、红色索引 1,简洁但改不了。要动态换色就得走 PlotIndexSetInteger(),先分配颜色数量,再按行情状态切色。 颜色索引数组的编号规则很死:必须比被绘制的数据数组索引大 1;若某绘图样式要多个数组,颜色数组永远紧跟在最后一个画线数组之后。搞错这个偏移,图表要么不显色要么报数组越界。外汇与贵金属波动剧烈,多色线仅作状态提示,不构成任何方向判定。
class="macro">#class="kw">property indicator_color1 clrGreen,clrRed PlotIndexSetInteger(class="num">0,PLOT_COLOR_INDEXES,class="num">2); PlotIndexSetInteger(class="num">0,PLOT_LINE_COLOR,class="num">0,clrGreen); PlotIndexSetInteger(class="num">0,PLOT_LINE_COLOR,class="num">1,clrRed);
◍ 缓冲区索引和数组编号不是一回事
在 MT5 自定义指标里,绘图缓冲区(plot)和底层数组(buffer)是两套编号逻辑。一个绘图缓冲区按样式可能占用 1~5 个 double 数组,彩色填充类还会多占一个颜色索引数组,且颜色数组必须排在该缓冲区所分配数组的最后。 以一段实测模板为例:总共声明 17 个 indicator_buffers 数组,但只挂了 6 个 indicator_plots 图形系列。Label1 是普通线用 1 个数组,Label2 是双线间填充区域用 2 个数组加 1 个颜色数组。也就是说,第六个绘图缓冲区(索引 4)实际占用了索引 9、10、11 的三个数组,却仍只用「4」这个绘图索引去设属性。 给图形系列设属性时认的是绘图缓冲区索引,不是数组索引。比如用输入参数把索引 0 传进去,对应 Label1 就从数据窗口消失;传 5 则隐藏 Label6。这套区分不搞清,改 PlotIndexSetInteger 时很容易改到错位置。 多交易品种多周期指标打算在结构里统一步声明五个数组(四数据一颜色),但访问时总写双索引很烦。后续会给每个指标类封装取数方法,眼下先把缓冲区的顺序约束记牢:同缓冲区的数组必须连续排列,不能和其他系列的数组穿插。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Test.mq5 | class=class="str">"cmt">//| Copyright class="num">2023, MetaQuotes Ltd. | class=class="str">"cmt">//| [MQL5官方文档] | class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#class="kw">property copyright "Copyright class="num">2023, MetaQuotes Ltd." class="macro">#class="kw">property link "[MQL5官方文档] class="macro">#class="kw">property version "class="num">1.00" class="macro">#class="kw">property indicator_chart_window class="macro">#class="kw">property indicator_buffers class="num">17 class=class="str">"cmt">// class="num">17 arrays for indicator calculations in total class="macro">#class="kw">property indicator_plots class="num">6 class=class="str">"cmt">// Out of class="num">17 arrays, class="num">6 graphic series are plotting buffers class=class="str">"cmt">//--- plot Label1 class="macro">#class="kw">property indicator_label1 "Label1" class="macro">#class="kw">property indicator_type1 DRAW_LINE class=class="str">"cmt">// Plot buffer with index class="num">0 is a simple line, requires one array to plot class="macro">#class="kw">property indicator_color1 clrRed class=class="str">"cmt">// Color line: Red class="macro">#class="kw">property indicator_style1 STYLE_SOLID class="macro">#class="kw">property indicator_width1 class="num">1 class=class="str">"cmt">//--- plot Label2 class="macro">#class="kw">property indicator_label2 "Label2" class="macro">#class="kw">property indicator_type2 DRAW_FILLING class=class="str">"cmt">// Plot buffer with index class="num">1 is a colored area drawn between two indicator lines, requires two arrays to plot class="macro">#class="kw">property indicator_color2 clrRed,clrDeepSkyBlue class=class="str">"cmt">// Area class="type">color: wither Red or DeepSkyBlue depending on which line is higher class="macro">#class="kw">property indicator_style2 STYLE_SOLID class="macro">#class="kw">property indicator_width2 class="num">1 class=class="str">"cmt">//--- plot Label3 class="macro">#class="kw">property indicator_label3 "Label3"
「用多缓冲区分图层画蜡烛与彩线」
MT5 自定义指标靠 #property indicator_typeN 决定第 N 个绘图缓冲的渲染形态。上面这段声明里,index 2 用 DRAW_CANDLES,必须喂 4 个 OHLC 数组才能画出单色蜡烛;index 3 用 DRAW_COLOR_LINE,只需 1 个数据数组加 1 个颜色索引数组,最多可挂 64 色,这里先给红和皇家蓝两种。
DRAW_COLOR_HISTOGRAM2(index 4)是两线间的彩色柱,要 2 个数据数组加 1 个颜色数组,示例配了红、森林绿、原木色三色。index 5 的 DRAW_COLOR_CANDLES 更重,4 个 OHLC 数组之外还要 1 个颜色索引数组,颜色给了红、蓝、灰。
输入变量 InpHidePlotIndex 默认 0,用来控制隐藏某个绘图层。下方缓冲声明对应前面类型:Label3Buffer1/2 是 index 2 的 OHLC 前两数组,Label2Buffer1/2 供 index 1 双数组使用。开 MT5 新建指标把这段头声明贴进去,编译后能在数据窗口看到各缓冲索引,方便你后续按层隐藏或叠加验证。
class="macro">#class="kw">property indicator_type3 DRAW_CANDLES class=class="str">"cmt">// Plot buffer with index class="num">2, display as single-class="type">color candlesticks, requires class="num">4 arrays of OHLC data to plot class="macro">#class="kw">property indicator_color3 clrDarkSalmon class=class="str">"cmt">// Color: DarkSalmon class="macro">#class="kw">property indicator_style3 STYLE_SOLID class="macro">#class="kw">property indicator_width3 class="num">1 class=class="str">"cmt">//--- plot Label4 class="macro">#class="kw">property indicator_label4 "Label4" class="macro">#class="kw">property indicator_type4 DRAW_COLOR_LINE class=class="str">"cmt">// Plot buffer with index class="num">3, class="type">color line, requires two arrays to plot: data array + class="type">color index array class="macro">#class="kw">property indicator_color4 clrRed,clrRoyalBlue class=class="str">"cmt">// Two colors: Red and RoyalBlue. Can have up to class="num">64 colors class="macro">#class="kw">property indicator_style4 STYLE_SOLID class="macro">#class="kw">property indicator_width4 class="num">1 class=class="str">"cmt">//--- plot Label5 class="macro">#class="kw">property indicator_label5 "Label5" class="macro">#class="kw">property indicator_type5 DRAW_COLOR_HISTOGRAM2 class=class="str">"cmt">// Plot buffer with index class="num">4, class="type">color histogram between two lines, requires three arrays: class="num">2 data arrays + class="type">color index array class="macro">#class="kw">property indicator_color5 clrRed,clrForestGreen,clrBurlyWood class=class="str">"cmt">// Three colors: Red, ForestGreen and BurlyWood. Can have up to class="num">64 colors class="macro">#class="kw">property indicator_style5 STYLE_SOLID class="macro">#class="kw">property indicator_width5 class="num">1 class=class="str">"cmt">//--- plot Label6 class="macro">#class="kw">property indicator_label6 "Label6" class=class="str">"cmt">// Plot buffer with index class="num">5, class="type">color histogram between two lines, requires class="num">5 arrays: class="num">4 OHLC data arrays + class="type">color index array class="macro">#class="kw">property indicator_type6 DRAW_COLOR_CANDLES class=class="str">"cmt">// Three colors: Red, Blue and Gray. Can have up to class="num">64 colors class="macro">#class="kw">property indicator_color6 clrRed,clrBlue,clrGray class="macro">#class="kw">property indicator_style6 STYLE_SOLID class="macro">#class="kw">property indicator_width6 class="num">1 class=class="str">"cmt">//--- input variables input class="type">uchar InpHidePlotIndex = class="num">0; class=class="str">"cmt">// Hide Plot Index class=class="str">"cmt">//--- indicator buffers class="type">class="kw">double Label1Buffer[]; class=class="str">"cmt">// Plot buffer with index class="num">0 class="type">class="kw">double Label2Buffer1[]; class=class="str">"cmt">// Plot buffer with index class="num">1, array class="num">1 class="type">class="kw">double Label2Buffer2[]; class=class="str">"cmt">// Plot buffer with index class="num">1, array class="num">2 class="type">class="kw">double Label3Buffer1[]; class=class="str">"cmt">// Plot buffer with index class="num">2, array class="num">1 class="type">class="kw">double Label3Buffer2[]; class=class="str">"cmt">// Plot buffer with index class="num">2, array class="num">2
多数组绑定给一个绘图缓冲的写法
MT5 自定义指标里,一个 Plot 可以不是单数组独撑,而是多个数据数组拼出来。上面这段声明里,Label3Buffer1 到 Label3Buffer4 四个 double 数组,全喂给绘图缓冲索引 2,分别承载 Open/High/Low/Close 四条线。 OnInit 中真正落地靠 SetIndexBuffer:索引 3~6 依次绑到 Label3Buffer1~4,类型都标 INDICATOR_DATA。也就是说,图表上看到的「第 3 号 Plot」实际由 4 个缓冲拼成,这种结构在做类 K 线或四价带时很省事。 你开 MT5 新建指标,把下面代码贴进声明区和 OnInit,编译后能在数据窗口看到 4 条独立序列;外汇与贵金属波动大,这类多缓冲指标重绘时可能卡顿,建议先在 XAUUSD 的 M1 上试。
class="type">class="kw">double Label3Buffer3[]; class=class="str">"cmt">// Plot buffer with index class="num">2, array class="num">3 class="type">class="kw">double Label3Buffer4[]; class=class="str">"cmt">// Plot buffer with index class="num">2, array class="num">4 class="type">class="kw">double Label4Buffer[]; class=class="str">"cmt">// Plot buffer with index class="num">3 class="type">class="kw">double Label4Colors[]; class=class="str">"cmt">// Color index array for plot buffer with index class="num">3 class="type">class="kw">double Label5Buffer1[]; class=class="str">"cmt">// Plot buffer with index class="num">4, array class="num">1 class="type">class="kw">double Label5Buffer2[]; class=class="str">"cmt">// Plot buffer with index class="num">4, array class="num">2 class="type">class="kw">double Label5Colors[]; class=class="str">"cmt">// Color index array for plot buffer with index class="num">4 class="type">class="kw">double Label6Buffer1[]; class=class="str">"cmt">// Plot buffer with index class="num">5, array class="num">1 class="type">class="kw">double Label6Buffer2[]; class=class="str">"cmt">// Plot buffer with index class="num">5, array class="num">2 class="type">class="kw">double Label6Buffer3[]; class=class="str">"cmt">// Plot buffer with index class="num">5, array class="num">3 class="type">class="kw">double Label6Buffer4[]; class=class="str">"cmt">// Plot buffer with index class="num">5, array class="num">4 class="type">class="kw">double Label6Colors[]; class=class="str">"cmt">// Color index array for plot buffer with index class="num">5 class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Custom indicator initialization function | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">int OnInit() { class=class="str">"cmt">//--- indicator buffers mapping class=class="str">"cmt">//--- Plot buffer class="num">0. One array to plot SetIndexBuffer(class="num">0,Label1Buffer,INDICATOR_DATA); class=class="str">"cmt">// Data buffer class=class="str">"cmt">//--- Plot buffer class="num">1. Two arrays for construction SetIndexBuffer(class="num">1,Label2Buffer1,INDICATOR_DATA); class=class="str">"cmt">// Line class="num">1 data buffer SetIndexBuffer(class="num">2,Label2Buffer2,INDICATOR_DATA); class=class="str">"cmt">// Line class="num">2 data buffer class=class="str">"cmt">//--- Plot buffer class="num">2. Four arrays for construction SetIndexBuffer(class="num">3,Label3Buffer1,INDICATOR_DATA); class=class="str">"cmt">// Data buffer for line class="num">1 Open SetIndexBuffer(class="num">4,Label3Buffer2,INDICATOR_DATA); class=class="str">"cmt">// Data buffer for line class="num">2 High SetIndexBuffer(class="num">5,Label3Buffer3,INDICATOR_DATA); class=class="str">"cmt">// Data buffer for line class="num">3 Low SetIndexBuffer(class="num">6,Label3Buffer4,INDICATOR_DATA); class=class="str">"cmt">// Data buffer for line class="num">4 Close