TA-Lib — библиотека с открытым кодом в которой реализовано более 200 индикаторов технического анализа. Наиболее известные: RSI, MACD, ADX, Stochastic, Bollinger Bands и др.
Библиотека разработана на чистом C. TA-Lib может быть скомпилирована под разные системы и может использоваться из разных языков программирования, например: C/C++, Java, Perl, Python, PHP и др.
Внутри пример ее установки на Linux и использования из C.
Установка TA-Lib
Установка проста и не должна вызвать проблем на Linux.
Первым делом, подготовим систему:
1 |
sudo apt install build-essential autoconf python-dev python3-dev |
Затем скачиваем архив с кодом и распаковываем:
1 2 |
wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz tar -xzf ta-lib-0.4.0-src.tar.gz |
Теперь переходим в директорию с кодом, компилируем и устанавливаем библиотеку в систему:
1 2 3 |
cd ta-lib/ ./configure && make sudo make install |
Если все прошло успешно и не было ошибок, значит библиотека установлена и расположена здесь (в некоторых дистрибутивах путь может отличаться): /usr/lib/libta_lib.so
Пример на C
Официальная документация кратка, но содержит необходимые пояснения. Доступна здесь.
Ниже код на C с комментариями, под кодом даны пояснения. Для примера будем вызывать функцию TA_SMA() для расчета простой скользящей средней с периодом равным 10.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#include #include <ta-lib/ta_libc.h> int main(int argc, char *argv[]) { /* C-Array with 20 double */ double in[20]; /* Get array length for example */ int length = (sizeof(in) / sizeof(*in)); /* Fill the array */ for (int i = 0; i < length; i++) { in[i] = i; } /* Print the array */ printf("Array length: %d\n", length); for (int i = 0; i < length; i++) { //printf("%.1f, ", in[i]); } /* Prepare to TA-Lib */ TA_Real out[length]; TA_Integer outBeg; TA_Integer outNbElement; TA_RetCode retCode; int timeperiod = 10; /* Initialize before use */ retCode = TA_Initialize(); if ( retCode != TA_SUCCESS ) { printf("Cannot initialize TA-Lib: %d\n", retCode); } else { printf("TA-Lib correctly initialized: %d\n", retCode); // Shift out pointer double *outp = out+TA_SMA_Lookback(timeperiod); /* TA_SMA call */ retCode = TA_SMA( 0, length-1, &in[0], timeperiod, &outBeg, &outNbElement, &outp[0] ); printf("outBeg=%d outNbElement=%d \n", outBeg, outNbElement); for(int i=0; i < outNbElement; i++ ) printf("Day %d\t= %.1f=>%.1f\n", outBeg+i, in[outBeg+i], out[outBeg+i]); /* Shutdown TA-Lib*/ TA_Shutdown(); } return 0; } |
файл ta-lib.c
В начале программы создаем массив из 20 чисел и заполняем его от 0 до 19. При желании его можно вывести на экран, раскомментировав строку.
Далее инициализируем необходимые переменные и вызываем функцию TA_Initialize(), которая должна быть вызвана единожды перед началом использования функций библиотеки.
Когда TA-Lib успешно инициализирована, создаем указатель на элемент, с которого будем заполнять выходной массив полученными значениями. Смещение получаем с помощью функции TA_SMA_Lookback(), передавая в нее период расчета.
Теперь все готово и можно передать в функцию TA_SMA() все данные и указатели на переменные:
- in/out — массивы с входящими/исходящими данными.
- outBeg — получит количество пропущенных элементов от начала массива. Равен значению функции TA_SMA_Lookback().
- outNbElement — получит количество элементов с данными.
В конце выполняем функция TA_Shutdown() для завершения использования библиотеки.
Код можно скомпилировать и запустить командой:
1 |
gcc talib.c -lta_lib -lm && ./a.out |
Где:
-lta_lib
— подключение компилятором библиотеки ta_lib.-lm
— подключение компилятором библиотеки math.c (используется в ta_lib).
На C++ код будет практически идентичным, учитывая готовые шаблоны языка. Исключение только в добавлении библиотеки. Код ниже:
1 2 3 |
extern "C" { #include "ta-lib/ta_libc.h" } |