探索创建多彩烛条的选项·综合运用
◍ 用 12 缓冲区分色绘制多空与中性烛条
想在 MT5 里把做多、做空、中性三类蜡烛用不同颜色区分,且支持带填充与无填充两种观感,直接套用 DRAW_COLOR_CANDLES 不够用。更可控的做法是开 12 个数据缓冲区:多、空、中性各占 4 个(分别存开高低收),比早期版本缓冲区数量明显增多,但换来了参数界面里更细的业务信息。 关键一步是隐藏不需要显示的贴图。调用 PlotIndexSetDouble 把绘图索引 0、1、2 的 PLOT_EMPTY_VALUE 设为 0.0,这样在 OnCalculate 里把某类缓冲全填 0.0,对应蜡烛就不会画出来。每次计算时先统一清零 12 个缓冲,再按规则给要显示的那种贴图写 OHLC,视觉上和以前一致,但逻辑更透明。 颜色模式可以这么定:做多边界绿、阴线填绿、阳线填白;做空边界红、阴线填红、阳线填白;中性边界黄、阴线填黄、阳线填白。阳线填白在白底图表上会给人“无填充”的错觉,等于一套代码兼顾两种风格。外汇与贵金属波动剧烈,此类着色仅作状态标记,不预示方向。
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 设定的绿、红、黄三套(实体+白芯+实体)配色,指标加载后多头蜡偏绿、空头偏红、震荡偏黄。外汇与贵金属波动剧烈,这种着色仅描述已发生结构,不预示后续方向,实盘请自担高风险。
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 的透明叠色法,或在参数框里写清每种色的含义。 外汇与贵金属杠杆高、滑点突兀,任何自绘指标都只是辅助判读,真要上线请先在策略测试器跑一轮再挂实盘。