: | : | :期货量化学习 | :期货量化 |
返回列表 发帖

C++程序化/量化学习视频教程系列 第055节:鼎元C++量化之如何使用容器(vector)对bar数据进行高级处理【vector容器使用范例:正迭代计算length周期最高价与最低价】

C++程序化/量化学习视频教程系列 第055节:鼎元C++量化之如何使用容器(vector)对bar数据进行高级处理【vector容器使用范例:正迭代计算length周期最高价与最低价】

C++程序化/量化学习视频教程系列 第055节:鼎元C++量化之如何使用容器(vector)对bar数据进行高级处理【vector容器使用范例:正迭代计算length周期最高价与最低价】



C++程序化学习视频教程系列安排如下:
第一楼:教学视频。一般控制在15分钟左右;
第二椄:视频课程中使用的程式源码。
第三楼:视频教学中需要用到的一些文档或资源。
第四楼:其它的一些边角料,特别是一些经典程序化策略的回测类的部分会放到下面楼层里面。

参与模式如下:
1、希望参与到编写策略与调试方面的工作通过上面的联系方式联系管理员咨询即可。记的加群,有问题第一时间交流,也可以在论坛指定版发贴交流,专用版地址:http://www.qhlt.cn/forum-244-1.html
2、有意申请试用及绑定期货账户跑实盘网友可以联系管理员,以及开通的方式。
3、基于C++策略交易软件具有:1、软件小(50兆不到);2、效率高(C++语言);3、功能精(专注于策略);4、对服务噐或电脑兼容性好(WIN系统)等优势,特别适合长期跑程序化的客户朋友,特别是有稳定交易模式客户更适合使用C++构建的交易系统。
4、最全的C++期货程序化(量化)教程、视频、源码、课件、资源汇总贴【C++期货程序化/量化研究必备资源贴!】:http://www.qhlt.cn/thread-160231-1-1.html
5、鼎元C++量化程式码技术指标源码C++版模板【建议在test.h和test.cpp中同步至最新,方便统一调用和使用,一次编辑多次使用!】:http://www.qhlt.cn/thread-160230-1-1.html
6、如何使用鼎元C++量化软件以及需要准备的些什么?[C++量化入门必读!]:http://www.qhlt.cn/thread-160415-1-1.html

联系方式:
C++微信群:  QQ群: 管理员微信:;管理员QQ:

论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   1.本站发布源码(包括函数、指标、策略等)均属开放源码,用意在于让使用者学习程序化语法撰写,使用者可以任意修改语法內容并调整参数。仅限用于个人学习使用,请勿转载、滥用,严禁私自连接实盘账户交易
  2.本站发布资讯(包括文章、视频、历史记录、教材、评论、资讯、交易方案等)均系转载自网络主流媒体,内容仅为作者当日个人观点,本网转载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网不对该类信息或数据做任何保证。不对您构成任何投资建议,不能依靠信息而取代自身独立判断,不对因使用本篇文章所诉信息或观点等导致的损失承担任何责任。
  3.本站发布资源(包括书籍、杂志、文档、软件等)均从互联网搜索而来,仅供个人免费交流学习,不可用作商业用途,本站不对显示的内容承担任何责任。请在下载后24小时内删除。如果喜欢,请购买正版,谢谢合作!
  4.龙听期货论坛原创文章属本网版权作品,转载须注明来源“龙听期货论坛”,违者本网将保留追究其相关法律责任的权力。本论坛除发布原创文章外,亦致力于优秀财经文章的交流分享,部分文章推送时若未能及时与原作者取得联系并涉及版权问题时,请及时联系删除。联系方式:http://www.qhlt.cn/thread-262-1-1.html
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

