龙听期货论坛's Archiver

龙听 发表于 2024-11-2 20:34

鼎元C++期货量化/程序化教程【ATR的计算方法及调用方法】

第一部分,在头文件test.h中声明atr变量:[code]

private:

double avgtruerange(string period, string inst, int num);
double atr;
int length;
[/code]说明:

1、因为atr可能是有小数部分,所以变量用double 数值。

2、atr是变量名,里面需要有三个参数,一个是K线BAR运行的周期,二是运行的合约,三是atr调用周期参数,即 atr的length.

第二部分,在源文件test.cpp中function计算方法部分:[code]

double test::avgtruerange(string period, string inst, int num)
{
        double dPreClose = 0;
        int n = 0;
        double sumatr = 0;
        vector<double>vAtr;
        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)
                {
                        double d = it->second.dHigh - it->second.dLow;
                        double dHC = abs(it->second.dHigh - dPreClose);
                        double dLC = abs(it->second.dLow - dPreClose);
                        if (d < dHC)d = dHC;
                        if (d < dLC)d = dLC;
                        vAtr.push_back(d);
                }
                dPreClose = it->second.dClose;
        }
        for (int i = 1; i <= num; i++)
        {
                sumatr += vAtr[vAtr.size() - i];
                InsertLog(to_string(vAtr[vAtr.size() - i]));
        }

        return  sumatr / num;
}[/code]说明:

龙听 发表于 2024-11-2 20:37

第三部分:在源文件中调用指标

1、在加载时、tick数据模式下或bar模式下都可以调用,方法如下:[code]RsqBar(sPeriod, sInst);
atr = avgtruerange(sPeriod, sInst, length);[/code]

龙听 发表于 2024-11-10 20:24

计算ATR方法:[url=http://www.qhlt.cn/thread-126161-1-1.html]http://www.qhlt.cn/thread-126161-1-1.html[/url];

计算ATR

由于ATR是基于移动平均线的,你需要为平均线设置周期。大多数交易者使用10到20之间的数值(10个交易日代表2周,而20个交易日代表一个月,大致如此)。14的默认值是一个很好的中间值,对于大多数情况来说应该是不错的。无论你选择什么,只要确保你保持一致。

为了计算ATR,你首先需要计算过去n个时期中每个时期的真实范围(TR),然后计算其平均值。

真实范围是以下3个计算中的最大值(记住,你需要取绝对值,因为价格运动的方向是不相关的)。

从当前高点减去当前低点
从当前高点减去之前的收盘价
从当前低点减去之前的收盘价

页: [1]