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