龙听期货论坛's Archiver

C
+
+


 微信: QQ:

龙听 发表于 2024-11-21 11:28

鼎元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值了。

龙听 发表于 2024-11-21 13:50

有待我继续优化与整理,暂时不要使用。{:handshake:}

龙听 发表于 2024-11-21 15:27

[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]