TA-Lib:技术分析库,回顾和unstablePeriod

时间:2018-05-15 20:12:24

标签: c# ta-lib technical-indicator

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]

如果这是不正确的,请纠正我。现在问题......

  1. 对于所有条目,数组unstablePeriod []初始化为0。这是应该发生的,如果不是TA-Lib中我在哪里找到它初始化的代码或数据?

  2. 我们编写的代码只需要数组outReal [0]中的单个最新元素(或任何其他" outArray []")。有没有办法返回单个元素(a),或者startIdx和endIdx之间的差异是否必须等于Lookback(b)?

  3. 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);
    
    1. 为什么这些例程对于第一个outArray [0]元素返回0,当startIdx等于0时?

    2. 因为我得到了如此奇怪的结果。 startIdx应该是最早的日期还是最新的日期?你应该从过去(startIdx)到现在(endIdx),或从现在(startIdx)到最早的日期(endIdx)及时处理?我猜我正在向后计算(b)

      a)2000(startIdx) - 2003(endIdx),

      b)2003(startIdx) - 2000(endIdx)

1 个答案:

答案 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很老,而且它的基础设施很花哨,可能需要一些技巧和努力才能在目标平台上构建它