多交易品种多周期指标中的颜色缓冲区(基础篇)
📘

多交易品种多周期指标中的颜色缓冲区(基础篇)

第 1/3 篇

◍ 多品种多周期指标的颜色缓冲区怎么用

在 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;若某绘图样式要多个数组,颜色数组永远紧跟在最后一个画线数组之后。搞错这个偏移,图表要么不显色要么报数组越界。外汇与贵金属波动剧烈,多色线仅作状态提示,不构成任何方向判定。

MQL5 / C++
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 时很容易改到错位置。 多交易品种多周期指标打算在结构里统一步声明五个数组(四数据一颜色),但访问时总写双索引很烦。后续会给每个指标类封装取数方法,眼下先把缓冲区的顺序约束记牢:同缓冲区的数组必须连续排列,不能和其他系列的数组穿插。

MQL5 / C++
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 新建指标把这段头声明贴进去,编译后能在数据窗口看到各缓冲索引,方便你后续按层隐藏或叠加验证。

MQL5 / C++
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 上试。

MQL5 / C++
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
   

常见问题

颜色缓冲区专门控制画线或画柱时的每根颜色,不和数值缓冲混用,能让你在同一图层按条件切换红绿等色彩。
多半是把颜色索引和数组编号搞混了;颜色缓冲要单独建并填索引号,数值缓冲只管价格,两者绑定到同一绘图缓冲才生效。
可以,小布能读取你的指标结构并标出颜色缓冲绑定错误,提示哪根线该红却没变色,省去手动翻代码的麻烦。
用独立数值缓冲画图、独立颜色缓冲管色,蜡烛和彩线分不同索引绑定,避免数组复用导致图层重叠窜色。
易错在只绑了数值数组忘绑颜色数组,或索引顺序颠倒;按文档先绑值后绑色,确认每根对应索引一致即可。