鼎元C++期货量化/程序化教程【averagetruerange、avgtruerange、truehigh、truelow的计算方法及调用方法】
- UID
- 2
- 积分
- 2874604
- 威望
- 1387331 布
- 龙e币
- 1487273 刀
- 在线时间
- 13155 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-11-24
|
鼎元C++期货量化/程序化教程【averagetruerange、avgtruerange、truehigh、truelow的计算方法及调用方法】
这里主要是集中整理与优化跟atr有关的一些公用与用法。
第一部分、说一下原理:
1、根据原始理论,计算truehigh与truelow;
计算方法是上一bar的收盘价与当根bar的最高和最低进行比较,获得truehigh,truelow;
2、计算truerange:上面的truehigh - truelow就是了。
3、然后平均一下获得avgtruerange。也就是atr了。
第二部分、公式计算方法:
1、在头文件声明变量:- double truehigh(string period, string inst, int num);
- double truelow(string period, string inst, int num);
- double truerange(string period, string inst, int num);
- double avgtruerange(string period, string inst, int num);
复制代码 2、在源文件设计公式计算方法:- //***********************AVGtruerange相关公式计算
- double test::truehigh(string period, string inst, int num)
- {
- double dPreClose = 0; //声明上一bar收盘价变量
- double truehigh = 0; //获取truehigh值
- if(mapK[period][inst].size() < num) return 0; //如果数据不够就不计算
- map<string, TKVALUE >::iterator it;//设计迭代器
- for (it = mapK[period][inst].begin(); it != mapK[period][inst].end(); ++it)
- {
- if(dPreClose == 0 ) dPreClose = it->second.dClose; //第一轮遍历获得时间最早的bar的收盘价
- if (dPreClose != 0) // 第二轮及以后获取bar的要素与前一bar的数据进行比较
- {
- double dH = it->second.dHigh; //获取下一根bar的最高价
-
- if (dPreClose > dH)
- {
- truehigh = dH;
- }
- else
- {
- truehigh = dPreClose;
- }
- dPreClose = it->second.dClose;//获取最新的收盘价以供下一bar进行比较计算用。
- }
- }
- return truehigh;
- }
- double test:: truelow(string period, string inst, int num)
- {
- double dPreClose = 0; //声明上一bar收盘价变量
- double truelow = 0; //获取truelow值
- if (mapK[period][inst].size() < num) return 0; //如果数据不够就不计算
- map<string, TKVALUE >::iterator it;//设计迭代器
- for (it = mapK[period][inst].begin(); it != mapK[period][inst].end(); ++it)
- {
- if (dPreClose == 0) dPreClose = it->second.dClose; //第一轮遍历获得时间最早的bar的收盘价
- if (dPreClose != 0) // 第二轮及以后获取bar的要素与前一bar的数据进行比较
- {
- double dL = it->second.dLow; //获取下一根bar的最高价
- if (dPreClose > dL)
- {
- truelow = dL;
- }
- else
- {
- truelow = dPreClose;
- }
- dPreClose = it->second.dClose;//获取最新的收盘价以供下一bar进行比较计算用。
- }
- }
- return truelow;
- }
- double test::truerange(string period, string inst, int num)
- {
- double d = truehigh(sPeriod, sInst, num) - truelow(sPeriod, sInst, num);
-
- return d;
- }
- double test::avgtruerange(string period, string inst, int num)
- {
- double d = truerange(sPeriod, sInst, num);
- return d;
- }
复制代码 3、在策略中调用方法:- avgtruerange(sPeriod, sInst, num);
复制代码 就可以取的NUM周期的平均atr值了。 |
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|
|
|
|
|
|
- UID
- 2
- 积分
- 2874604
- 威望
- 1387331 布
- 龙e币
- 1487273 刀
- 在线时间
- 13155 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-11-24
|
有待我继续优化与整理,暂时不要使用。 |
|
|
|
|
|
|
- UID
- 2
- 积分
- 2874604
- 威望
- 1387331 布
- 龙e币
- 1487273 刀
- 在线时间
- 13155 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-11-24
|
- }
- //***********************AVGtruerange相关公式计算
- double test::truerange(string period, string inst)
- {
- double dPreClose = 0; //声明上一bar收盘价变量
- double range = 0;
- if (mapK[period][inst].size() < num) return 0; //如果数据不够就不计算
- map<string, TKVALUE >::iterator it;//设计迭代器
- for (it = mapK[period][inst].begin(); it != mapK[period][inst].end(); ++it)
- {
- if (dPreClose != 0) // 第二轮及以后获取bar的要素与前一bar的数据进行比较
- {
- double d = it->second.dHigh - it->second.dLow;
- double dHC = abs(it->second.dHigh - dPreClose);
- double dLC = abs(it->second.dLow - dPreClose);
- double range = max3(d, dHC, dLC);
- }
- dPreClose = it->second.dClose; //第一轮遍历获得第一根bar的收盘价
- }
- return range;
- }
- double test::avgtruerange(string period, string inst, int num)
- {
- double d = 0;
- int n = 0;
- map<string, TKVALUE >::iterator it;//设计迭代器
- for (it = mapK[period][inst].begin(); it != mapK[period][inst].end(); ++it)
- {
- d += truerange(sPeriod, sInst);
- n++;
- if (n >= num)break;
- }
- return d / n;
- }
复制代码 一个需要继续完善的atr计算公式。 |
|
|
|
|
|
|