龙听期货论坛's Archiver

C
+
+


 微信: QQ:

龙听 发表于 2025-4-2 11:24

鼎元C++量化程式码指标与函数模块系列之【平滑异同移动平均线(Moving Average Convergence Divergence,MACD)计算方法及调用方法】

一、需要用到ema数组形式计算调用:

1、头文件声明数组变量:[code]       
     vector<double>emaarray(vector<double> pc, int num); //ema计算公式(返回数组);
[/code]2、 主文件公式函数区xaverage/ema程式码[code]
//ema计算公式开始(返回数组)
vector<double> test::emaarray(vector<double> pc, int num)
{
        vector<double> r;
        double d = 0;

        for (int i = 0; i < pc.size(); i++)
        {
                if (i == 0)
                {
                        d = pc[0];
                        r.push_back(d);
                }
                else
                {
                        d = (2*pc[i]+(num-1)*d)/(num+1);
                        r.push_back(d);
                }
        }
        return r;
}
[/code]二、源文件主文件设计MCD指标:

1、头文件声明变量:[code]
        vector<double>pc;//进行数组设计时统一的数组变量,方便以后使用中统一口径;
[/code]2、主程序区策略核心程式码:[code]
//调用bar数据,要包括品种合约,运行周期
        RsqBar(sPeriod, sInst);
       
        //装收盘价装后容器变量PC中
        map<string, TKVALUE>::iterator it;//迭代
        for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); it++) //遍历所有K线
        {
                pc.push_back(it->second.dClose);//将收盘价存储到pc容器中,按正序排序
        }
        vector<double> ema12 = emaarray(pc, 12); //获取12周期 ema均线数组形式值
        vector<double> ema26 = emaarray(pc, 26); //获取26周期 ema均线数组形式值
        vector<double> diff;
        for (size_t i = 0; i < ema12.size(); i++)
        {
                diff.push_back(ema12[i] - ema26[i]);  //将ema12 - ema26 值赋给diff,以数组形式
        }
        vector<double> dea;
        dea = emaarray(diff, 9); //diff再做9周期ema均线形成dea均线
        vector <double>macd;
        for (size_t i = 0; i < dea.size(); i++)
        {
                macd.push_back((diff[i] - dea[i])*2);  //(diff- dea)*2值即是macd值,即经典图表中bar柱状线值
        }

        InsertLog("diff : " + to_string(diff[diff.size()-1])); //将新变量最新值输出到日志
        InsertLog("dea : " + to_string(dea[dea.size()-1])); //将新变量最新值输出到日志
        InsertLog("macd bar: " + to_string(macd[macd.size() - 1]));
[/code]

龙听 发表于 2025-4-2 11:26

我通过log面板输出值与文华和东财对比,发现总是有一些的差异。这可能有下面的因素:1,是鼎元的数据与东财和文华细微差异,2,我设计的ema均线的函数跟他们有出入。现在我还在优化最后的这些细节。并随时在这里面更新。

页: [1]