C++程序化/量化学习视频教程系列 第055节:鼎元C++量化之如何使用容器(vector)对bar数据进行高级处理【vector容器使用范例:正迭代计算length周期最高价与最低价】
  
- UID
- 2
- 积分
- 2945057
- 威望
- 1422565 布
- 龙e币
- 1522492 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-4-24

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

|
程式码部分:- vector<double>highp, lowp;//声明两个容器变量,用来存储每个bar的最高价和最低价
- //调用bar数据,要包括品种合约,运行周期
- RsqBar(sPeriod, sInst);
- //迭代
- map<string, TKVALUE>::iterator it;//正向迭代
- for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); it++)
- {
- highp.push_back(it->second.dHigh); //将每个bar的最高价high存入highp容器(按正序排列)
- lowp.push_back(it->second.dLow); //将每个bar的最低价low存入lowp容器(按正序排列)
- }
- vector<double>highestp, lowestp;//声明两个容器变量,用来存储一定周期length内的最高价和最低价
- //声明几个需要用到的中间变量
- //在主程序中用vector计算出length周期内的最大值highestp和lowestp
- for (size_t i = 0; i < highp.size(); i++) //建立for循环,处理数据
- {
- if (i == 0) //第一个次循环时,将highp[0],lowp[0] 值赋给highestp[0]和lowestp[0]
- {
- highestp.push_back(highp[i]);
- lowestp.push_back(lowp[i]);
- }
- if (i < length) //如果 0<i<length时
- {
- highestp.push_back(max2(highestp[i-1],highp[i]));//比较highestp[i-1]与highp[i],最大值赋给highestp[i]
- lowestp.push_back(min2(lowestp[i - 1], lowp[i]));//比较lowestp[i-1]与lowp[i],将最小值赋给lowestp[i]
- }
- else //如果pc数据大于或等于length个时,就可以按正常方法计算均值了
- {
- double d = -9999;//声明一个用来存储length周期内最大值的变量
- double e = 9999;
- for (size_t j = 0; j < length; j++) //再套一个for循环,换一个名称j
- {
- d = max2(d , highp[i - j]); //现在外面大循环是第i次,然后用一个for循环从右向左依次比较d与high[i-j]的值,取大者存入d
- e = min2(e, lowp[i - j]);// 从[i]个数从右至左比较lowp[i-j]与e的大小,取小值存入e,
- }
- highestp.push_back(d);// 将length周期内highp最大值赋给lowestp
- lowestp.push_back(e); //将length周期内lowp最小值赋给lowestp;
- }
- }
- //在主程序中设计日志输出length周期内bar的high值,highp的值及highestp值,bar的low值,lowp值及lowestp值
- for (size_t k = 0; k < length; k++)
- {
- InsertLog("第 " + to_string(k) + " 个bar最高价为: " + to_string(highp[highp.size() - 1 - k])); //打印输出length周期个highp的high值数据至日志面板
- }
- for (size_t k = 0; k < length; k++)
- {
- InsertLog("第 " + to_string(k) + " 个bar最低价为: " + to_string(lowp[lowp.size() - 1 - k])); //打印输出length周期个highp的high值数据至日志面板
- }
- InsertLog("正迭代最高价公式计算: " + to_string(length) + "周期个high价最大值为: " + to_string(highestp[highestp.size() - 1])); //将highestp容器中最新的length周期个最高价输出到面板
- InsertLog("正迭代最低价公式计算: " + to_string(length) + "周期个low价最小值为: " + to_string(lowestp[lowestp.size() - 1])); //将highestp容器中最新的length周期个最高价输出到面板
复制代码 |
|
|
|
|
|
|
  
- UID
- 2
- 积分
- 2945057
- 威望
- 1422565 布
- 龙e币
- 1522492 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-4-24

|
|
|
|
|
|
|
  
- UID
- 2
- 积分
- 2945057
- 威望
- 1422565 布
- 龙e币
- 1522492 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-4-24

