鼎元C++期货量化/程序化教程【指数移动平均(Exponential Moving Average,ema/xaverage)的计算方法及调用方法】
- UID
- 2
- 积分
- 2892587
- 威望
- 1396325 布
- 龙e币
- 1496262 刀
- 在线时间
- 13313 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
鼎元C++期货量化/程序化教程【指数移动平均(Exponential Moving Average,ema/xaverage)的计算方法及调用方法】
第一部分,在头文件test.h中声明ema变量:- private:
- vector<double> ema(vector<double> pc, int num);
复制代码 第二部分,在源文件test.cpp中function计算方法部分:- 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;
- }
复制代码 |
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|
|
|
|
|
|
- UID
- 2
- 积分
- 2892587
- 威望
- 1396325 布
- 龙e币
- 1496262 刀
- 在线时间
- 13313 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
第三部分,在源文件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);
} |
|
|
|
|
|
|
- UID
- 2
- 积分
- 2892587
- 威望
- 1396325 布
- 龙e币
- 1496262 刀
- 在线时间
- 13313 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
|
|
|
|
|
|
- UID
- 2
- 积分
- 2892587
- 威望
- 1396325 布
- 龙e币
- 1496262 刀
- 在线时间
- 13313 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
上面是输出数组的形式的,。
下面增加一般正常使用时用的ema加权均线编写方法:
在头文件声明变量:- double ema(string period, string inst, int num);
复制代码 在源文件增加公式模块:- //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计算公式结束
复制代码 调用方法:- indvalue = ema(sPeriod, sInst, length); //指标EMA数值
复制代码 |
|
|
|
|
|
|
- UID
- 2
- 积分
- 2892587
- 威望
- 1396325 布
- 龙e币
- 1496262 刀
- 在线时间
- 13313 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
参考:
MA的计算公式为:EMA(今日)=(价格(今日) - EMA(昨日))× 加权因子 + EMA(昨日)。其中,加权因子通常取2 / (N+1),N代表EMA周期。 |
|
|
|
|
|
|
- UID
- 2
- 积分
- 2892587
- 威望
- 1396325 布
- 龙e币
- 1496262 刀
- 在线时间
- 13313 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
更简洁的表达式: |
|
|
|
|
|
|
- UID
- 2
- 积分
- 2892587
- 威望
- 1396325 布
- 龙e币
- 1496262 刀
- 在线时间
- 13313 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
另一个形式,只是形式不同,其它的没变: |
|
|
|
|
|
|