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

C++程序化/量化学习视频教程系列 第024节:鼎元C++量化之调用map调用bar数据(K线开、高、低及收盘价格调用)知识及C++量化开发中的注意事项【C++量化指标公式开发系列】

C++程序化/量化学习视频教程系列 第024节:鼎元C++量化之调用map调用bar数据(K线开、高、低及收盘价格调用)知识及C++量化开发中的注意事项【C++量化指标公式开发系列】

C++程序化/量化学习视频教程系列 第024节:鼎元C++量化之使用map调用bar数据(K线开、高、低及收盘价格调用)知识及C++量化开发中的注意事项【C++量化指标公式开发系列】



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

演示:用数组、容器及map进行数据的操作:
  1. #include<iostream>
  2. #include<map>
  3. #include <cstring>
  4. #include <vector>
  5. #include <math.h>
  6. #include <iomanip>
  7. using namespace std;
  8. using std::setw;

  9. int main()
  10. {
  11.         double nice[5]={0,1,2,3,4};

  12.         for (int i = 0; i < 5; i++)
  13.         {
  14.                 cout << nice[i] << endl;

  15.         }

  16.         for (int j = 0; j < 5; j++)
  17.         {
  18.                 nice[j] = 2 * j;
  19.                 cout << nice[j] << endl;
  20.         }

  21.         vector<double>mynice = { 0,1,2,3,4,5 };
  22.         for (int i = 0; i < 5; i++)
  23.         {
  24.                 cout << "用vector输出:" << mynice[i] <<endl;
  25.         }

  26.         for (int i = 0; i < 5; i++)
  27.         {
  28.                 mynice.push_back(i*2);
  29.                 cout << mynice[i] << endl;
  30.         }
  31.         for (int i = 0; i < mynice.size(); i++)
  32.         {
  33.                 cout << mynice[i] << endl;
  34.         }

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

TOP

声明 map 容器:
  1. std::map<key_type, value_type> myMap;
复制代码
key_type 是键的类型。
    value_type 是值的类型。

插入元素:
  1. myMap[key] = value;
复制代码
访问元素:
  1. value = myMap[key];
复制代码
遍历 map:
  1. for (std::map<key_type, value_type>::iterator it = myMap.begin(); it != myMap.end(); ++it) {
  2.     std::cout << it->first << " => " << it->second << std::endl;
  3. }
复制代码
  1. std::map<key_type, value_type>::iterator
  2. for (it = myMap.begin(); it != myMap.end(); ++it) {
  3.     std::cout << it->first << " => " << it->second << std::endl;
  4. }
复制代码
  1. #include <iostream>#include <map>
  2. #include <string>

  3. int main() {
  4.     // 创建一个 map 容器,存储员工的姓名和年龄
  5.     std::map<std::string, int> employees;

  6.     // 插入员工信息
  7.     employees["Alice"] = 30;
  8.     employees["Bob"] = 25;
  9.     employees["Charlie"] = 35;

  10.     // 遍历 map 并打印员工信息
  11.     std::map<std::string, int>::iterator
  12.     for ( it = employees.begin(); it != employees.end(); ++it) {
  13.         std::cout << it->first << " is " << it->second << " years old." << std::endl;
  14.     }

  15.     return 0;
  16. }
复制代码
在鼎元C++中请求调用数据函数:
RsqBar:
  1. RsqBar(sPeriod, sInst);//查询历史K线数据
  2.         ma = average(sPeriod, sInst, length); //调用简单移动平均线数值
复制代码
  1. void test::RsqBar(string period, string inst)
  2. {
  3.         TRSQBAR* t = new TRSQBAR();
  4.         t->Name = sName;
  5.         t->Type = "RsqBar";
  6.         t->Period = period;
  7.         t->Inst = inst;
  8.         if (hwnd)SendMessage(hwnd, WM_RSQBAR, (WPARAM)t, (LPARAM)36);
  9. }
复制代码


函数注意事项:
  1. double test::average(string period, string inst, int num)
复制代码
  1. struct TKVALUE
  2. {
  3.         string sDate;
  4.         string sTime;
  5.         string InstrumentID;
  6.         string sPeriod;
  7.         double dOpen = 0;
  8.         double dHigh = 0;
  9.         double dLow = 0;
  10.         double dClose = 0;
  11.         int nVolume = 0;
  12.         int nOpenInterest = 0;
  13.         string sDayNight;
  14. };
复制代码
逆向遍历:
  1. map<string, TKVALUE>::reverse_iterator it;
  2. for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
复制代码
正向遍历:
  1. map<string, TKVALUE >::iterator it;
  2. for (it = mapK[period][inst].begin(); it != mapK[period][inst].end(); ++it)
复制代码
形象展示:



说明:

1、因为周期、品种合约代码都是固定的。所以在map里面KVALUE中的要素还包括:

2、日期和时间:平时多用不着。但是当需要从左向右的正序调用数据时或从 右向左逆向调用数据时时间是一个排序的工具。

3、k线的主要要素(开、高、低、收)。

4、成交量;

5、持仓量;

总结:以蜡烛图的四要素与成交持仓两要素组成了交易策略的大部分设计元素。

如何调用:
  1. map<string, TKVALUE >::iterator it; //建立正迭代器,标号从0开始,一般从左向右开始
  2. for (it = mapK[period][inst].begin(); it != mapK[period][inst].end(); ++it) //从第一开始的bar数据开始遍历
  3.         {       
  4.                  it->second.
  5.         }
复制代码
在TKVALUE中能调用的素材:
  1.         string sDate;
  2.         string sTime;
  3.         string InstrumentID;
  4.         string sPeriod;
  5.         double dOpen = 0;
  6.         double dHigh = 0;
  7.         double dLow = 0;
  8.         double dClose = 0;
  9.         int nVolume = 0;
  10.         int nOpenInterest = 0;
  11.         string sDayNight;
复制代码
所以在用k线做策略时我们多数能调用的也就是dhigh,dlow,dopen,dclose,nvolume,nopeninterest 这六个要素。制作均线,常用的就是dclose,区间上沿多用dhigh,区间下沿多用dlow。
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

我要是想调用最新bar的开盘价。

我要做三件事:

1、建立遍历用的迭代器,因为我是要用到最新的,所以我要建立一个逆向迭代器。
2、找到最新的bar,因为我是用的逆向的,所以第一个数据就是我要调用的,只需要循环一次就行了。我要用到一个开关,就是控制只允许它循环一轮就结束。
3、把dopen调来用。

完整流程是这样的:

1、建立正向迭代器:
  1. map<string, TKVALUE>::reverse_iterator it;
复制代码
2、用for循环来进行遍历:(因为我仅允许它循环一次,所以我加一个开关)
  1.    int key = 0; //建立一个开关,下面看我是怎么使用这个开关的
  2.    int closep; //声明一个变量用来存储最新bar的开盘价
  3. for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); it++)


