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

TA-Lib : Technical Analysis Library, Lookback and unstablePeriod

TA-Lib 是 financial/market/OHLC 技术分析库,适用于 Java、C++、.Net 等。其中包含约 158 种技术函数(EMA、MAMA、MACD、SMA 等), 每个都有关联的回溯函数

public static int EmaLookback(int optInTimePeriod) 

每个函数的回顾似乎 return 准确计算每个函数所需的最短处理时间。 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[]")中的单个最新元素。有没有办法 return 单个元素 (a),或者 startIdx 和 endIdx 之间的差值是否必须等于 Lookback(b)?

一)

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

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

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

    b) 2003 (startIdx) - 2000 (endIdx)

我已经忘记了 C#,所以可能是错误的,但是:

The Lookback for each function seems to return the minimum length of processing required to compute each function accurately. With the startIdx to the endIdx equal to the Lookback.

不,计算第一个输出元素需要 returns 个输入元素。通常等于或大于 timePeriod 值。就这样。因此,如果您输入 1000 个元素(StartIdx == 0 和 endIdx == 9999),而 Lookback 函数为您提供 25 个元素,您将得到 1000-25 = 9975 == outNBElement 结果元素。 outBegIdx 将为 24。 注意:没有人保证功能的准确性。 Lookback 只是让您预先计算结果数组的大小,这对于可能分配固定大小数组的 C/C++ 至关重要。

The array unstablePeriod[] initializes to 0 for all entries. Is this what is supposed to occur, if not where in TA-Lib do I find the code or data that it is initialized with?

好像是这样。它发生在 TA-Lib-Core.h

的 Core::GlobalsType 构造函数中

Globals.unstablePeriod是一个数组,用于保存一些TA函数的不稳定设置。通过在 ta_defs.h 中声明的 enum class FuncUnstId 寻址的值。 0x17 值将对应于 T3 技术指标。

在 T3 指标的情况下,这个不稳定期只是为回顾结果增加了一个值。所以T3的lookback是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 结果计算为第一个 "lookback count" 元素的简单平均值。有一个全局兼容性设置可能是 {CLASSIC, METASTOCK, TRADESTATION} 并影响第一个元素的计算,但这并没有太大变化。您的第一个元素是平均值,其他元素计算为 EMA_today = (value_today - old_EMA)*coefficient + old_EMA.

这就是您不能仅传递 "lookback count" 个元素并获得 "accurate function result" 的原因。它不会准确 - 它会是第一个,而不是正确的。在 EMA 的情况下,它将始终是一个简单的平均值,因为简单的平均值用作此函数的种子。并且以下结果不仅针对前 N 个输入元素进行计算,而且还包括之前的 EMA 值。而这个以前的 EMA 包括它以前的 EMA 等。所以你不能只传递元素的回顾计数并期望准确的结果。您也需要传递以前的函数值。 此外,大多数滚动指标的行为都是如此。它们的前 N ​​个值在很大程度上取决于您开始计算它们的点。这可能会通过不稳定期解决,但您最好不要限制输入数据。

Why is do these routines return 0, for the first outArray[0] element My guess it's bcs of -1 in your lookback calculation. Also 0 is returned for outBegIdx'th element, not the 0 element.

Is there a way to return a single element(a)

使用常规 TA-Lib - 不,或者您每次都需要处理足够大的数据以确保您的滚动结果 "converge"。但是我为自己制作了一个 TA-Lib 分支 here,它就是为此目的而设计的。自述文件中描述了主要思想。它应该几乎和原来一样快,你可以只传递单个值和状态对象来获得单个结果,而无需重新计算所有数据。因此,当新数据到达时,计算可能会暂停并继续进行,而不会丢失先前的计算结果。 问题在于 TA-Lib 是用 C 编写的,其所有 C#/Java 等包装器的代码实际上是由其内部工具 (ta-gen) 生成的。从来没有人尝试通过这些包装器接口使用我的叉子。所以它们可能会坏掉。此外,我不提供预编译的二进制文件,因为 TA-Lib 非常陈旧,而且它的基础设施非常漂亮,可能需要一些技巧和努力才能在目标平台上构建它