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