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