鼎元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] 参考:
MA的计算公式为:EMA(今日)=(价格(今日) - EMA(昨日))× 加权因子 + EMA(昨日)。其中,加权因子通常取2 / (N+1),N代表EMA周期。 更简洁的表达式:[img]http://p.algo2.net/2024/1211/32c6870caec4b.png[/img] 另一个形式,只是形式不同,其它的没变:[img]http://p.algo2.net/2024/1213/d50643ae7d23d.png[/img]
页:
[1]