1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C言語でTA-Libを使う

Posted at

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よりは実装は少し面倒ですが、難しくはなかったと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?