Help us understand the problem. What is going on with this article?

C言語でTA-Libを使う

C言語でTA-Libを使う

TA-Libは簡単にテクニカル分析ができるライブラリです。Pythonで使うとすごく便利ですが、実行の速度を追求する場合はC言語で使うことがあるかもしれないので、C言語でTA-Libを使ってみました。

インストール

Macの場合はHomebrewでインストールできます。

$ brew install ta-lib

ドキュメント

公式のドキュメントがありますが、若干読みづらいかもしれません。
使えるfunctionsとdefinesは ta_func.hを参照してください。
(公式ドキュメントのリンクは無効になってるので、githubで適当に拾いました)

include

<ta-lib/ta_libc.h>をincludeすると使えます。

コンパイル

コンパイルするときは、 -lta_libをつける必要があります。

gcc -o sample sample.c -lta_lib

実装

sample.c
#include <stdio.h>
#include <ta-lib/ta_libc.h>

int main(void) {

  // 計算する元の数値
  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};

  // (結果)ボリンジャーバンドの上のレンジ
  double upper[50];

  // (結果)ボリンジャーバンドの下のレンジ
  double lower[50];

  // (結果)移動平均線
  double middle[50];

  // ボリンジャーバンドの期間 
  int time_period = 20;

  // シグマ値
  int upper_sigma_num = 2;
  int lower_sigma_num = 2;

  // 移動平均線の種類
  TA_MAType ma_type = TA_MAType_SMA;

  // 結果が始まるindex
  // time_periodは20なので、19から始まる
  int res_offset;

  // 結果の数
  int res_count;

  // Ta-libを初期化
  TA_RetCode res = TA_Initialize();
  if(res != TA_SUCCESS) {
    printf("TA_Initialize error: %d\n", res);
    return -1;
  }

  // ボリンジャーバンドを算出
  res = TA_BBANDS(
    0,  // 開始index
    49, // 終了index
    data,
    time_period,
    upper_sigma_num,
    lower_sigma_num,
    ma_type,
    &res_offset, // ポインタ
    &res_count,  // ポインタ
    upper,
    middle,
    lower
  );

  if (res != TA_SUCCESS) {
    printf("TA_BBANDS failed: %d\n", res);
    return -1;
  }

  // 結果をprint
  printf("id\tupper\tmiddle\tlower\n");
  for(int i = 0; i < res_count; i++) {
    printf("%d\t%.2lf\t%.2lf\t%.2lf\n",
           res_offset + i,
       upper[i],
       middle[i],
       lower[i]);
  }

  // Ta-libの終了処理
  res = TA_Shutdown();
  if(res != TA_SUCCESS) {
    printf("TA_Shutdown error: %d", res);
    return -1;
  }

  return 0;
}

結果

id  upper   middle  lower
19  111.50  99.88   88.26
20  111.17  99.75   88.33
21  113.65  100.81  87.98
22  115.07  101.81  88.55
23  116.00  102.94  89.88
24  117.29  103.88  90.47
25  119.31  104.74  90.18
26  120.76  105.68  90.60
27  121.55  106.42  91.30
28  121.37  107.10  92.83
29  120.66  107.85  95.04
30  120.16  108.56  96.96
31  119.61  109.31  99.01
32  118.96  109.87  100.78
33  118.29  110.63  102.98
34  118.61  111.22  103.83
35  119.20  111.67  104.15
36  119.61  112.06  104.50
37  120.34  112.48  104.63
38  121.01  113.09  105.17
39  121.76  113.70  105.64
40  121.90  114.64  107.38
41  124.96  115.35  105.74
42  128.30  116.32  104.35
43  132.00  117.46  102.92
44  135.25  118.59  101.92
45  138.73  119.69  100.65
46  141.58  120.82  100.06
47  144.22  122.13  100.05
48  146.32  123.72  101.12
49  148.53  125.48  102.44

結論

pythonよりは実装は少し面倒ですが、難しくはなかったと思います。

hrdrq
東京でエンジニアをやってる台湾人です。 仕事はWEBの開発ですが、アルゴリズム、語学学習ツールの開発、データサイエンスや投資ボットの開発は趣味です。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした