TA-Lib是一個用於金融技術分析的C++庫,可以用來計算MACD,動量,移動均線等常用指標等
本文對TA-Lib做了一個簡單的使用初體驗
源碼下載
地址:ta-lib
注意這裏面有多個源碼包,選擇msvc這個版本(windows和linux編譯都用這個版本的源碼)
下載後源碼目錄
根目錄ta-lib和ta-lib/c
編譯
使用TA-Lib需要先編譯出對應鏈接庫,支持編譯靜態和動態連接庫
本文已編譯靜態庫爲例,其中源碼解壓後根目錄爲ta-lib
windows
環境:win7 + vs2015
這裏編譯出x64的lib
打開VS2015 x64 Native Tools Command Prompt命令行執行
cd ta-lib\c\make\cmr\win32\msvc
nmake
注意
- 這裏可能會報gen_code失敗,可以忽略,如果有其他問題,可以先
nmake clean
一下 - 要確保ta-lib\c\lib這個目錄是存在的
編譯的結果在 ta-lib/c/lib
目錄
linux
環境:ubuntu14.04 + gcc4.8
命令行執行
cd ta-lib/c/make/cmr/linux/g++
make
編譯的結果在 ta-lib/c/lib
目錄
.
├── libta_abstract_cmr.a
├── libta_common_cmr.a
├── libta_func_cmr.a
└── libta_libc_cmr.a
使用示例
windows
建立vs2015項目talibtest,配置ta-lib的包含頭文件和包含庫目錄以及附加依賴項
- include目錄:
D:\Programs\ta-lib\c\include
- lib目錄:
D:\Programs\ta-lib\c\lib
- 附加依賴項:
ta_abstract_cmr.lib ta_common_cmr.lib ta_func_cmr.lib ta_libc_cmr.lib
linux
建立cmake項目talibtest,配置cmake文件
project(talibtest)
cmake_minimum_required(VERSION 2.8)
add_definitions(-std=c++11)
include_directories(/home/user/codetest/ta-lib/c/include)
aux_source_directory(. SRC_LIST)
link_directories(/home/user/codetest/ta-lib/c/lib)
add_executable(${PROJECT_NAME} ${SRC_LIST})
# link static library, notice the link sequence
target_link_libraries(${PROJECT_NAME}
libta_common_cmr.a
libta_libc_cmr.a
libta_abstract_cmr.a
libta_func_cmr.a)
代碼
一個簡單計算30天移動平均線的example
#include <iostream>
#include <time.h>
#include <assert.h>
#include "ta_libc.h"
int main()
{
std::cout << "ta-lib test" << std::endl;
// init ta-lib context
TA_RetCode retcode;
retcode = TA_Initialize();
assert(retcode == TA_SUCCESS);
// comput moving average price
TA_Real close_price_array[400] = { 0 };
// construct random price
srand((unsigned)time(0));
for (int i = 0; i < 400; i++)
close_price_array[i] = rand() % 50 + 100;
TA_Real out[400] = { 0 };
TA_Integer out_begin = 0;
TA_Integer out_nb_element = 0;
retcode = TA_MA(0, 399,
&close_price_array[0],
30, TA_MAType_SMA,
&out_begin, &out_nb_element, &out[0]);
assert(retcode == TA_SUCCESS);
std::cout << "---- compute output ----" << std::endl;
std::cout << "out_begin_index: " << out_begin << std::endl;
std::cout << "out_nb_element: " << out_nb_element << std::endl;
std::cout << "out price array: " << std::endl;
for (auto &price : out)
std::cout << price << " ";
retcode = TA_Shutdown();
assert(retcode == TA_SUCCESS);
return 0;
}
結果
ta-lib test
---- compute output ----
out_begin_index: 29
out_nb_element: 371
out price array:
125.533 125.633 124.367 124.567 123.833 124.833 124.067 122.733 123.367 ...