股指 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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM