鼎元C++量化程式码指标与函数模块系列之【指数移动平均(Exponential Moving Average,ema)计算方法及调用方法】
第一部分、头文件声明变量:[code]double xaverage(string period, string inst, int num);//计算NUM周期指标移动平均(Exponential Moving Average,ema)值
[/code]第二部分、源文件公式计算函数[code]
//计算NUM周期指数移动平均(Exponential Moving Average,ema)值
double test::xaverage(string period, string inst, int num)
{
double n = 0;
int ema = 0;
if (mapK[period][inst].size() < num) return 0; //如果数据不够用就返回0;
map<string, TKVALUE >::iterator it;
for (it = mapK[period][inst].begin(); it != mapK[period][inst].end(); ++it)
{
if (n < num)
{
ema = (ema + it->second.dClose) / (n + 1);
n++;
}
else
{
ema = (2 * it->second.dClose + (n - 1) * ema) / (n + 1); //或 ema = it->second.dClose * (1/n+1) + ema * (n-1)/(n+1) 经典格式: ema = a*close + (1-a)*close[1]
}
}
return ema;
}
[/code]第三部分、在初始参数区域设计length的参数[code]
//Name 参数名, Value 默认值, Explain 参数说明, tend 表示一个参数结束
t.Name = "指标周期"; t.Value = "5"; t.Explain = "均线的周期参数"; tend(t);
[/code]第四部分、在onrun中调用到参数并赋值给一个变量length[code]
//交易系统参数变量传递开始*******************************************************************************************************
num = 0;
jg = 5;
length = atoi(parm["指标周期"].Value.c_str());
//交易系统参数变量传递结束*******************************************************************************************************
[/code]第五部分、申请bar数据调用指令(只需要调用一次申请就行)[code]
RsqBar(sPeriod, sInst);
[/code]第六部分、调用公式获取变量值[code]
xaverage(sPeriod, sInst, length);
[/code]第七部分、如果想让它在每一个bar开始时都运行一次,就把它加到”OnBarOpen(TKVALUE t)“中。
页:
[1]