百度上的算法不正确(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;
}