龙听期货论坛's Archiver

龙听 发表于 2024-11-3 20:22

鼎元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]

龙听 发表于 2024-11-3 21:23

第三部分,在源文件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);
}

龙听 发表于 2024-11-11 15:26

EMA均线multicharts公式源码:[url]http://www.qhlt.cn/thread-133359-1-1.html[/url];

龙听 发表于 2024-11-13 10:57

上面是输出数组的形式的,。

下面增加一般正常使用时用的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]

龙听 发表于 2024-12-11 12:41

参考:

MA的计算公式为:EMA(今日)=(价格(今日) - EMA(昨日))× 加权因子 + EMA(昨日)。其中,加权因子通常取2 / (N+1),N代表EMA周期。

龙听 发表于 2024-12-11 12:43

更简洁的表达式:[img]http://p.algo2.net/2024/1211/32c6870caec4b.png[/img]

龙听 发表于 2024-12-13 19:54

另一个形式,只是形式不同,其它的没变:[img]http://p.algo2.net/2024/1213/d50643ae7d23d.png[/img]

页: [1]