|
视频中程式代码核心模块:- //在主程序中设计获取length周期内最高价格与最低价格
- vector<double>highp,lowp;//先声明两个变量,分别用来存储每个bar的high价和low价
- //调用bar数据,元素包括运行周期与期货合约
- RsqBar(sPeriod,sInst);
- //建立正迭代与遍历,在bar的mapk数据中调用到high和low,然后存入上面声明的两个容器变量中
- map<string, TKVALUE>::iterator it;//正向迭代
- for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); it++) //正向遍历,从左边第一个数据bar开始向右直到最新生成的bar为止
- {
- highp.push_back(it->second.dHigh);//将每个bar的high价存入到highp容器中(顺序与bar的顺序一致)
- lowp.push_back(it->second.dLow);//将每个bar的low价存入到lowp容器中(顺序与bar的顺序一致)
- }
- //再声明两个变量,存储length周期内的最高价highestp和最低价lowestp
- vector<double>highestp, lowestp;
- //在主程序中用vector计算出length周期内的最大值highestp和最小值lowestp
- for (size_t i = 0; i < highp.size(); i++)//建立for循环,对上面生成的highp和lowp两个数据进行处理
- {
- if (i == 0)// 第一次循环时,将highp[0],lowp[0]值赋给higheestp[0]和lowestp[0]
- {
- highestp.push_back(highp[i]);
- lowestp.push_back(lowp[i]);
- }
- if (i < length)//如果 0 <i < length时,即数据不够length个时
- {
- highestp.push_back(max2(highestp[i - 1], highp[i]));//比较highestp前一个值与highp当前值,将大者存入当前highestp
- lowestp.push_back(min2(lowestp[i - 1], lowp[i]));
- }
- else //i >= length时 ,数据足够,可以按正常计算
- {
- //声明两个变量,极大值初始极小,极小值初始极大,看后面的使用,理解这里的意义
- double d = -9999;
- double e = 9999;
- for (size_t j = 0; j < length; j++) //新建立一个for循环,用来在i次大循环时再向左(后)循环,寻找length周期内的极值
- {
- d = max2(d, highp[i - j]);//大循环第i次,用另一个循环从右向左依次比较d值和highp[i-j]值,取大者存入d,循环length次,找到length周期内的那个最大值
- e = min2(e, lowp[i - j]);//原理与上面一致,这里理解为什么我要初始上面的值了,要是期货品种价格大于一万,就要赋更大的值给它。
- }
- highestp.push_back(d);//将length周期内highp最大值赋给highestp;
- lowestp.push_back(e);//将length周期内lowp最小值赋给lowestp;
- }
- }
- //在主程序中设计日志输出length周期内bar的high值,即highp,highestp值,low值即lowp值和lowestp值
- for (size_t k = 0; k < length; k++)
- {
- InsertLog("第 " + to_string(length) + " 个bar的最高价为: " + to_string(highp[highp.size() - 1 - k]));//打印出length个周期bar的high值
- }
- for (size_t m = 0; m < length; m++)
- {
- InsertLog("第 " + to_string(length) + " 个bar的最低价为: " + to_string(lowp[lowp.size() - 1- m]));//打印出length个周期bar的low值
- }
- InsertLog("正迭代最高价公式计算 " + to_string(length) + " 周期个high价最大值为: " + to_string(highestp[highestp.size() - 1]));
- InsertLog("正迭代最低价公式计算 " + to_string(length) + " 周期个low价最小值为:" + to_string(lowestp[lowestp.size() - 1]));
复制代码 |
|
|
|
|
|
|
  
- UID
- 2
- 积分
- 2945057
- 威望
- 1422565 布
- 龙e币
- 1522492 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-4-24

|
运行效果:
 |
|
|
|
|
|
|
  
- UID
- 2
- 积分
- 2945057
- 威望
- 1422565 布
- 龙e币
- 1522492 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-4-24

|
简评:
1、刚才代码写错了一个地方,导致多次退出,具体在这里:- if (i == 0)// 第一次循环时,将highp[0],lowp[0]值赋给higheestp[0]和lowestp[0]
- {
- highestp.push_back(highp[i]);
- lowestp.push_back(lowp[i]);
- }
复制代码 我手敲代码时将lowp 敲成lowestp了,导致程序连续报错,崩溃。
2、最后我检查输出,也就一个没完善的地方,就是直接输出length个bar的值,我的用意是输出第 0 1 2 3 等bar的high和low值。这样改就行- for (size_t k = 0; k < length; k++)
- {
- InsertLog("第 " + to_string(k) + " 个bar的最高价为: " + to_string(highp[highp.size() - 1 - k]));//打印出length个周期bar的high值
- }
- for (size_t m = 0; m < length; m++)
- {
- InsertLog("第 " + to_string(m) + " 个bar的最低价为: " + to_string(lowp[lowp.size() - 1- m]));//打印出length个周期bar的low值
- }
复制代码 注意 这里的输出的值是从右边最新为第一个,然后向左取值输出的。跟今天我们设计的正序是相反的。思考一下为什么要这样输出。 |
|
|
|
|
|
|
  
- UID
- 2
- 积分
- 2945057
- 威望
- 1422565 布
- 龙e币
- 1522492 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-4-24

|
重新修正后的显示效果:
 |
|
|
|
|
|
|