MT4平台C++自定义指标开发:For循环计算CCI均值难题
嘿,我来帮你搞定MT4自定义指标里计算最近3根K线CCI平均值的问题!先明确个关键逻辑:在MT4的指标buffer里,CCI_buffer[0]对应最新的当前K线,CCI_buffer[1]是上一根已闭合的K线,CCI_buffer[2]是再往前一根——这个索引规则搞清楚,后面的计算就顺了。
下面分两种常见场景给你具体实现方案:
场景1:仅计算最新3根K线的CCI平均值
如果你只需要获取图表上当前最新三根K线的CCI平均值(比如用于交易信号判断),直接取对应索引的值求和除以3即可,但要先判断K线数量是否足够,避免数组越界:
// 先检查图表是否有至少3根有效K线 if(Bars >= 3) { double cci_3avg = (CCI_buffer[0] + CCI_buffer[1] + CCI_buffer[2]) / 3.0; // 这里可以把平均值用到你需要的地方,比如打印日志或作为信号阈值 Print("最近3根K线的CCI平均值:", cci_3avg); } else { // K线数量不足时的兜底处理,用EMPTY_VALUE表示无有效数据 double cci_3avg = EMPTY_VALUE; Print("K线数量不足3根,无法计算平均值"); }
场景2:为每根K线计算对应最近3根的CCI平均值(做成指标线)
如果你想让指标在每根K线位置都显示自身+前两根的CCI平均值(比如生成一条辅助均线),需要新增一个buffer来存储结果,步骤如下:
步骤1:声明并初始化新buffer
在指标的全局区域(所有函数外部)声明两个buffer:
// 原CCI值存储buffer double CCI_buffer[]; // 3根CCI平均值存储buffer double CCI_3Avg_buffer[]; // 自定义CCI周期参数(记得在指标设置里可调整) input int CCI_period = 14;
然后在OnInit()函数里初始化buffer并设置指标样式:
int OnInit() { // 初始化原CCI指标线 SetIndexBuffer(0, CCI_buffer); SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 1, clrRed); // 初始化平均值指标线(用虚线区分) SetIndexBuffer(1, CCI_3Avg_buffer); SetIndexStyle(1, DRAW_LINE, STYLE_DASH, 1, clrBlue); // 设置指标名称和小数位数 IndicatorShortName("CCI(Weighted) + 3-Period Avg"); IndicatorDigits(Digits); return(INIT_SUCCEEDED); }
步骤2:在计算循环里处理平均值
修改你的原计算循环,在每根K线的CCI值计算完成后,判断是否有足够的前序K线来计算平均值:
int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { int limit = rates_total - prev_calculated; // 初次加载时处理所有K线 if(prev_calculated == 0) limit = rates_total; // 从旧到新遍历K线(确保计算平均值时前序K线已处理) for(int i = limit - 1; i >= 0; i--) { // 计算当前K线的CCI值 CCI_buffer[i] = iCCI(NULL, 0, CCI_period, PRICE_WEIGHTED, i); // 计算3根平均值:仅当当前K线有至少两根前序K线时才计算 if(i <= rates_total - 3) { CCI_3Avg_buffer[i] = (CCI_buffer[i] + CCI_buffer[i+1] + CCI_buffer[i+2]) / 3.0; } else { // K线不足时用EMPTY_VALUE,MT4会自动跳过绘制无效点 CCI_3Avg_buffer[i] = EMPTY_VALUE; } } return(rates_total); }
小提示
- 用
EMPTY_VALUE代替0表示无有效数据,图表上不会显示混乱的无效点; - 一定要加K线数量判断,避免数组越界导致指标崩溃;
- 如果需要调整平均的K线数量,直接把代码里的
3改成你想要的数字即可。
内容的提问来源于stack exchange,提问作者Lubo
相关产品推荐
相关产品推荐

