  
- UID
- 2
- 积分
- 2954160
- 威望
- 1427117 布
- 龙e币
- 1527043 刀
- 在线时间
- 13879 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-5-13

|
第三部分、常用到的bar数据元素计算函数【数值型,适合直接做逻辑判断用】
公式模块增加:- //第三类函数(常用到的bar数据元素计算函数,数值型,适合直接做逻辑判断用)
- double test::SummationFC(string period, string inst, int num)
- {
- double sum = 0;//声明一个临时存储和的变量
- int n = 0;//声明一个统计循环次数的临时变量
- map<string, TKVALUE>::reverse_iterator it;
- for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
- {
- sum = sum + it->second.dClose;//收盘价加总
- n++;
- if (n >= num)break; //当循环次数n大于等于num时跳出循环(如果bar的数目小时num周期,就按有多少bar就计算多少bar的)
- }
- return sum;
- }
- //均线average计算公式开始
- double test::averageFC(string period, string inst, int num)
- {
- double d = 0;
- int n = 0;
- map<string, TKVALUE>::reverse_iterator it;
- // InsertLog(to_string(mapK[period][inst].size()));
- for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
- {
- d += it->second.dClose;
- n++;
- if (n >= num)break;
- }
- return d / n;
- }
- //均线average[1]计算公式开始
- double test::averagerefFC(string period, string inst, int num, int ref)
- {
- double d = 0;
- int n = 0;
- int r = 0;
- map<string, TKVALUE>::reverse_iterator it;
- // InsertLog(to_string(mapK[period][inst].size()));
- for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
- {
- r++;
- if (r <= ref)continue;
- d += it->second.dClose;
- n++;
- if (n >= num)break;
- }
- return d / n;
- }
- //最高价highest计算公式开始
- double test::highestFC(string period, string inst, int num)
- {
- double d = 0;
- int n = 0;
- map<string, TKVALUE>::reverse_iterator it;
- for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
- {
- if (d < it->second.dHigh)d = it->second.dHigh;
- n++;
- if (n >= num)break;
- }
- return d;
- }
- //最高价highest[1]计算公式开始
- double test::highestrefFC(string period, string inst, int num, int ref)
- {
- double d = 0;
- int n = 0;
- int r = 0;
- map<string, TKVALUE>::reverse_iterator it;
- for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
- {
- r++;
- if (r <= ref)continue;
- if (d < it->second.dHigh)d = it->second.dHigh;
- n++;
- if (n >= num)break;
- }
- return d;
- }
- //最低价lowest计算公式
- double test::lowestFC(string period, string inst, int num)
- {
- double d = 0;
- int n = 0;
- map<string, TKVALUE>::reverse_iterator it;
- for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
- {
- if (d == 0)d = it->second.dLow;
- if (d > it->second.dLow)d = it->second.dLow;
- n++;
- if (n >= num)break;
- }
- return d;
- }
- //最低价lowest[1]计算公式开始
- double test::lowestrefFC(string period, string inst, int num, int ref)
- {
- double d = 0;
- int n = 0;
- int r = 0;
- map<string, TKVALUE>::reverse_iterator it;
- for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
- {
- r++;
- if (r <= ref)continue;
- if (d == 0)d = it->second.dLow;
- if (d > it->second.dLow)d = it->second.dLow;
- n++;
- if (n >= num)break;
- }
- return d;
- }
- //ATR,averagetruerange计算公式开始
- double test::avgtruerangeFC(string period, string inst, int num)
- {
- double dPreClose = 0;
- int n = 0;
- double sumatr = 0;
- vector<double>vAtr;
- if (mapK[period][inst].size() < num) return 0;
- map<string, TKVALUE >::iterator it;
- for (it = mapK[period][inst].begin(); it != mapK[period][inst].end(); ++it)
- {
- if (dPreClose != 0)
- {
- double d = it->second.dHigh - it->second.dLow;
- double dHC = abs(it->second.dHigh - dPreClose);
- double dLC = abs(it->second.dLow - dPreClose);
- if (d < dHC)d = dHC;
- if (d < dLC)d = dLC;
- vAtr.push_back(d);
- }
- dPreClose = it->second.dClose;
- }
- for (int i = 1; i <= num; i++)
- {
- sumatr += vAtr[vAtr.size() - i];
- }
- return sumatr / num;
- }
- //布林带(bollingerbands)开始
- double test::bollingerbandsFC(string period, string inst, int num, int ref)
- {
- double avg1 = averageFC(sPeriod, sInst, num);//中间均线
- int n = 0;
- double sumdev = 0;
- double madev = 0;
- if (mapK[period][inst].size() < num) return 0;
- map<string, TKVALUE>::reverse_iterator it;
- for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
- {
- sumdev += pow(it->second.dClose - avg1, 2); //diff平方加总
- n++;
- if (n >= num)break;
- }
- madev = sqrt(sumdev / num); //得到方差后再取标准差
- return avg1 + ref * madev;
- }
- //方差计算公式开始
- double test::VarianceFC(string period, string inst, int num)
- {
- double avg1 = averageFC(sPeriod, sInst, num);//中间均线
- int n = 0;
- double sumdev = 0;
- double madev = 0;
- if (mapK[period][inst].size() < num) return 0;
- map<string, TKVALUE>::reverse_iterator it;
- for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
- {
- sumdev += pow(it->second.dClose - avg1, 2); //偏离平方加总
- n++;
- if (n >= num)break;
- }
- return sumdev / n;
- }
- // 方差计算公式结束
- //标准差计算公式开始
- double test::StandardDevFC(string period, string inst, int num)
- {
- double value1 = 0;
- if (mapK[period][inst].size() < num) return 0;
- value1 = VarianceFC(sPeriod, sInst, num);
- return sqrt(value1);
- }
- // 标准差计算公式结束
- //xaverage计算公式(跟下面ema函数为同一函数,方便大家偏好)
- double test::xaverageFC(string period, string inst, int num)
- {
- double d = 0;
- int r = 0;
- map<string, TKVALUE >::iterator it;
- for (it = mapK[period][inst].begin(); it != mapK[period][inst].end(); ++it)
- {
- if (r < num)//当数据不够num个bar时用总和/(bar个数加1)
- {
- d = (d + it->second.dClose) / (r + 1);
- r++;
- }
- else //当bar的总个数大于num个周期时,ema = a*close + (1-a)*ema[1],a一般为2/(num+1)
- {
- d = (2 * it->second.dClose + (num - 1) * d) / (num + 1);
- }
- }
- return d;
- }
- //ema计算公式开始
- double test::emaFC(string period, string inst, int num)
- {
- double d = 0;
- int r = 0;
- map<string, TKVALUE >::iterator it;
- for (it = mapK[period][inst].begin(); it != mapK[period][inst].end(); ++it)
- {
- if (r < num)//当数据不够num个bar时用总和/(bar个数加1)
- {
- d = (d + it->second.dClose) / (r + 1);
- r++;
- }
- else //当bar的总个数大于num个周期时,ema = a*close + (1-a)*ema[1],a一般为2/(num+1)
- {
- d = (2 * it->second.dClose + (num - 1) * d) / (num + 1);
- }
- }
- return d;
- }
- //获得close[ref]值
- double test::closerefFC(string period, string inst, int ref)
- {
- int d = 0;
- int r = 0;
- map<string, TKVALUE>::reverse_iterator it;//逆向迭代
- for (it = mapK[sPeriod][sInst].rbegin(); it != mapK[sPeriod][sInst].rend(); it++) //逆向遍历所有K线
- {
- r++;
- if (r <= ref)continue; //跳过ref个bar
- d = it->second.dClose; //将ref个bar前一个bar的收盘价赋值给d ;
- break;
- }
- return d;
- }
- //第三类函数(常用到的bar数据元素计算函数,逆序版,适合直接做逻辑判断用)
复制代码 |
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|