复制代码
3、调用我需要的最新的开盘价

(1)声明一个变量用来存这个收盘价: int closep;
  (2)  将最新的bar的开盘价赋值给(1)中的变量:closep = it ->second.dopen;

完整的程式码是这样的:
  1.         RsqBar(period, sInst); //申请调用数据指令
  2.         double key = 0; //建立一个开关
  3.         map<string, TKVALUE>::reverse_iterator it; //建立逆向迭代器
  4.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)  //进行遍历
  5.         {
  6.                 closep = it->second.dopen; //将最新的bar的开盘价赋值给closep;
  7.                 key++;  //开关自动加1,即从0变为1
  8.                 if (key > 0) break; //进行判断如果key大于0就跳出结束循环,也可以使用key == 1 然后结束循环等等
  9.         }
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

另一种办法调用最新bar的开盘价。

1、思路:

1、大体思路仍然是建立迭代器、for循环。
2、但是建立for循环后我用一个vector来装TKVALUE中所有bar的开盘价。
3、然后我用vector[标号]来直接引用。
4、甚至我要是想进行平均,计算方差类的,也可以继续用这个vector。

完整流程是这样的:

(1)、在头文件中声明变量:
  1.         vector<double>openp;
复制代码
(2)、在源文件:
  1. RsqBar(sPeriod, sInst); //调用数据申请指令

  2. map<string, TKVALUE >::iterator it;  //建立一个正向的迭代器
  3.         for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); ++it) //建立for遍历
  4.         {
  5.                 openp.push_back(it->second.dopen);  //从左至右将每一个bar的开盘价加到openp容器vector中
  6.         }
  7.         closep = openp[openp.size()-1];  //通过下标号将用最新的dopen价格给closep;
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

使用场景有两个:一个是在onrun中调用最新bar的开价,然后在tick中直接使用即可。二是将上面的的程式码再加到onbariopen中。每新生成一个bar就会运行一次,将最新的bar开盘价调用出来供使用。
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

再发个更详细的map(TKVALUE)形象图:
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

返回列表