第五部分、bar数据元素常用到的基本计算函数【逆序版,适合直接做逻辑判断用】
  
- UID
- 2
- 积分
- 2954160
- 威望
- 1427117 布
- 龙e币
- 1527043 刀
- 在线时间
- 13879 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-5-13

|
第五部分、bar数据元素常用到的基本计算函数【逆序版,适合直接做逻辑判断用】
头文件声明变量:- //第五部分 基本函数(开始)【常用函数】【返回逆序数组变量,适合直接做逻辑判断用】
- vector<double>Summation(vector<double> pc, int num); //数组前NUM项元素加总计算(返回数组前NUM项的和,返回的仍然是数组形式)
- vector<double>Average(vector<double> pc, int num); //average(pc[i],N)数组前NUM项元素加总计算(返回数组前NUM项的和,返回的仍然是数组形式)
- vector<double>Xaverage(vector<double> pc, int num); //Xaverage(ema)计算公式(返回数组)
- vector<double>Highest(vector<double> pc, int num); //high(pc[i],N)返回数组的num周期的最大值元素并存入新的数组(功能等同SeriesHigh)
- vector<double>Lowest(vector<double> pc, int num); //low(pc[i],N)返回数组的num周期的最小值元素并存入新的数组(功能等同SeriesLow)
- vector<double>AvgTruerange(int num); //数组型Truerange计算公式
- vector<double>Truerange(); //数组型Truerange计算公式
- //基本函数(结束)【常用函数】【返回逆序数组变量】
复制代码 |
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|
|
|
|
|
|
  
- UID
- 2
- 积分
- 2954160
- 威望
- 1427117 布
- 龙e币
- 1527043 刀
- 在线时间
- 13879 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-5-13

