C++程序化/量化学习视频教程系列 第054节:鼎元C++量化之如何使用容器(vector)对bar数据进行中级处理【vector容器使用范例:正迭代计算简单均线average】
  
- UID
- 2
- 积分
- 2946217
- 威望
- 1423145 布
- 龙e币
- 1523072 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-4-27

|
C++程序化/量化学习视频教程系列 第054节:鼎元C++量化之如何使用容器(vector)对bar数据进行中级处理【vector容器使用范例:正迭代计算简单均线average】
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|
|
|
|
|
|
  
- UID
- 2
- 积分
- 2946217
- 威望
- 1423145 布
- 龙e币
- 1523072 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-4-27

|
test.h头文件中先声明vector变量:- vector<double>pc;//进行数组设计时统一的数组变量,方便以后使用中统一口径;
- vector<double> re;
- int r=0 ;
- double d=0;
- double e=0;
复制代码 test.cpp源文件中将收盘价存储 到上面声明的变量中- RsqBar(sPeriod, sInst);
- map<string, TKVALUE>::iterator it;//迭代
- for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); it++) //遍历所有K线
- {
- pc.push_back(it->second.dClose);//将收盘价存储到pc容器中,按正序排序
- }
复制代码- //主程序中用VECTOR计算均线值
- for (int i = 0; i < pc.size(); i++)
- {
- if ( i < length) //如果bar的数目不够基本的周期,则返回加总除以bar数目代替
- {
- d = (d + pc[i]) / (i+1);
- re.push_back(d);
- }
- else //如何bar数目大于基本周期num个数据,则通过for循环向前加总num个数组除num周期得均线值
- {
- for (size_t j = 0; j < length; j++) //循环length次
- {
- e = e + pc[i - j]; //从现有bar向左加总length个数据
- }
- d = e / length;
- re.push_back(d);
- e = 0;//将e重置成0方便下一个bar继续循环使用
- }
- }
-
- InsertLog("正迭代之均线值引用公式计算: " + to_string(re1[re.size() - 1])); //将新变量最新值输出到日志
复制代码 |
|
|
|
|
|
|
  
- UID
- 2
- 积分
- 2946217
- 威望
- 1423145 布
- 龙e币
- 1523072 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-4-27

|
在主程序中设计在日志区输出:- for (size_t k = 0; k < length; k++)
- {
- InsertLog("从最新bar向左第 " + to_string(k) + " 个bar收盘价为: " + to_string(pc[pc.size() - 1 - k]))
- }
- InsertLog("正迭代均线值公式计算: " + to_string(re[re.size() - 1])); //将新变量最新值输出到日志
复制代码 |
|
|
|
|
|
|
  
- UID
- 2
- 积分
- 2946217
- 威望
- 1423145 布
- 龙e币
- 1523072 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-4-27

|
视频中主程序计算策略程式码部分:- //调用bar数据,要包括品种合约,运行周期
- RsqBar(sPeriod, sInst);
- //迭代
- map<string, TKVALUE>::iterator it;//正向迭代
- for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); it++)
- {
- pc.push_back(it->second.dClose); //将收盘价存入PC容器(按正序排列)
- }
-
- //声明几个需要用到的中间变量
- vector<double>re;
- double d = 0;
- double e = 0;
- //在主程序中用vector计算平均值(average)
- for (size_t i = 0; i < pc.size(); i++) //建立for循环,处理数据
- {
- if (i < length) //如果bar的收盘价价pc里面的数据不到指定的周期数量,比方说length周期均值,但是数据数量只有length-1个
- {
- d = (d + pc[i]) / (i + 1);//加总每一个pc的元素的价格,并除以现有的pc收盘价的个数代替length周期均值
- re.push_back(d);//将计算出的均值替代赋与re容器,排列顺序与pc容器一致
- }
- else //如果pc数据大于或等于length个时,就可以按正常方法计算均值了
- {
- for (size_t j = 0; j < length; j++) //再套一个for循环,换一个名称j
- {
- e = e + pc[i - j]; //现在外面大循环是第i次,然后用一个for循环从右向左依次加总length个数值,
- }
- d = e / length; //将上面的加总除以length周期数,即可得第i个pc数据与之前的length-1个数据的均值了。
- re.push_back(d);//将均值存储入re容器中
- e = 0;//将e重置成0方便下次循环i+1继续循环使用
- }
- }
- //在主程序中设计日志输出
- for (size_t k = 0; k < length; k++)
- {
- InsertLog("从最新bar向左第 " + to_string(k) + " 个bar收盘价为: " + to_string(pc[pc.size() - 1 - k])); //打印输出length周期个pc的收盘价数据至日志面板
- }
- InsertLog("正迭代均值公式计算: " + to_string(length) + "周期个pc收盘价均值为: " + to_string(re[re.size() - 1])); //将re容器中最新的length周期个pc收盘价的均值输出到面板
复制代码 pc的vectro声明已经在test.h头文件中声明,所以在主程序中就不再声明了。 |
|
|
|
|
|
|
  
- UID
- 2
- 积分
- 2946217
- 威望
- 1423145 布
- 龙e币
- 1523072 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-4-27

|
运行效果:
 |
|
|
|
|
|
|