微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ta-lib c++,计算出的macd与web不匹配

如何解决ta-lib c++,计算出的macd与web不匹配

我用的是ta-lib c++库来计算MACD,结果和官网显示的完全不一样,
真正的 MACD 是 [444.39,505.05,248.02,-232.33,100.39,-13.18],
但我的结果是 [282.10,-74.12,-211.27,-460.82,-850.86]
我已经把所有的 MAType 都设置为 TA_MAType_EMA,但是没有意义

#include <iostream>
#include <cassert>
#include <ta-lib/ta_libc.h>

using namespace std;


int main()
{
    // init ta-lib context
    TA_RetCode retcode;
    retcode = TA_Initialize();
    assert(retcode == TA_SUCCESS);

    // comput moving average price
    TA_Real    close_price_array[100] = { 37924.41,40849.89,37952.37,36564.58,36844.22,34719.71,33156.65,32858.22,34212.01,37118.35,31924.17,30327.18,31757.38,34459.95,31952.8,31876.57,32457.32,31392.34,34183.43,37328.12,36408.31,35732.04,37460.76,35627.27,39551.87,34677.01,33834.78,31580.01,39674.77,40513.11,40829.87,38950.0,34555.33,32091.45,31737.83,33506.67,31695.17,29190.91,28779.14,28153.95,26617.04,26911.93,27360.51,25625.24,24019.43,23230.15,23450.3,23341.65,23099.56,23873.04,23551.1,22553.6,23329.31,20659.69,19406.28,19198.7,19215.36,18401.98,18106.72,18134.91,18347.36,18806.82,19213.0,19126.33,19107.67,18945.51,19533.84,18891.06,19265.5,19306.92,18116.34,17505.0,16502.76,16905.43,19129.39,19358.42,18269.55,18294.73,18784.06,18655.81,18046.78,17871.06,17318.57,16450.98,16026.15,15950.15,16098.79,16122.33,15666.22,15168.03,15004.24,15354.6,15342.63,15411.23,15077.18,13911.95,13708.92,13492.15,13797.96,13854.39 };
    TA_Real    *p = close_price_array;

    cout.precision(8);
    
    TA_Integer out_begin = 0;
    TA_Integer out_nb_element = 0;

    TA_Real    outMACD[100] = { 0 };
    TA_Real    outMACDSignal[100] = { 0 };
    TA_Real    outMACDHist[100] = { 0 };
    

    retcode = TA_MACDEXT(0,99,&close_price_array[0],12,TA_MAType_EMA,26,9,&out_begin,&out_nb_element,outMACD,outMACDSignal,outMACDHist);

    assert(retcode == TA_SUCCESS);

    cout << "out_begin_index: " << out_begin << endl;
    cout << "out_nb_element: " << out_nb_element << endl;
    cout << "outMACD array: " << endl;
    for (auto &i : outMACD)
        cout << i << " ";
    cout << endl;

    cout << "outMACDSignal array: " << endl;
    for (auto &i : outMACDSignal)
        cout << i << " ";
    cout << endl;

    cout << "outMACDSignal array: " << endl;
    for (auto &i : outMACDHist)
        cout << i << " ";
    cout << endl;

    retcode = TA_Shutdown();
    assert(retcode == TA_SUCCESS);
    
    return 0;
}

enter image description here

解决方法

[将 TA-lib 结果与 Excel 计算结果进行比较后]: 在您的 excel 中,12 天 EMA 从第一天开始计算,其第一个值是第 12 天 (8/13 /2020) 并且 26 天 EMA 从第一天开始计算,第一个值是第 26 天 (26/13/2020) 的平均值。 TA-Lib 推迟 12 天 EMA 计算开始,以在与 26 天 EMA 的第一个值相同的一天获得其第一个值。这意味着 12 天 EMA 是从 8/16/2020 计算的,它的第一个值是 (26/13/2020) 的平均值,因为它在 26 天 EMA 中。因此,要将您的 excel 调整为 TA-Lib 结果,您需要将公式 =AVERAGE(B19:B30) 复制到单元格 C30 中。

另一个注意事项是 TA-Lib 的 MACD 一次输出 3 个数组:macd、信号、直方图。因此 TA-Lib 在它为所有 3 个结果数组获得有意义的值时开始输出。因此,您得到的结果不是从可以计算 26 天 EMA 的点开始,而是从可以计算信号的点开始(8 天后)。因此,您应将 talib_macd[1] 与从单元格 E38 而不是 E30 开始的 excel 进行比较。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。