|
公式模块增加:- //第五类函数(常用到的基本计算函数,逆序版,适合直接做逻辑判断用)
- //数组前NUM项元素加总计算(返回逆序数组形式,最新序列号是[0])
- vector<double> test::Summation(vector<double> pc, int num)
- {
- reverse(pc.begin(), pc.end());//恢复计算变量为正序以方便下面的计算
- vector<double> sumvector;//声明一个存储和的容器变量
- double sum = 0;
- for (size_t i = 0; i < pc.size(); i++)
- {
- if (i == 0)
- {
- sumvector.push_back(pc[i]);;
- }
- else if (i < num) //如果数据数目小于周期要求的最低bar数量
- {
- sum = 0;
- for (size_t j = 0; j < i; j++)
- {
- sum = sum + pc[i - j];//前num个数值相加
- }
- sumvector.push_back(sum); //用简单平均代替并存入容器中
- }
- else //pc数目大于num周期后正常计算方法
- {
- sum = 0;//重置加总变量
- for (size_t j = 0; j < num; j++)
- {
- sum = sum + pc[i - j];//加总从pc[i]往左数num个pc的数值
- }
- sumvector.push_back(sum);
- }
- }
- reverse(sumvector.begin(), sumvector.end());//再次调转逆序与行业规范统一
- return sumvector;
- }
- //数组前NUM项元素简单加总计算(返回数组前NUM项的和,返回的仍然是数组形式)(返回逆序数组形式,最新序列号是[0])
- vector<double> test::Average(vector<double> pc, int num)
- {
- reverse(pc.begin(), pc.end());//恢复计算变量为正序以方便下面的计算
- vector<double> avgvector;//声明一个存储和的容器变量
- avgvector.clear();
- double sum = 0;
- for (size_t i = 0; i < pc.size(); i++)
- {
- if (i == 0)
- {
- avgvector.push_back(pc[i]);;
- }
- else if (i < num) //如果数据数目小于周期要求的最低bar数量
- {
- sum = 0;
- for (size_t j = 0; j < i; j++)
- {
- sum = sum + pc[i - j];//前num个数值相加
- }
- avgvector.push_back(sum / (i + 1)); //用简单平均代替并存入容器中
- }
- else //pc数目大于num周期后正常计算方法
- {
- sum = 0;//重置加总变量
- for (size_t j = 0; j < num; j++)
- {
- sum = sum + pc[i - j];//加总从pc[i]往左数num个pc的数值
- }
- avgvector.push_back(sum / num);
- }
- }
- reverse(avgvector.begin(), avgvector.end());//再次调转逆序与行业规范统一
- return avgvector;
- }
- //Xaverage(ema)计算公式(返回数组)(返回逆序数组形式,最新序列号是[0])
- vector<double> test::Xaverage(vector<double> pc, int num)
- {
- reverse(pc.begin(), pc.end());//恢复计算变量为正序以方便下面的计算
- vector<double> r;
- double d = 0;
- for (int i = 0; i < pc.size(); i++)
- {
- if (i == 0)
- {
- d = pc[0];
- r.push_back(d);
- }
- else
- {
- d = (2 * pc[i] + (num - 1) * d) / (num + 1);
- r.push_back(d);
- }
- }
- reverse(r.begin(), r.end());//再次调转逆序与行业规范统一
- return r;
- }
- //寻找数组中前N个数中的最大值,返回的仍然是数组形式(返回逆序数组形式,最新序列号是[0])
- vector<double> test::Highest(vector<double> pc, int num)
- {
- reverse(pc.begin(), pc.end());//恢复计算变量为正序以方便下面的计算
- vector<double> highvector;//声明一个临时存储最高价的变量容器
- for (size_t i = 0; i < pc.size(); i++)
- {
- if (i == 0)//第一项
- {
- highvector.push_back(pc[i]);//pc容器第一个元素代替
- }
- else if (i < num)//不是第一个元素,但是数据数目不够num周期的
- {
- double r = 0; //声明一个存储最大值的临时变量
- for (size_t j = 0; j < i; j++)
- {
- r = max2(r, pc[i - j]);// 用上面声明的r变量与PC[i] 从i 到0 共 i+1个数据对比,将大值赋给r
- }
- highvector.push_back(r);//将上面循环中得到最大值代替
- }
- else//当i的数目大于或等于要求的num个时
- {
- double r = 0;//声明一个存储最大值的临时变量
- for (size_t k = 0; k < num; k++)
- {
- r = max2(r, pc[i - k]); //从pc[i]向左数num个元素分别与r比较,将最大的那个值赋给r
- }
- highvector.push_back(r);//将上面的r值增加到数组中。
- }
- }
- reverse(highvector.begin(), highvector.end());//再次调转逆序与行业规范统一
- return highvector; //返回最高价数组
- }
- //寻找数组中前N个数中的最小值,返回的仍然是数组形式(返回逆序数组形式,最新序列号是[0])
- vector<double> test::Lowest(vector<double> pc, int num)
- {
- reverse(pc.begin(), pc.end());//恢复计算变量为正序以方便下面的计算
- vector<double> lowvector;//声明一个临时存储最低价的变量容器
- for (size_t i = 0; i < pc.size(); i++)
- {
- if (i == 0)//第一项
- {
- lowvector.push_back(pc[i]);//pc容器第一个元素代替
- }
- else if (i < num)//不是第一个元素,但是数据数目不够num周期的
- {
- double r = pc[i]; //声明一个存储最大值的临时变量,初始值为pc最新元素值pc[i]
- for (size_t j = 0; j < i; j++)
- {
- r = min2(r, pc[i - j]);// 用上面声明的r变量与PC[i] 从i 到0 共 i+1个数据对比,将最小值赋给r
- }
- lowvector.push_back(r);//将上面循环中得到最小值代替
- }
- else//当i的数目大于或等于要求的num个时
- {
- double r = pc[i]; //声明一个存储最大值的临时变量,初始值为pc最新元素值pc[i]
- for (size_t k = 0; k < num; k++)
- {
- r = min2(r, pc[i - k]); //从pc[i]向左数num个元素分别与r比较,将最小的那个值赋给r
- }
- lowvector.push_back(r);//将上面的r值增加到数组中。
- }
- }
- reverse(lowvector.begin(), lowvector.end());//再次调转逆序与行业规范统一
- return lowvector; //返回最高价数组
- }
- //数组型Truerange的N周期平均计算公式(返回逆序数组形式,最新序列号是[0])
- vector<double> test::AvgTruerange(int num)
- {
- double dPreClose = 0;
- vector<double>vAtr, avgatr;
- RsqBar(sPeriod, sInst);
- map<string, TKVALUE >::iterator it;
- for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); ++it)
- {
- if (dPreClose != 0) //后续bar的计算
- {
- 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; //第一次运行先将收盘价赋值给dpreclose,方便后同的计算
- }
- for (size_t i = 0; i < vAtr.size(); i++)
- {
- if (i < num) //数量小于周期时用0代替
- {
- avgatr.push_back((int)0);
- }
- else
- {
- double sumatr = 0;
- for (size_t j = 0; j < num; j++)
- {
- sumatr += vAtr[i - j];
- }
- avgatr.push_back(sumatr / num);
- }
- }
- reverse(avgatr.begin(), avgatr.end());//调转数组顺序以与行业规范统一
- return avgatr;
- }
- //数组型Truerange计算公式(返回逆序数组形式,最新序列号是[0])
- vector<double> test::Truerange()
- {
- double dPreClose = 0;
- double sumatr = 0;
- vector<double>vAtr;
- RsqBar(sPeriod, sInst);
- map<string, TKVALUE >::iterator it;
- for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); ++it)
- {
- if (dPreClose != 0) //后续bar的计算
- {
- 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; //第一次运行先将收盘价赋值给dpreclose,方便后同的计算
- }
- reverse(vAtr.begin(), vAtr.end());//调转数组顺序以与行业规范统一
- return vAtr;
- }
- //第五类函数(常用到的基本计算函数,逆序版,适合直接做逻辑判断用)
复制代码 |
|
|
|
|
|
|
  
- UID
- 2
- 积分
- 2954160
- 威望
- 1427117 布
- 龙e币
- 1527043 刀
- 在线时间
- 13879 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-5-13

|
这里有一个说明特例,即在在当函数中数据也是用逆序的价格数据即可。 |
|
|
|
|
|
|