探索创建多彩烛条的选项·综合运用
📘

探索创建多彩烛条的选项·综合运用

第 3/3 篇

◍ 用 12 缓冲区分色绘制多空与中性烛条

想在 MT5 里把做多、做空、中性三类蜡烛用不同颜色区分,且支持带填充与无填充两种观感,直接套用 DRAW_COLOR_CANDLES 不够用。更可控的做法是开 12 个数据缓冲区:多、空、中性各占 4 个(分别存开高低收),比早期版本缓冲区数量明显增多,但换来了参数界面里更细的业务信息。 关键一步是隐藏不需要显示的贴图。调用 PlotIndexSetDouble 把绘图索引 0、1、2 的 PLOT_EMPTY_VALUE 设为 0.0,这样在 OnCalculate 里把某类缓冲全填 0.0,对应蜡烛就不会画出来。每次计算时先统一清零 12 个缓冲,再按规则给要显示的那种贴图写 OHLC,视觉上和以前一致,但逻辑更透明。 颜色模式可以这么定:做多边界绿、阴线填绿、阳线填白;做空边界红、阴线填红、阳线填白;中性边界黄、阴线填黄、阳线填白。阳线填白在白底图表上会给人“无填充”的错觉,等于一套代码兼顾两种风格。外汇与贵金属波动剧烈,此类着色仅作状态标记,不预示方向。

MQL5 / C++
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,BuyBuffer1,INDICATOR_DATA);
   SetIndexBuffer(class="num">1,BuyBuffer2,INDICATOR_DATA);
   SetIndexBuffer(class="num">2,BuyBuffer3,INDICATOR_DATA);
   SetIndexBuffer(class="num">3,BuyBuffer4,INDICATOR_DATA);
   SetIndexBuffer(class="num">4,SellBuffer1,INDICATOR_DATA);
   SetIndexBuffer(class="num">5,SellBuffer2,INDICATOR_DATA);
   SetIndexBuffer(class="num">6,SellBuffer3,INDICATOR_DATA);
   SetIndexBuffer(class="num">7,SellBuffer4,INDICATOR_DATA);
   SetIndexBuffer(class="num">8,NeutralBuffer1,INDICATOR_DATA);
   SetIndexBuffer(class="num">9,NeutralBuffer2,INDICATOR_DATA);
   SetIndexBuffer(class="num">10,NeutralBuffer3,INDICATOR_DATA);
   SetIndexBuffer(class="num">11,NeutralBuffer4,INDICATOR_DATA);
   PlotIndexSetDouble(class="num">0,PLOT_EMPTY_VALUE,class="num">0.0);
   PlotIndexSetDouble(class="num">1,PLOT_EMPTY_VALUE,class="num">0.0);
   PlotIndexSetDouble(class="num">2,PLOT_EMPTY_VALUE,class="num">0.0);
class=class="str">"cmt">//---
   class="kw">return(INIT_SUCCEEDED);
  }
  {
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++)
     {
      class=class="str">"cmt">//initializing the candles data
      BuyBuffer1[i]=class="num">0.0;
      BuyBuffer2[i]=class="num">0.0;
      BuyBuffer3[i]=class="num">0.0;
      BuyBuffer4[i]=class="num">0.0;
      SellBuffer1[i]=class="num">0.0;
      SellBuffer2[i]=class="num">0.0;
      SellBuffer3[i]=class="num">0.0;
      SellBuffer4[i]=class="num">0.0;
      NeutralBuffer1[i]=class="num">0.0;
      NeutralBuffer2[i]=class="num">0.0;
      NeutralBuffer3[i]=class="num">0.0;
      NeutralBuffer4[i]=class="num">0.0;

双均线通道下的多空蜡烛着色逻辑

这段核心循环把每根蜡烛按价格相对 10 与 20 根前收盘的位置,硬性归类为买入、卖出或中性三类。判定本身极简:当 close[i] 同时大于 close[i-10] 与 close[i-20] 时记为 buy,反之同小于则记为 sell,其余情况落入 neutral。 归类后并不是只打标记,而是把整根蜡烛的 OHLC 分别写进对应缓冲区数组(BuyBuffer1~4 / SellBuffer1~4 / NeutralBuffer1~4),顺序固定为开、高、低、收。这样下游绘图时,三类蜡烛就能用不同颜色独立渲染,不会互相覆盖。 末尾 return(rates_total) 把已处理柱数交还系统,下一帧只增量计算新柱;配合 #property indicator_color1/2/3 设定的绿、红、黄三套(实体+白芯+实体)配色,指标加载后多头蜡偏绿、空头偏红、震荡偏黄。外汇与贵金属波动剧烈,这种着色仅描述已发生结构,不预示后续方向,实盘请自担高风险。

MQL5 / C++
class=class="str">"cmt">//Close[class="num">0] > Close[class="num">10] e 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] e 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];
class=class="str">"cmt">//Setting the values to the candles according to the trading rules
if(buy)
  {
   BuyBuffer1[i]=open[i];
   BuyBuffer2[i]=high[i];
   BuyBuffer3[i]=low[i];
   BuyBuffer4[i]=close[i];
  }
else
  if(sell)
    {
     SellBuffer1[i]=open[i];
     SellBuffer2[i]=high[i];
     SellBuffer3[i]=low[i];
     SellBuffer4[i]=close[i];
    }
   else
    {
     NeutralBuffer1[i]=open[i];
     NeutralBuffer2[i]=high[i];
     NeutralBuffer3[i]=low[i];
     NeutralBuffer4[i]=close[i];
    }
  }
class=class="str">"cmt">//--- class="kw">return value of prev_calculated for next call
   class="kw">return(rates_total);
   }
class="macro">#class="kw">property indicator_color1   clrGreen,clrWhite,clrGreen
class="macro">#class="kw">property indicator_color2   clrRed,clrWhite,clrRed
class="macro">#class="kw">property indicator_color3   clrYellow,clrWhite,clrYellow

「一点提醒」

回看整组实现,蜡烛上色无非两条路:DRAW_CANDLES 与 DRAW_COLOR_CANDLES。前者把低收烛的边缘和填充都设成透明,看起来像未填充烛,再用底部颜色区分多空;后者直接靠多缓冲区给每根烛定色。 若指标要表达的规则超过 4~5 种状态,硬上 DRAW_COLOR_CANDLES 会迅速堆出 10 个以上颜色缓冲区,实测在普通 PC 上会明显吃掉显存与 CPU,拖慢 MT5 刷新。此时不如退回 DRAW_CANDLES 的透明叠色法,或在参数框里写清每种色的含义。 外汇与贵金属杠杆高、滑点突兀,任何自绘指标都只是辅助判读,真要上线请先在策略测试器跑一轮再挂实盘。

常见问题

可建立 12 个颜色缓冲区,分别绑定多空与中性状态下的阴阳烛,编译后到品种页切换显示即可直观区分。
以收盘价突破通道上轨倾向多头色、跌破下轨倾向空头色,通道内归为中性色,按此逻辑写着色分支。
小布可在对应品种页直接加载着色模板并标出多空中性分区,你只需核对颜色与通道位置是否一致。
会,建议中性区只用低饱和色,把视觉权重留给突破通道的多空烛,避免噪音。
多半是缓冲区索引绑错或重绘事件未触发,检查 OnCalculate 返回值并手动刷新一次图表。