探索创建多彩烛条的选项·进阶篇
🕯️

探索创建多彩烛条的选项·进阶篇

(2/3)·从单色到填充多彩烛条,四种构建路径的优劣与适用硬件环境一次看清

偏理论 第 2/3 篇
把三条移动平均线直接叠在价格图上,看似信息丰富,实则颜色和关系双重辨识负担会让决策频繁出错。用烛条颜色浓缩多变量信号,是把混乱转为客观买卖提示的有效办法。本篇接上篇概念,继续深挖 MQL5 里怎么把这套逻辑落到指标代码。

◍ 用指标属性画红色蜡烛

在 MQL5 自定义指标里,想直接把图表渲染成红色蜡烛,不需要写任何 OnCalculate 逻辑,靠预处理器属性就能搞定。 上面这段代码全部是 #property 指令,编译后 MT5 会自动按 DRAW_CANDLES 类型画出 K 线,颜色锁定 clrRed,线宽 1、实线样式。 实测在 MT5 新建指标文件粘贴这段,加载到 EURUSD 小时图,所有蜡烛都会变成红色——外汇和贵金属波动剧烈,红色仅作视觉区分,不暗示任何方向。

MQL5 / C++
class="macro">#class="kw">property indicator_label1  "Candle"
class="macro">#class="kw">property indicator_type1   DRAW_CANDLES
class="macro">#class="kw">property indicator_color1  clrRed
class="macro">#class="kw">property indicator_style1  STYLE_SOLID
class="macro">#class="kw">property indicator_width1  class="num">1

给烛条挂上多色缓冲区的实操

把普通 DRAW_CANDLES 改成 DRAW_COLOR_CANDLES,核心动作是多加一条颜色索引缓冲区。原文示例里缓冲区总数从 4 涨到 5,新增的 CandleColor 专门存每根烛条的颜色序号,0 代表第一种色、1 代表第二种,n 种色就是 0 到 n-1。 在 OnInit 里用 SetIndexBuffer(4, CandleColor, INDICATOR_COLOR_INDEX) 把这条缓冲告诉编译器它是色标而非价格数据;同时 indicator_color1 要列全用到的颜色,比如 clrGreen, clrRed。MQL 向导里直接切绘图类型就能自动补这些声明,不用手敲也行。 上色逻辑放在 OnCalculate:收盘价大于开盘价写 0(绿),否则写 1(红),跑出来就是标准涨绿跌红烛条。若换成交易规则——close[0] 同时大于 close[10] 和 close[20] 染绿,同时小于两者染红,其余交叉情况染黄——就得在 indicator_color1 里再加 clrYellow,此时颜色索引扩到 0/1/2。 MT5 参数窗口不会标注哪种颜色对应多空或中性,颜色一多(比如 6 色)用户很容易懵。做可视化指标时,这种颜色语义说明得单独写进外部说明,别指望终端弹窗能替你讲清楚。外汇与贵金属波动剧烈,多色提示仅为概率倾向,实盘前请在 MT5 策略测试器自行验证。

MQL5 / C++
class="macro">#class="kw">property copyright "Copyright class="num">2021, 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">5
class="macro">#class="kw">property indicator_plots   class="num">1
class=class="str">"cmt">//--- plot Candle
class="macro">#class="kw">property indicator_label1  "Candle"
class="macro">#class="kw">property indicator_type1   DRAW_COLOR_CANDLES
class="macro">#class="kw">property indicator_color1  clrGreen,clrRed
class="macro">#class="kw">property indicator_style1  STYLE_SOLID
class="macro">#class="kw">property indicator_width1  class="num">1
class=class="str">"cmt">//--- indicator buffers
class="type">class="kw">double      CandleBuffer1[];
class="type">class="kw">double      CandleBuffer2[];
class="type">class="kw">double      CandleBuffer3[];
class="type">class="kw">double      CandleBuffer4[];
class="type">class="kw">double      CandleColor[];
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
   SetIndexBuffer(class="num">0,CandleBuffer1,INDICATOR_DATA);
   SetIndexBuffer(class="num">1,CandleBuffer2,INDICATOR_DATA);
   SetIndexBuffer(class="num">2,CandleBuffer3,INDICATOR_DATA);
   SetIndexBuffer(class="num">3,CandleBuffer4,INDICATOR_DATA);
   SetIndexBuffer(class="num">4,CandleColor,INDICATOR_COLOR_INDEX);
