TA-Lib是一个用于Java,C ++ ,. Net等的金融/市场/ OHLC技术分析库。它有~158个技术功能(EMA,MAMA,MACD,SMA等),每个都有一个助手回顾功能
public static int EmaLookback(int optInTimePeriod)
每个函数的Lookback似乎返回准确计算每个函数所需的最小处理长度。使用startIdx到endIdx等于Lookback。
Core.RetCode retcode = Core.Ema(startIdx, endIdx, double inReal, optInTimePeriod, ref outBegIdx, ref outNBElement, double outReal)
其中一些函数使用名为
的数组Globals.unstablePeriod[0x17]
如果这是不正确的,请纠正我。现在问题......
对于所有条目,数组unstablePeriod []初始化为0。这是应该发生的,如果不是TA-Lib中我在哪里找到它初始化的代码或数据?
我们编写的代码只需要数组outReal [0]中的单个最新元素(或任何其他" outArray []")。有没有办法返回单个元素(a),或者startIdx和endIdx之间的差异是否必须等于Lookback(b)?
A)
int startIdx = this.ohlcArray.IdxCurrent;
int endIdx = startIdx;
// call to TA Routine goes here
b)中
int lookBack = Core.EmaLookback(optInTimePeriod) - 1;
int startIdx = this.ohlcArray.IdxCurrent;
int endIdx = startIdx + lookBack;
// call to TA Routine goes here
retcode = Core.Ema(startIdx, endIdx, inReal, optInTimePeriod, ref outBegIdx, ref outNBElement, outReal);
为什么这些例程对于第一个outArray [0]元素返回0,当startIdx等于0时?
因为我得到了如此奇怪的结果。 startIdx应该是最早的日期还是最新的日期?你应该从过去(startIdx)到现在(endIdx),或从现在(startIdx)到最早的日期(endIdx)及时处理?我猜我正在向后计算(b)
a)2000(startIdx) - 2003(endIdx),
或
b)2003(startIdx) - 2000(endIdx)
答案 0 :(得分:1)
我已经忘记了C#所以可能是错的,但是:
每个函数的Lookback似乎返回准确计算每个函数所需的最小处理长度。使用startIdx到endIdx等于Lookback。
不,它返回计算第一个输出元素所需的输入元素数。这通常等于或大于timePeriod值。就这样。因此,如果你输入1000个元素(StartIdx == 0和endIdx == 9999),而Lookback函数给你25个,你将得到1000-25 = 9975 == outNBElement结果元素。 outBegIdx将是24。 注意:没有人保证功能的准确性。回顾只是让你事先计算结果数组的大小,这对于可能分配固定大小数组的C / C ++来说是至关重要的。
对于所有条目,数组unstablePeriod []初始化为0。这是应该发生的,如果不是TA-Lib中我在哪里找到它初始化的代码或数据?
似乎是这样的。它发生在TA-Lib-Core.h的Core :: GlobalsType构造函数中
Globals.unstablePeriod是一个为某些TA功能保持不稳定设置的数组。通过enum class FuncUnstId
中声明的值ta_defs.h
。 0x17值对应T3技术指标。
如果是T3指标,这个不稳定期只会为回顾结果增加一个值。所以T3的回顾是6 * (timePeriod-1) + TA_GLOBALS_UNSTABLE_PERIOD[TA_FUNC_UNST_T3]
。这就是默认为0的原因。而且很清楚,功能准确性并不那么简单。
考虑EMA。它的回顾是timePeriod-1 + TA_GLOBALS_UNSTABLE_PERIOD[TA_FUNC_UNST_EMA]
。假设不稳定值为0.因此EMA只是timePeriod-1。 (我建议不要在没有理由的情况下触摸不稳定)。根据我看到的代码 - 它的第一个EMA结果被默认计算为元素的第一个“回溯计数”的简单平均值。全局兼容性设置可能是{CLASSIC,METASTOCK,TRADESTATION}并影响第一个元素计算,但这并没有太大变化。您的第一个元素是平均值,其他元素的计算结果为EMA_today = (value_today - old_EMA)*coefficient + old_EMA
。
这就是为什么你不能只传递元素的“回溯计数”并获得“准确的功能结果”。这将是不准确的 - 它将是第一个,而不是正确的。在EMA的情况下,它总是一个简单的平均值,因为简单平均值被用作该函数的种子。并且以下结果不仅在前N个输入元素上计算,而且包括先前的EMA值。而之前的EMA包括其之前的EMA等。因此,您不能只传递元素的回溯计数并期望准确的结果。您还需要传递先前的函数值。 此外,大多数滚动指标表现得如此。它们的前N个值很大程度上取决于您开始计算它们的点。这可能会在Unstability期间解决,但您最好不要限制输入数据。
为什么这些例程对于第一个outArray [0]元素返回0 我的猜测是你的回顾计算中的bcs为-1。对于outBegIdx'元素,也返回0,而不是0元素。
有没有办法返回单个元素(a)
使用常规TA-Lib - 否,或者您需要每次处理足够大的数据以确保滚动结果“收敛”。但是我为自己制作了一个TA-Lib分叉here,它就是为此而设计的。主要思想在自述文件中描述。它应该与原始文件一样快,您只需传递单个值和状态对象即可获得单个结果,而无需重新计算所有数据。因此,当新数据到达时,计算可能会暂停并继续,而不会丢失先前的计算结果。 问题是TA-Lib是用C语言编写的,其所有C#/ Java等包装器的代码实际上都是由它的内部工具(ta-gen)生成的。没有人试图通过这些包装器接口使用我的fork。所以他们可能会被打破。此外,我不提供预编译的二进制文件,因为TA-Lib很老,而且它的基础设施很花哨,可能需要一些技巧和努力才能在目标平台上构建它