Skip to content

Simple example in C

mdukaczewski edited this page Nov 17, 2020 · 3 revisions

The original TA-Lib usage is:

#include <stdio.h>
#include "ta_func.h"

int main(int argc, char *argv[])
{

    TA_RetCode res = TA_Initialize();
    if(res != TA_SUCCESS)
    {
        fprintf( stderr, "Error TA_Initialize: %d", res);
        return -1;
    }


    const double data[50] = {105.68, 93.74, 92.72, 90.52, 95.22, 100.35, 97.92, 98.83, 95.33,
                             93.4, 95.89, 96.68, 98.78, 98.66, 104.21, 107.48, 108.18, 109.36,
                             106.94, 107.73, 103.13, 114.92, 112.71, 113.05, 114.06, 117.63,
                             116.6, 113.72, 108.84, 108.43, 110.06, 111.79, 109.9, 113.95,
                             115.97, 116.52, 115.82, 117.91, 119.04, 120, 121.95, 129.08,
                             132.12, 135.72, 136.66, 139.78, 139.14, 139.99, 140.64, 143.66};

    const int data_size = sizeof(data) / sizeof(double);
    // TA_MACD_Lookback retuns number of elements used to initialize moving average (33 in this case)
    // 12, 26, 9 - are default MACD specific periods
    int res_size = data_size - TA_MACD_Lookback(12, 26, 9);
    // res_size is 17 - MACD can't be calculated for first 33 values as they're used for its initialization

    // dynamically allocate output arrays
    double* outMACD = malloc(res_size * sizeof(double));
    double* outMACDSignal = malloc(res_size *sizeof(double));
    double* outMACDHist = malloc(res_size * sizeof(double));

    int outBegIdx= 0;
    int outNbElement = 0;

    // get TA_MACD results
    res = TA_MACD(0, data_size-1,                       // data range
                  data,                                 // data pointer
                  12, 26, 9,                            // TA Func specific args
                  &outBegIdx, &outNbElement,            // relative index and size of results
                  outMACD, outMACDSignal, outMACDHist); // arrays of results

    if (res == TA_SUCCESS) {
        for (int i = 0; i < outNbElement; i++){
            printf("Result for day #%d outMACD: %f outMACDSignal: %f outMACDHist: %f\n",
                   outBegIdx+i, *(outMACD+i), *(outMACDSignal+i), *(outMACDHist+i));
        }
    } else
        fprintf( stderr, "Error TA_MACD: %d", res);

    free(outMACD);
    free(outMACDSignal);
    free(outMACDHist);

    res = TA_Shutdown();
    if(res != TA_SUCCESS)
    {
        fprintf( stderr, "Error TA_Shutdown: %d", res);
        return -1;
    }
}

Application output is:

Result for day #34 outMACD: 4.273859 outMACDSignal: 5.671647 outMACDHist: -1.397788
Result for day #35 outMACD: 4.345092 outMACDSignal: 5.406336 outMACDHist: -1.061244
Result for day #36 outMACD: 4.395259 outMACDSignal: 5.204121 outMACDHist: -0.808861
Result for day #37 outMACD: 4.328635 outMACDSignal: 5.029024 outMACDHist: -0.700388
Result for day #38 outMACD: 4.393831 outMACDSignal: 4.901985 outMACDHist: -0.508154
Result for day #39 outMACD: 4.484981 outMACDSignal: 4.818584 outMACDHist: -0.333603
Result for day #40 outMACD: 4.581865 outMACDSignal: 4.771241 outMACDHist: -0.189375
Result for day #41 outMACD: 4.761112 outMACDSignal: 4.769215 outMACDHist: -0.008103
Result for day #42 outMACD: 5.416065 outMACDSignal: 4.898585 outMACDHist: 0.517480
Result for day #43 outMACD: 6.109990 outMACDSignal: 5.140866 outMACDHist: 0.969124
Result for day #44 outMACD: 6.871214 outMACDSignal: 5.486936 outMACDHist: 1.384278
Result for day #45 outMACD: 7.464296 outMACDSignal: 5.882408 outMACDHist: 1.581888
Result for day #46 outMACD: 8.092786 outMACDSignal: 6.324483 outMACDHist: 1.768303
Result for day #47 outMACD: 8.441914 outMACDSignal: 6.747970 outMACDHist: 1.693945
Result for day #48 outMACD: 8.687049 outMACDSignal: 7.135785 outMACDHist: 1.551264
Result for day #49 outMACD: 8.831961 outMACDSignal: 7.475021 outMACDHist: 1.356940
Result for day #50 outMACD: 9.085758 outMACDSignal: 7.797168 outMACDHist: 1.288590

With TA-Lib RT same could be done without dynamic result arrays allocation:

#include <stdio.h>
#include "ta_func.h"

int main(int argc, char *argv[])
{

    TA_RetCode res = TA_Initialize();
    if(res != TA_SUCCESS)
    {
        fprintf( stderr, "Error TA_Initialize: %d", res);
        return -1;
    }


    const double data[50] = {105.68, 93.74, 92.72, 90.52, 95.22, 100.35, 97.92, 98.83, 95.33,
                             93.4, 95.89, 96.68, 98.78, 98.66, 104.21, 107.48, 108.18, 109.36,
                             106.94, 107.73, 103.13, 114.92, 112.71, 113.05, 114.06, 117.63,
                             116.6, 113.72, 108.84, 108.43, 110.06, 111.79, 109.9, 113.95,
                             115.97, 116.52, 115.82, 117.91, 119.04, 120, 121.95, 129.08,
                             132.12, 135.72, 136.66, 139.78, 139.14, 139.99, 140.64, 143.66};
    const int data_size = sizeof(data) / sizeof(double);

    struct TA_MACD_State *state = NULL;

    // allocate new function state object
    res = TA_MACD_StateInit(&state, 12, 26, 9);

    if(res != TA_SUCCESS)
    {
        fprintf( stderr, "Error TA_MACD_StateInit: %d", res);
        return -1;
    }

    double outMACD;
    double outMACDSignal;
    double outMACDHist;

    for (int i = 0; i < data_size; i++)
    {
        // get TA_MACD results
        res = TA_MACD_State(
                    state,                                   // function state object
                    data[i],                                 // data value
                    &outMACD, &outMACDSignal, &outMACDHist); // results

        // in this case for i in [0;32] function will return TA_NEED_MORE_DATA
        // as values passed to it are used for MACD initialization

        if (res == TA_SUCCESS) {
            printf("Result for day #%d outMACD: %f outMACDSignal: %f outMACDHist: %f\n",
                   i+1, outMACD, outMACDSignal, outMACDHist);
        }
        else if (res != TA_NEED_MORE_DATA) {
            fprintf( stderr, "Error TA_MACD_State: %d", res);
            break;
        }
    }

    res = TA_MACD_StateFree(&state);
    if(res != TA_SUCCESS)
    {
        fprintf( stderr, "Error TA_MACD_StateFree: %d", res);
    }

    res = TA_Shutdown();
    if(res != TA_SUCCESS)
    {
        fprintf( stderr, "Error TA_Shutdown: %d", res);
        return -1;
    }
}
Clone this wiki locally