本文档包含了提供给最终用户的所有函数。
在C/C++项目中使用TA-Lib库,你只需包含“ta_libc.h”头文件,并根据应用类型连接到相应的静态库。
ta-lib/include目录包含了所需的所有头文件。其它目录的头文件绝不能被应用直接包含。
目前支持的静态库列表:
静态库名称 |
是否使用运行时DLL? |
是否多线程? |
是否包含调试信息? |
ta_libc_csr.lib |
- |
- |
- |
ta_libc_csd.lib |
- |
- |
是 |
ta_libc_cmr.lib |
- |
是 |
- |
ta_libc_cmd.lib |
- |
是 |
是 |
ta_libc_cdr.lib |
是 |
是 |
- |
ta_libc_cdd.lib |
是 |
是 |
是 |
MSVC包中包含这些库的预编译版本。如果你想重新编译这些静态库, ta-lib/c/make/<ENV>/win32/msvc目录下有makefile。这些makefile也适用于Visual Studio 2005。
其中 <ENV>是指3个字母的子目录 (cmd, cmr, csd, csr, cdd and cdr) ,用于匹配应用程序的运行时环境。
运行“nmake”或“nmake /A”,编译所有目标。生成的目标文件位于ta-lib/c/lib 目录和ta-lib/c/bin目录。
如果需要重新构建,可以运行“nmake clean”来清理项目,然后再次运行“nmake”。
SVN代码库和Win32包中有多个平台的makefile,包括Linux平台。Linux平台makefile位于ta-lib/c/make/<ENV>/linux/g++目录。
其中<ENV>是3个字符的子目录(cmd,cmr,csd,csr),具体含义参加2.1。其中cdd和cdr不适用于Linux。
运行“make clean”和“make”命令构建目标。生成目标位于ta-lib/c/lib and ta-lib/c/bin目录。编译应用程序时,需要连接到3个静态库: ta-abstract, ta-func 和 ta-common。
下载tar.gz源码包,以root身份运行下列命令:
./configure
./make
./make install
TA-Lib包含在一个单独的共享库“libta-lib”(具体名字取决于平台)。
对gcc 编译器,使用“-lta-lib”选项,链接TA-Lib库。
当编译完整的源码树时,将会生成一个名为“ta_regtest”的程序,位于ta-lib/c/bin目录。这是一组测试套件,用于确认库是否构建成功。因此,每次重新编译TA-Lib库后,建议都运行ta_regtest程序。使用ta_regtest回归测试时,因为需要测试网络数据抓取功能,所以需要连接互联网。
在调用其它API函数前,需要调用且仅调用一次TA_Initialize函数。
用户可以直接调用单个TA函数。如果用户想要整合多个TA函数,但又不知晓它们的参数,应该考虑使用抽象层接口。
源码中的所TA函数包含于ta-lib/src/ta_func目录。
直接调用函数通过ta-lib/c/include/ta_func.h中定义的接口实现。所有的TA函数,都是简单的数学函数。用户提供一个输入数组,函数将结果保存在用户指定的输出数组中。TA函数并不为用户分配空间。产生的结果的数,不会超过输入数组中要求计算的元素个数。下面是一个例子:
我们将要解析TA_MA函数,这个函数用于计算移动平均数。
TA_RetCode TA_MA( int startIdx,
int endIdx,
constdouble inReal[],
int optInTimePeriod,
int optInMAType,
int *outBegIdx,
int *outNbElement,
double outReal[],
)
初看似乎有很多参数,不必担心,所有的函数都是一致的,拥有相同的参数结构。参数可划分为4部分:
这种参数结构提供了很大的灵活性,可以使函数只计算输入数组的一部分数据。这稍微有些复杂,但它可以允许有需求的用户高效管理内存和CPU处理。
比如,你希望计算收盘价30天移动平均线。可以如下调用此函数:
TA_Real closePrice[400];
TA_Real out[400];
TA_Integer outBeg;
TA_IntegeroutNbElement;
/* ... initializeyour closing price here... */
retCode = TA_MA( 0, 399,
&closePrice[0],
30,TA_MAType_SMA,
&outBeg,&outNbElement, &out[0] );
/* The output isdisplayed here */
for( i=0; i <outNbElement; i++ )
printf( "Day %d = %f\n", outBeg+i,out[i] );
关于输出,需要注意一下这两个参数:outBeg 和 outNbElement。尽管要求计算数据范围为0到399,但是移动平均数直到第30个数才有意义。因此,outBeg将会赋值为29(从0开始索引),而outNbElement将会赋值为400-29=371。意思是前371个输出元素是有意义的。
再举一个例子,假设要求计算从125到225(startIdx和endIdx)范围内的移动平均数,outBeg将会返回125,outNbElement将会返回101。而输出数组out中只有前101个是有意义的。
如果提供的数据不足以计算哪怕一个结果,outNbElement将返回0,outBeg将被忽略。
如果TA函数的输入和输出类型相同,用户可以重用输入数组空间,来存储其中某个输出。下面的例子可以很好的运行:
#define BUFFER_SIZE 100
TA_Real buffer[BUFFER_SIZE];
...
retCode = TA_MA( 0, BUFFER_SIZE-1,
&buffer[0],
30, TA_MAType_SMA,
&outBeg, &outNbElement,&buffer[0] );
当然,输入被覆盖了,不过这个特性可以减少临时空间的分配。可以假定这个特性对所有TA函数都成立。
有足够大的输出数组大小是很重要的。取决于你的需要,下面这些方法可以帮助你决定所需输出的大小。所有这些方法都是一致的,并适用于所有的TA函数:
方法 |
描述 |
匹配输入 |
allocationSize = endIdx + 1; 优点:易于理解和实现 缺点:指定范围很小时,可能会浪费很多空间 |
匹配计算范围 |
allocationSize = endIdx - startIdx + 1; 优点:易于实现 缺点:分配略大于需要。例如,计算区间为30的SMA,由于需要回溯(lookback),会浪费29个元素的存储空间。 |
精确分配 |
lookback = TA_XXXX_Lookback( ... ) ; 优点:优化分配空间算法; 缺点:实现略显复杂 |
为每一个TA函数都提供了一个TA_XXXX_Lookback 回溯函数。例如:对于 TA_SMA,有一个 TA_SMA_Lookback回溯函数。
回溯函数返回在第一个结果被计算出前,已经消耗的输入元素个数。例如区间为10的SMA,将返回数值为9的回溯。
所有的TA函数可以使用ta-lib/c/include/ta_abstrac.h中定义的接口调用。如果你希望你的应用支持所有的TA函数,并且在在TA-Lib增加函数时,不想重新写代码,那么可以使用抽象层。但是如果你只想在你的应用中集成某些特定的TA函数,最好直接调用TA函数(参见前一小节)。
例子:
比方说你正在做一个图表软件。当用户选择一个price bar,在旁边将显示所有能够应用在price bar上的TA 函数。用户选择一个函数,将弹出一个对话框,允许用户调整可选参数(TA-LIB将告诉软件需要哪些参数,以及参数的可选择范围)。当所有参数都设置好后,就可以调用相应的TA函数了。函数的结果也可以绘制在图表上(一些输出标识可以提示数据如何绘制)。同样的“抽象”逻辑可以应用到所有TA函数。一些TA函数只能应用于数量,或可应用于任何时间序列数据(开盘价,收盘价,其它指标……)。这个“虚”接口可以决定所有可以应用到当前选定数据上的函数。
抽象层是一个十分复杂,但功能强大的接口。
一些TA函数由于输入数据起始点不同提供了不同的运算结果。这通常被称为函数具有记忆。指数移动平均数是这样函数的一个例子。使用TA_SetUnstablePeriod和TA_GetUnstatablePeriod函数可以控制不稳定时期(丢掉数据的数量)。
对于每个技术分析算法,都提供了两个版本的函数:一个接受float类型的输入数组,一个接受double类型的输入数组。其中flaot版本的函数有一个TA_S_后缀。例如,对于TA_MA函数,有一个对应TA_S_MA函数。
TA_RetCode TA_MA( int startIdx,
int endIdx,
const double inReal[],
int optInTimePeriod,
TA_MAType optInMAType,
int *outBegIdx,
int *outNbElement,
double outReal[] );
TA_RetCode TA_S_MA( int startIdx,
int endIdx,
const float inReal[],
int optInTimePeriod,
TA_MAType optInMAType,
int *outBegIdx,
int *outNbElement,
double outReal[] );
两个版本都是用double类型进行计算,因此两个版本的函数会得到相同的结果。
典型的,用户使用float存储price bar数据,使用double存储中间计算结果。TA-Lib直接支持两种输入类型,在内存使用上更高效。如果只有一种类型,用户将不得不在调用TA函数前,将一种类型的输入数据,拷贝到另一种类型的数组中。