标题:
C++程序化/量化学习视频教程系列 第055节:鼎元C++量化之如何使用容器(vector)对bar数据进行高级处理【vector容器使用范例:正迭代计算length周期最高价与最低价】
[打印本页]
作者:
龙听
时间:
2025-4-12 06:06
标题:
C++程序化/量化学习视频教程系列 第055节:鼎元C++量化之如何使用容器(vector)对bar数据进行高级处理【vector容器使用范例:正迭代计算length周期最高价与最低价】
C++程序化/量化学习视频教程系列 第055节:鼎元C++量化之如何使用容器(vector)对bar数据进行高级处理【vector容器使用范例:正迭代计算length周期最高价与最低价】
[mp4]http://mp4.qhlt.club/Cpp-Video/055.mp4[/mp4]
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:
作者:
龙听
时间:
2025-4-12 06:07
程式码部分:
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周期个最高价输出到面板
复制代码
作者:
龙听
时间:
2025-4-12 06:09
这里面需要用到两个函数调用min2 和 max2,是用来比较大小的。在函数公式模板中,参考:
http://www.qhlt.cn/thread-160230-1-1.html
;
作者:
龙听
时间:
2025-4-12 07:15
视频中程式代码核心模块:
//在主程序中设计获取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]));
复制代码
作者:
龙听
时间:
2025-4-12 07:17
运行效果:
作者:
龙听
时间:
2025-4-12 07:22
简评:
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值
}
复制代码
注意 这里的输出的值是从右边最新为第一个,然后向左取值输出的。跟今天我们设计的正序是相反的。思考一下为什么要这样输出。
作者:
龙听
时间:
2025-4-12 09:46
重新修正后的显示效果:
欢迎光临 龙听期货论坛 (http://www.qhlt.cn/)
Powered by Discuz! 7.2