鼎元C++期货量化/程序化教程【averagetruerange、avgtruerange、truehigh、truelow的计算方法及调用方法】
这里主要是集中整理与优化跟atr有关的一些公用与用法。第一部分、说一下原理:
1、根据原始理论,计算truehigh与truelow;
计算方法是上一bar的收盘价与当根bar的最高和最低进行比较,获得truehigh,truelow;
2、计算truerange:上面的truehigh - truelow就是了。
3、然后平均一下获得avgtruerange。也就是atr了。
第二部分、公式计算方法:
1、在头文件声明变量:[code] 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);[/code]2、在源文件设计公式计算方法:[code]//***********************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;
}[/code]3、在策略中调用方法:[code]avgtruerange(sPeriod, sInst, num);[/code]就可以取的NUM周期的平均atr值了。 有待我继续优化与整理,暂时不要使用。{:handshake:} [code]}
//***********************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;
}[/code]一个需要继续完善的atr计算公式。
页:
[1]