龙听期货论坛's Archiver

龙听 发表于 2024-12-28 15:49

C++程序化/量化学习视频教程系列 第045节:鼎元C++量化指标封装之【平滑异同移动平均线(MACD)再优化计算方法及调用方法】【C++量化指标公式开发系列】

C++程序化/量化学习视频教程系列 第045节:鼎元C++量化指标封装之【平滑异同移动平均线(MACD)再优化计算方法及调用方法】【C++量化指标公式开发系列】

[mp4]http://mp4.qhlt.club/Cpp-Video/045.mp4[/mp4]

C++程序化学习视频教程系列安排如下:
第一楼:教学视频。一般控制在15分钟左右;
第二椄:视频课程中使用的程式源码。
第三楼:视频教学中需要用到的一些文档或资源。
第四楼:其它的一些边角料,特别是一些经典程序化策略的回测类的部分会放到下面楼层里面。

参与模式如下:
1、希望参与到编写策略与调试方面的工作通过上面的联系方式联系管理员咨询即可。记的加群,有问题第一时间交流,也可以在论坛指定版发贴交流,专用版地址:[url=http://www.qhlt.cn/forum-244-1.html]http://www.qhlt.cn/forum-244-1.html[/url];
2、有意申请试用及绑定期货账户跑实盘网友可以联系管理员,以及开通的方式。
3、基于C++策略交易软件具有:1、软件小(50兆不到);2、效率高(C++语言);3、功能精(专注于策略);4、对服务噐或电脑兼容性好(WIN系统)等优势,特别适合长期跑程序化的客户朋友,特别是有稳定交易模式客户更适合使用C++构建的交易系统。
4、最全的C++期货程序化(量化)教程、视频、源码、课件、资源汇总贴【C++期货程序化/量化研究必备资源贴!】:[url=http://www.qhlt.cn/thread-160231-1-1.html]http://www.qhlt.cn/thread-160231-1-1.html[/url];
5、鼎元C++量化程式码技术指标源码C++版模板【建议在test.h和test.cpp中同步至最新,方便统一调用和使用,一次编辑多次使用!】:[url=http://www.qhlt.cn/thread-160230-1-1.html]http://www.qhlt.cn/thread-160230-1-1.html[/url];
6、如何使用鼎元C++量化软件以及需要准备的些什么?[C++量化入门必读!]:[url=http://www.qhlt.cn/thread-160415-1-1.html]http://www.qhlt.cn/thread-160415-1-1.html[/url];

联系方式:
C++微信群:[img=180,180]http://p.algo2.net/2024/0922/23852f86ccf81.png[/img]  QQ群:[img=140,180]http://p.algo2.net/2024/0115/3c6af4df957c3.jpg[/img] 管理员微信:[img]http://www.qhlt.cn/link/wx.png[/img];管理员QQ:[img]http://www.qhlt.cn/link/q.png[/img]

龙听 发表于 2024-12-28 15:50

公式源码参考:[url]http://www.qhlt.cn/thread-160291-1-1.html[/url];

这里我主要放一下引用的办法:[code]
RsqBar(sPeriod, sInst);

        map<string, TKVALUE >::iterator it;
        for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); ++it)
        {
                pc.push_back(it->second.dClose);
        }
       
        // MACD 参数
        int shortPeriod = 12; // 快速 EMA 周期
        int longPeriod = 26;  // 慢速 EMA 周期
        int signalPeriod = 9; // 信号线 EMA 周期
        // 计算并输出diff
        diff = MACDcalculate(pc, shortPeriod, longPeriod);
        dea  = EMAvectorCaL(diff, signalPeriod);
        //计算 MACD 柱状图
        vector<double> macd(pc.size());
        for (size_t i = 0; i < pc.size(); i++)
        {
                macd[i] = 2 * (diff[i] - dea[i]); // 通常将 MACD 值乘以 2
        }
        InsertLog("最新diff " + to_string(diff[diff.size() - 1]) + "最新dea " + to_string(dea[dea.size() - 1]) + "最新MACD " + to_string(macd[macd.size() - 1]));
[/code]

龙听 发表于 2024-12-28 15:54

跟之前的计算主要就是EMA的计算方式。

优化之后的:[code]
vector<double>test::EMAvectorCaL(vector<double>pc, int num)//EMA容器计算形式
{
        vector<double> ema(pc.size());
        double multiplier = 2.0/(num+1);
        ema[0] = pc[0]; // 初始化第一值为价格的第一个值
        for (int i = 1; i < pc.size(); i++) {
                ema[i] = (pc[i] - ema[i-1]) * multiplier + ema[i-1];
        }
        return ema;
}
[/code]优化之前的:[code]
vector<double>test::ema(vector<double>pc, int num)
{
        vector<double>emav;
        double emavector = 0;
        int i = 0;

        for (int it = 0; it < pc.size(); it++)
        {
                if (i < num)
                {
                        emavector = (emavector + pc[it])/(i+1);
                        i++;
                        emav.push_back(emavector);
                }
                else
                {
//                        emavector = (2*pc[it]+(num-1)*emavector)/(num+1);//ema均线计算公式
                        emavector = emavector + 2 * (pc[it] - emavector) / (num + 1);
                        emav.push_back(emavector);
                }
        }
        return emav;
}
[/code]

页: [1]