图表逐项着色

除了前面在 ENUM_DRAW_TYPE 中列出的标准绘图类型外,平台还提供了它们的变体,支持对每根柱线上的值进行单独着色。为此,使用一个额外的指标缓冲区来存储颜色编号。这些编号对应于程序员定义的一组颜色的特殊数组中的元素。最大颜色数量为 64。

下表列出了支持颜色功能的 ENUM_DRAW_TYPE 元素,以及绘制它们所需的缓冲区数量(包括 1 个用于存储颜色索引的缓冲区)。

可视化类型

说明

缓冲区 
数量

DRAW_COLOR_LINE

多色线条

1+1

DRAW_COLOR_SECTION

多色分段

1+1

DRAW_COLOR_ARROW

多色箭头

1+1

DRAW_COLOR_HISTOGRAM

零轴多色直方图

1+1

DRAW_COLOR_HISTOGRAM2

基于两个指标缓冲区配对值的多色直方图

2+1

DRAW_COLOR_ZIGZAG

多色锯齿线

2+1

DRAW_COLOR_BARS

多色柱线

4+1

DRAW_COLOR_CANDLES

多色蜡烛图

4+1

在将缓冲区绑定到图表时,请记住,必须在SetIndexBuffer的第一个参数中,在数据缓冲区编号之后紧接着的编号位置下,指定一个额外的颜色缓冲区。例如,如果要使用一个数据缓冲区和一个颜色缓冲区为线条着色,数据缓冲区编号为 0,其颜色缓冲区编号为 1:

double ColorLineData[];
double ColorLineColors[];
   
void OnInit()
{
   SetIndexBuffer(0ColorLineDataINDICATOR_DATA);
   SetIndexBuffer(1ColorLineColorsINDICATOR_COLOR_INDEX);
   PlotIndexSetInteger(0PLOT_DRAW_TYPEDRAW_COLOR_LINE);
   ...
}

图表 N 的调色板中的初始颜色集可通过#property indicator_colorN指令指定。它要求以逗号分隔的颜色,可使用常量名或颜色字面值指定。例如,指标中的以下条目将为第 0 个图表选择 6 种标准颜色进行着色(在指令中编号从 1 开始):

#property indicator_color1   clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan

在程序中,不是指定显示图形结构的颜色自身,而是指定颜色的索引。调色板中的编号方式与常规数组相同,从 0 开始。因此,如果需要为第 i 根柱线设置绿色,只需在颜色缓冲区中设置调色板中绿色的索引即可,在本例中为 2。

 ColorLineColors[i]=2;// reference to element with color clrGreen

用于着色的颜色集并非固定不变,可使用 PlotIndexSetInteger(index, PLOT_LINE_COLOR, color)函数动态更改。

例如,要将上述调色板中的 clrGreen 颜色替换为 clrGray,请使用以下调用:

   PlotIndexSetInteger(0PLOT_LINE_COLORclrGray);

让我们在 WPR 指标中应用着色。新文件为IndColorWPR.mq5。修改涉及以下方面:

缓冲区数量增加了 1 个。三种颜色替代单一颜色。

#property indicator_buffers    2
#property indicator_plots      1
#property indicator_type1      DRAW_COLOR_LINE
#property indicator_color1     clrDodgerBlue,clrGreen,clrRed

OnInit中新增了颜色缓冲区数组及其注册。

double WPRColors[];
 
void OnInit()
{
   ...
   SetIndexBuffer(1WPRColorsINDICATOR_COLOR_INDEX);
   ...

如果没有设置 INDICATOR_COLOR_INDEX 缓冲区类型(即使用 SetIndexBuffer(1, WPRColors)调用时,会被默认视为 INDICATOR_DATA 类型),它将在 Data Window 中可见。

OnCalculate函数的工作循环内,我们基于对第 i 根柱线值的分析添加着色。默认情况下,我们使用索引为 0 的颜色,即之前的clrDodgerBlue。如果指标读数进入上方区域,用颜色 2 (clrRed) 高亮显示;如果进入下方区域,用颜色 1 (clrGreen) 高亮显示。

int OnCalculate(ON_CALCULATE_STD_FULL_PARAM_LIST)
{
   ...
   for(int i = fmax(prev_calculated - 1WPRPeriod - 1);
      i < rates_total && !IsStopped(); i++)
   {
      ...
      WPRColors[i] = 0;
      if(WPRBuffer[i] > -20WPRColors[i] = 2;
      else if(WPRBuffer[i] < -80WPRColors[i] = 1;
   }
   return rates_total;
}

在屏幕上的显示效果如下。

WPR 指标,含彩色超买和超卖区域

WPR 指标,含彩色超买和超卖区域

请注意,如果线段的最后一个点(柱线)位于上方区域或下方区域,则该线段将以另一种颜色绘制。在这种情况下,先前的读数可能位于中间区域,这可能会让人误以为颜色有误。但这是正确的行为,符合当前实现,也与平台的颜色使用方式一致。

DRAW_COLOR_LINE 线型图表中两个相邻柱线之间的线段颜色由右侧(时间上更新的)柱线颜色决定。

如果你希望仅对相邻两根柱线均处于同一区域的线段进行颜色高亮显示,按以下方案修改代码:

      WPRColors[i] = 0;
      if(WPRBuffer[i] > -20 && WPRBuffer[i - 1] > -20WPRColors[i] = 2;
      else if(WPRBuffer[i] < -80 && WPRBuffer[i - 1] < -80WPRColors[i] = 1;

此外,请记住,我们已在源代码中添加了标题设置和值显示精度(2 位小数)。将新图像与旧图像进行对比,你会注意到以下视觉差异:特别是,标题现在显示为“%R(14)”,且纵向数值轴的显示更为紧凑。

我们要在指标 IndColorWPR.mq5中进行的最后一项修改是:跳过初始柱线的绘制。