鼎元C++期货量化/程序化教程【指数移动平均(Exponential Moving Average,ema/xaverage)的计算方法及调用方法】
第一部分,在头文件test.h中声明ema变量:[code]private:
vector<double> ema(vector<double> pc, int num);[/code]第二部分,在源文件test.cpp中function计算方法部分:[code]vector<double> test::ema(vector<double> pc, int num)
{
vector<double> re;
double nu = 0;
int nn = 0;
for (int it = 0; it < pc.size(); ++it)
{
if (nn < num)
{
nu = (nu + pc[it]) / (nn + 1);
nn++;
re.push_back(nu);
}
else
{
nu = (2 * pc[it] + (num - 1) * nu) / (num + 1);
re.push_back(nu);
}
}
return re;
}[/code] 第三部分,在源文件test.cpp中调用与使用
1、在点击“”运行”时计算的模块:
void test::OnRun()
{
RsqBar(sPeriod, sInst);
ema = avg(sPeriod, sInst, jxzq);//得到ma的数值
}
2、在tick有数据传入时调用与计算数值模块
void test::OnMarketData(CThostFtdcDepthMarketDataField* t)
{
直接调用即可。
}
3、在bar数据中调用与使用模块
void test::OnBarOpen(TKVALUE t)
{
mapK[sPeriod][sInst][t.sDate + t.sDayNight + t.sTime] = t;
ma = avg(sPeriod, sInst, jxzq);
} EMA均线multicharts公式源码:[url]http://www.qhlt.cn/thread-133359-1-1.html[/url]; 上面是输出数组的形式的,。
下面增加一般正常使用时用的ema加权均线编写方法:
在头文件声明变量:[code] double ema(string period, string inst, int num);[/code]在源文件增加公式模块:[code]//ema计算公式开始
double test::ema(string period, string inst, int num)
{
double nu = 0;
int nn = 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 (nn < num)
{
nu = (nu + it->second.dClose) / (nn + 1);
nn++;
}
else
{
nu = (2 * it->second.dClose + (num - 1) * nu) / (num + 1);
}
}
return nu;
}
//ema计算公式结束
[/code]调用方法:[code]indvalue = ema(sPeriod, sInst, length); //指标EMA数值[/code]
页:
[1]