程式码部分:
  1.         vector<double>highp, lowp;//声明两个容器变量,用来存储每个bar的最高价和最低价

  2.         //调用bar数据,要包括品种合约,运行周期
  3.         RsqBar(sPeriod, sInst);
  4.         //迭代
  5.         map<string, TKVALUE>::iterator it;//正向迭代
  6.         for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); it++)
  7.         {
  8.                 highp.push_back(it->second.dHigh); //将每个bar的最高价high存入highp容器(按正序排列)
  9.                 lowp.push_back(it->second.dLow); //将每个bar的最低价low存入lowp容器(按正序排列)
  10.         }
  11.         vector<double>highestp, lowestp;//声明两个容器变量,用来存储一定周期length内的最高价和最低价
  12.         //声明几个需要用到的中间变量

  13.         //在主程序中用vector计算出length周期内的最大值highestp和lowestp
  14.         for (size_t i = 0; i < highp.size(); i++) //建立for循环,处理数据
  15.         {
  16.                 if (i == 0)  //第一个次循环时,将highp[0],lowp[0] 值赋给highestp[0]和lowestp[0]
  17.                 {
  18.                         highestp.push_back(highp[i]);
  19.                         lowestp.push_back(lowp[i]);
  20.                 }
  21.                 if (i < length) //如果 0<i<length时
  22.                 {
  23.                         highestp.push_back(max2(highestp[i-1],highp[i]));//比较highestp[i-1]与highp[i],最大值赋给highestp[i]
  24.                         lowestp.push_back(min2(lowestp[i - 1], lowp[i]));//比较lowestp[i-1]与lowp[i],将最小值赋给lowestp[i]
  25.                 }
  26.                 else //如果pc数据大于或等于length个时,就可以按正常方法计算均值了
  27.                 {
  28.                         double d = -9999;//声明一个用来存储length周期内最大值的变量
  29.                         double e = 9999;

  30.                         for (size_t j = 0; j < length; j++) //再套一个for循环,换一个名称j
  31.                         {
  32.                                 d = max2(d , highp[i - j]); //现在外面大循环是第i次,然后用一个for循环从右向左依次比较d与high[i-j]的值,取大者存入d
  33.                                 e = min2(e, lowp[i - j]);// 从[i]个数从右至左比较lowp[i-j]与e的大小,取小值存入e,
  34.                         }
  35.                         highestp.push_back(d);// 将length周期内highp最大值赋给lowestp
  36.                         lowestp.push_back(e); //将length周期内lowp最小值赋给lowestp;
  37.                 }
  38.         }
  39.         //在主程序中设计日志输出length周期内bar的high值,highp的值及highestp值,bar的low值,lowp值及lowestp值
  40.         for (size_t k = 0; k < length; k++)
  41.         {
  42.                 InsertLog("第 " + to_string(k) + " 个bar最高价为: " + to_string(highp[highp.size() - 1 - k])); //打印输出length周期个highp的high值数据至日志面板
  43.         }
  44.         for (size_t k = 0; k < length; k++)
  45.         {
  46.                 InsertLog("第 " + to_string(k) + " 个bar最低价为: " + to_string(lowp[lowp.size() - 1 - k])); //打印输出length周期个highp的high值数据至日志面板
  47.         }
  48.         InsertLog("正迭代最高价公式计算: " + to_string(length) + "周期个high价最大值为: " + to_string(highestp[highestp.size() - 1])); //将highestp容器中最新的length周期个最高价输出到面板
  49.         InsertLog("正迭代最低价公式计算: " + to_string(length) + "周期个low价最小值为: " + to_string(lowestp[lowestp.size() - 1])); //将highestp容器中最新的length周期个最高价输出到面板
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

这里面需要用到两个函数调用min2  和 max2,是用来比较大小的。在函数公式模板中,参考:http://www.qhlt.cn/thread-160230-1-1.html
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

