C++程序化/量化学习视频教程系列 第045节:鼎元C++量化指标封装之【平滑异同移动平均线(MACD)再优化计算方法及调用方法】【C++量化指标公式开发系列】
- UID
- 2
- 积分
- 2903567
- 威望
- 1401815 布
- 龙e币
- 1501752 刀
- 在线时间
- 13440 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-1-30
|
C++程序化/量化学习视频教程系列 第045节:鼎元C++量化指标封装之【平滑异同移动平均线(MACD)再优化计算方法及调用方法】【C++量化指标公式开发系列】
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|
|
|
|
|
|
- UID
- 2
- 积分
- 2903567
- 威望
- 1401815 布
- 龙e币
- 1501752 刀
- 在线时间
- 13440 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-1-30
|
公式源码参考:http://www.qhlt.cn/thread-160291-1-1.html;
这里我主要放一下引用的办法:- 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]));
复制代码 |
|
|
|
|
|
|
- UID
- 2
- 积分
- 2903567
- 威望
- 1401815 布
- 龙e币
- 1501752 刀
- 在线时间
- 13440 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-1-30
|
跟之前的计算主要就是EMA的计算方式。
优化之后的:- 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;
- }
复制代码 优化之前的:- 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;
- }
复制代码 |
|
|
|
|
|
|