这个指标的效果如下所示:

为了实现这个视觉效果,我们使用了三种图形构造:
- DRAW_HISTOGRAM2("上升级别");
- DRAW_LINE("CCI");
- DRAW_HISTOGRAM2("下降级别")。

指标输入参数
- 平均周期 - 指标的平均周期;
- 上升级别 - 上升级别的数值;
- 下降级别 - 下降级别的数值。
上升和下降的级别会立即显示在指标的子窗口中:

如何在EA中访问指标数据
DRAW_HISTOGRAM2样式基于两个指标缓冲,因此在数据窗口中我们会看到两个上升级别和两个下降级别的值:

这些值对应于指标缓冲区从0到4(包含0和4)。
在EA中,我们需要使用 iCustom 创建指标句柄:
//--- 输入参数 input int Inp_CCI_ma_period = 14; // 平均周期 input double Inp_CCI_LevelUP = 90; // 上升级别 input double Inp_CCI_LevelDOWN =-90; // 下降级别 //--- int handle_iCustom; // 存储iCustom指标句柄的变量 //+------------------------------------------------------------------+ //| EA 初始化函数 | //+------------------------------------------------------------------+ int OnInit() { //--- 创建iCCI指标的句柄 handle_iCustom=iCustom(Symbol(),Period(),"CCI颜色级别",Inp_CCI_ma_period,Inp_CCI_LevelUP,Inp_CCI_LevelDOWN); //--- 如果句柄未创建 if(handle_iCustom==INVALID_HANDLE) { //--- 输出失败信息和错误代码 PrintFormat("创建iCCI指标句柄失败,符号为 %s/%s,错误代码 %d", Symbol(), EnumToString(Period()), GetLastError()); //--- 提前停止指标 return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); }
这里假设CCI颜色级别指标位于[data folder]\MQL5\Indicators\。
获取指标数值的方法(仅缓冲区0、2和4是重要的):
//+------------------------------------------------------------------+ //| EA 每个tick函数 | //+------------------------------------------------------------------+ void OnTick() { //--- double level_up = iCustomGet(handle_iCustom,0,0); // 缓冲区#0 -> BufferUpHigh double cci = iCustomGet(handle_iCustom,2,0); // 缓冲区#2 -> BufferCCI double level_down = iCustomGet(handle_iCustom,4,0); // 缓冲区#4 -> BufferDownLow string text="上升级别 #0: "+DoubleToString(level_up,2)+" "+ "CCI #0: "+DoubleToString(cci,2)+" "+ "下降级别 #0: "+DoubleToString(level_down,2); Comment(text); }
在上面的截图中,鼠标指向索引为0的柱子,数据窗口显示了指标数据,EA关于缓冲区0、2和4的信息也在图表上显示。