视频中程式代码核心模块:
  1. //在主程序中设计获取length周期内最高价格与最低价格
  2.         vector<double>highp,lowp;//先声明两个变量,分别用来存储每个bar的high价和low价

  3.         //调用bar数据,元素包括运行周期与期货合约
  4.         RsqBar(sPeriod,sInst);

  5.         //建立正迭代与遍历,在bar的mapk数据中调用到high和low,然后存入上面声明的两个容器变量中
  6.         map<string, TKVALUE>::iterator it;//正向迭代
  7.         for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); it++) //正向遍历,从左边第一个数据bar开始向右直到最新生成的bar为止
  8.         {
  9.                 highp.push_back(it->second.dHigh);//将每个bar的high价存入到highp容器中(顺序与bar的顺序一致)
  10.                 lowp.push_back(it->second.dLow);//将每个bar的low价存入到lowp容器中(顺序与bar的顺序一致)
  11.         }

  12.         //再声明两个变量,存储length周期内的最高价highestp和最低价lowestp
  13.         vector<double>highestp, lowestp;

  14.         //在主程序中用vector计算出length周期内的最大值highestp和最小值lowestp
  15.         for (size_t i = 0; i < highp.size(); i++)//建立for循环,对上面生成的highp和lowp两个数据进行处理
  16.         {
  17.                 if (i == 0)// 第一次循环时,将highp[0],lowp[0]值赋给higheestp[0]和lowestp[0]
  18.                 {
  19.                         highestp.push_back(highp[i]);
  20.                         lowestp.push_back(lowp[i]);
  21.                 }
  22.                 if (i < length)//如果 0 <i < length时,即数据不够length个时
  23.                 {
  24.                         highestp.push_back(max2(highestp[i - 1], highp[i]));//比较highestp前一个值与highp当前值,将大者存入当前highestp
  25.                         lowestp.push_back(min2(lowestp[i - 1], lowp[i]));
  26.                 }
  27.                 else //i >= length时 ,数据足够,可以按正常计算
  28.                 {
  29.                         //声明两个变量,极大值初始极小,极小值初始极大,看后面的使用,理解这里的意义
  30.                         double d = -9999;
  31.                         double e = 9999;
  32.                         for (size_t j = 0; j < length; j++) //新建立一个for循环,用来在i次大循环时再向左(后)循环,寻找length周期内的极值
  33.                         {
  34.                                 d = max2(d, highp[i - j]);//大循环第i次,用另一个循环从右向左依次比较d值和highp[i-j]值,取大者存入d,循环length次,找到length周期内的那个最大值
  35.                                 e = min2(e, lowp[i - j]);//原理与上面一致,这里理解为什么我要初始上面的值了,要是期货品种价格大于一万,就要赋更大的值给它。
  36.                         }
  37.                         highestp.push_back(d);//将length周期内highp最大值赋给highestp;
  38.                         lowestp.push_back(e);//将length周期内lowp最小值赋给lowestp;
  39.                 }
  40.         }
  41.         //在主程序中设计日志输出length周期内bar的high值,即highp,highestp值,low值即lowp值和lowestp值
  42.         for (size_t k = 0; k < length; k++)
  43.         {
  44.                 InsertLog("第 " + to_string(length) + " 个bar的最高价为: " + to_string(highp[highp.size() - 1 - k]));//打印出length个周期bar的high值
  45.         }
  46.         for (size_t m = 0; m < length; m++)
  47.         {
  48.                 InsertLog("第 " + to_string(length) + " 个bar的最低价为: " + to_string(lowp[lowp.size() - 1- m]));//打印出length个周期bar的low值
  49.         }
  50.         InsertLog("正迭代最高价公式计算 " + to_string(length) + " 周期个high价最大值为: " + to_string(highestp[highestp.size() - 1]));
  51.         InsertLog("正迭代最低价公式计算 " + to_string(length) + " 周期个low价最小值为:" + to_string(lowestp[lowestp.size() - 1]));
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

运行效果:
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

简评:
1、刚才代码写错了一个地方,导致多次退出,具体在这里:
  1.                 if (i == 0)// 第一次循环时,将highp[0],lowp[0]值赋给higheestp[0]和lowestp[0]
  2.                 {
  3.                         highestp.push_back(highp[i]);
  4.                         lowestp.push_back(lowp[i]);
  5.                 }
复制代码
我手敲代码时将lowp 敲成lowestp了,导致程序连续报错,崩溃。

2、最后我检查输出,也就一个没完善的地方,就是直接输出length个bar的值,我的用意是输出第 0 1 2 3 等bar的high和low值。这样改就行
  1.         for (size_t k = 0; k < length; k++)
  2.         {
  3.                 InsertLog("第 " + to_string(k) + " 个bar的最高价为: " + to_string(highp[highp.size() - 1 - k]));//打印出length个周期bar的high值
  4.         }
  5.         for (size_t m = 0; m < length; m++)
  6.         {
  7.                 InsertLog("第 " + to_string(m) + " 个bar的最低价为: " + to_string(lowp[lowp.size() - 1- m]));//打印出length个周期bar的low值
  8.         }
复制代码
注意 这里的输出的值是从右边最新为第一个,然后向左取值输出的。跟今天我们设计的正序是相反的。思考一下为什么要这样输出。
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

重新修正后的显示效果:
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

返回列表

站长推荐 关闭


鼎元C++程序化软件欢迎试用!

绿色免安装,策略免费下、点击就运行、多品种/策略/账户一键全搞定!小巧简洁、不占空间、不挑配置、38元租云服务器跑一年!


查看