探索创建多彩烛条的选项·进阶篇
(2/3)·从单色到填充多彩烛条,四种构建路径的优劣与适用硬件环境一次看清
◍ 用指标属性画红色蜡烛
在 MQL5 自定义指标里,想直接把图表渲染成红色蜡烛,不需要写任何 OnCalculate 逻辑,靠预处理器属性就能搞定。 上面这段代码全部是 #property 指令,编译后 MT5 会自动按 DRAW_CANDLES 类型画出 K 线,颜色锁定 clrRed,线宽 1、实线样式。 实测在 MT5 新建指标文件粘贴这段,加载到 EURUSD 小时图,所有蜡烛都会变成红色——外汇和贵金属波动剧烈,红色仅作视觉区分,不暗示任何方向。
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 策略测试器自行验证。
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 线聚集区往往是震荡段,绿/红连续段才提示趋势倾向。外汇与贵金属杠杆高,染色仅作概率参考,不等于方向确认。
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 把第二段属性贴进指标头,编译后切到白底图表,就能看到深灰看跌蜡烛和黑边对比的效果,外汇与贵金属波动剧烈,仅作视觉区分不预示方向。
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