class=class="str">"cmt">//---
   class="kw">return(INIT_SUCCEEDED);
   }
   for(class="type">int i = start; i<rates_total; i++)
     {
      CandleBuffer1[i]=open[i];
      CandleBuffer2[i]=high[i];
      CandleBuffer3[i]=low[i];
      CandleBuffer4[i]=close[i];
      class=class="str">"cmt">//if the close price is higher than the open price we set the 
      class=class="str">"cmt">//green class="type">color (index class="num">0), otherwise, the red class="type">color (index class="num">1)

「用双均线跨度给 K 线染色」

这段逻辑把每根 K 线的收盘价比对 10 根和 20 根前的收盘,直接决定画线颜色:双高判买、双低判卖、其余留黄。 CandleColor[i]=(close[i]>open[i])?0:1; 是初版写法,只比单根阴阳;后面改成 buy/sell 双条件才具备趋势过滤意义。 代码里 start 初始化保护很关键:prev_calculated<20 时强制从 20 开始循环,避免 i-20 越界;rates_total 不足时也做了截断。 你在 MT5 自定义指标里把 indicator_color1 设成 clrGreen,clrRed,clrYellow,加载到 XAUUSD 的 H1,会看到黄色 K 线聚集区往往是震荡段,绿/红连续段才提示趋势倾向。外汇与贵金属杠杆高,染色仅作概率参考,不等于方向确认。

MQL5 / C++
CandleColor[i]=(close[i]>open[i])?class="num">0:class="num">1;
class="macro">#class="kw">property indicator_color1   clrGreen,clrRed,clrYellow
  {
class=class="str">"cmt">//---
   class="type">int start = prev_calculated;
   if(prev_calculated<class="num">20)
      start = class="num">20;
   if(start>=rates_total)
      start = rates_total-class="num">1;
   for(class="type">int i = start; i<rates_total; i++)
     {
      CandleBuffer1[i]=open[i];
      CandleBuffer2[i]=high[i];
      CandleBuffer3[i]=low[i];
      CandleBuffer4[i]=close[i];
      class=class="str">"cmt">//Close[class="num">0] > Close[class="num">10] and Close[class="num">0] > Close[class="num">20]
      class="type">bool buy = close[i]>close[i-class="num">10] && close[i]>close[i-class="num">20];
      class=class="str">"cmt">//Close[class="num">0] < Close[class="num">10] and Close[class="num">0] < Close[class="num">20]
      class="type">bool sell = close[i]<close[i-class="num">10] && close[i]<close[i-class="num">20];
      CandleColor[i]=(buy)?class="num">0:(sell)?class="num">1:class="num">2;
     }
class=class="str">"cmt">//--- class="kw">return value of prev_calculated for next call
   class="kw">return(rates_total);
  }

◍ 用缓冲区颜色区分涨跌烛体的边界与填充

回到最初那版单色蜡烛代码,我们仍用 DRAW_CANDLES 类型配 4 个缓冲区。indicator_color1 里写的颜色顺序直接决定渲染样式:第一种颜色画蜡烛边缘,第二种颜色填实体。演示里写 clrBlack 加 clrWhite,出来的就是黑边白填充的极简图。 如果想一眼分出多空,就把 indicator_color1 扩到 3 种颜色。此时仍是 4 个缓冲区不变,第一种颜色管所有蜡烛边缘,第二种填看涨实体,第三种填看跌实体。上面第二段代码把第三色设成 clrDarkGray,边缘还是 clrBlack,于是看跌蜡烛成了深灰填充、和黑边明显拉开层次。 这套写法替代了前文第一个上色规则,好处是边界色独立可控。开 MT5 把第二段属性贴进指标头,编译后切到白底图表,就能看到深灰看跌蜡烛和黑边对比的效果,外汇与贵金属波动剧烈,仅作视觉区分不预示方向。

MQL5 / C++
class="macro">#class="kw">property indicator_type1   DRAW_CANDLES
class="macro">#class="kw">property indicator_color1   clrBlack,clrWhite
class="macro">#class="kw">property indicator_type1   DRAW_CANDLES
class="macro">#class="kw">property indicator_color1   clrBlack,clrWhite,clrDarkGray
让小布替你跑这套配色诊断
这些多色烛条的信号密度是否过载,小布盯盘的 AIGC 已内置了品种页的诊断视图,打开对应外汇或贵金属页面就能直接比对你的规则与盘口反应,把重复劳动交给小布,你专注决策。

常见问题

变量和线条关系越多,视觉辨识成本越高,解释错误概率上升,决策一致性会下降,外汇贵金属本身波动剧烈,误判代价可能放大。
比较每根烛条的 Close 与 Open 即可:Close 大于 Open 倾向高收,反之为低收,再据此赋予对应颜色。
目前小布盯盘内置的是通用信号密度与配色诊断,不支持外部 mq5 直接挂载,但你可用它的 AIGC 视图对照自己指标的逻辑漏洞。
填充物涉及边缘与内部双色绘制,比单色线框更吃硬件,在低频周期影响小,高频刷新的贵金属盘面可能拖慢帧率。