Установка TA-Lib и пример использования C api

TA-Lib — библиотека с открытым кодом в которой реализовано более 200 индикаторов технического анализа. Наиболее известные: RSI, MACD, ADX, Stochastic, Bollinger Bands и др.

Библиотека разработана на чистом C. TA-Lib может быть скомпилирована под разные системы и может использоваться из разных языков программирования, например: C/C++, Java, Perl, Python, PHP и др.

Внутри пример ее установки на Linux и использования из C.

Установка TA-Lib

Установка проста и не должна вызвать проблем на Linux.
Первым делом, скачиваем архив с кодом и распаковываем:

$ 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

Теперь переходим в директорию с кодом, компилируем и устанавливаем библиотеку в систему:

$ cd ta-lib/
$ ./configure
$ make
$ sudo make install

Если все прошло успешно и не было ошибок, значит библиотека установлена и расположена здесь (в некоторых дистрибутивах путь может отличаться): /usr/lib/libta_lib.so

Пример на C

Официальная документация кратка, но содержит необходимые пояснения. Доступна здесь.

Ниже код на C с комментариями, под кодом даны пояснения. Для примера будем вызывать функцию TA_SMA() для расчета простой скользящей средней с периодом равным 10.

#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() для завершения использования библиотеки.

Код можно скомпилировать и запустить командой:

$ gcc talib.c -lta_lib -lm && ./a.out

Где:

  • -lta_lib — подключение компилятором библиотеки ta_lib.
  • -lm — подключение компилятором библиотеки math.c (используется в ta_lib).

На C++ код будет практически идентичным, учитывая готовые шаблоны языка. Исключение только в добавлении библиотеки. Код ниже:

extern "C" {
    #include "ta-lib/ta_libc.h"
}