股指 CCI 指标的算法和 C++ 源代码

百度上的算法不正确(2021/10/20),计算结果与平安证券 App 比较有较大误差。

1,正确算法如下,

TYP = (最高价 + 最低价 + 收盘价) / 3,
MA 是 TYP 在 N 日内(默认14)的移动平均数,
MD 是 TYP 在 N 日内,每个 TYP 与 TYP 均值的差值的绝对值之和的平均数.
公式为:
CCI=(TYP-MA)/ MD / 0.015
其中,
TYP=(Highest+Lowest+Close)/ 3
MA=(TYP1 + TYP2 + ... + TYP14)/ 14
MD= (abs(TYP1-MA) + abs(TYP2-MA) + ... + abs(TYP14-MA))/ 14

2,源代码如下,

bool UCci::Calc(double* pLowest, double* pHighest, double* pClosePrice,
int* pStockDate, int count)
{

  double ma = 0;
  double md = 0;
  double* typ = new double[count]; //存放每日 TYP 值
  double typ_sum = 0; // TYP 值 N 日之和
  double typ_diff_sum = 0;// TYP 与均值的差值的绝对值的和
  CciArray[0] = 0; // 存放 CCI 值的类变量

  //先计算 Days 日
  for(int i=0; i<Days; i++) // Days 为类变量,默认为 14
  {
    typ[i] = (pClosePrice[i] + pLowest[i] + pHighest[i])/K1; //K1为类变量,默认为 3
    typ_sum += typ[i];
    CciArray[i] = 0;
    StockDateArray[i] = pStockDate[i]; //StockDateArray 为类变量,存放每日的日期
  }

  for(int i=Days; i<count; i++) // 每次只计算 Days 日,所以要减去最前的一日
  {
    typ[i] = (pClosePrice[i] + pLowest[i] + pHighest[i])/K1; 
    typ_sum += typ[i] - typ[i-Days];
    ma = typ_sum / Days;

    for(int j=0; j<Days; j++) // 因为 MA 值随日期变动,所以每日都需要重新计算
    {
      typ_diff_sum += abs(typ[i-j] - ma);
    }
    md = typ_diff_sum / Days;

    CciArray[i] = (typ[i] - ma) / md / J1; // J1为类变量,默认为 0.015
    StockDateArray[i] = pStockDate[i];

    typ_diff_sum = 0;
  }

  delete [] typ;

  return true;
}

上一篇:SQLServer 根据表名生成实体类


下一篇:QT in VS 多语言实现(中英文切换,每个步骤都有截图,只有UTF8才能让Qt语言家正确读取。先qApp->removeTranslator,然后installTranslator,每个类都要写上槽函数RetranslateUI)