C# TA库:技术分析库、回溯和不稳定期 TAL LIB是java、C++、.NET等的金融/市场/ OHLC技术分析库,其中有158个技术函数EMA、MAMA、MACD、SMA等,每个都具有相关的回望函数 public static int EmaLookback(int optInTimePeriod)

C# TA库:技术分析库、回溯和不稳定期 TAL LIB是java、C++、.NET等的金融/市场/ OHLC技术分析库,其中有158个技术函数EMA、MAMA、MACD、SMA等,每个都具有相关的回望函数 public static int EmaLookback(int optInTimePeriod),c#,ta-lib,technical-indicator,C#,Ta Lib,Technical Indicator,每个函数的回溯似乎返回准确计算每个函数所需的最小处理长度。startIdx到endIdx等于回望 Core.RetCode retcode = Core.Ema(startIdx, endIdx, double inReal, optInTimePeriod, ref outBegIdx, ref outNBElement, double outReal) 其中一些函数使用一个名为 Globals.unstablePeriod[0x17] 如果这在任何方面都不正确,请纠正我。现在的问题是 数

每个函数的回溯似乎返回准确计算每个函数所需的最小处理长度。startIdx到endIdx等于回望

Core.RetCode retcode = Core.Ema(startIdx, endIdx, double inReal, optInTimePeriod, ref outBegIdx, ref outNBElement, double outReal)
其中一些函数使用一个名为

Globals.unstablePeriod[0x17]
如果这在任何方面都不正确,请纠正我。现在的问题是

数组unstablePeriod[]对所有条目初始化为0。这是应该发生的吗?如果不是的话,我在TA库中的什么地方可以找到初始化它的代码或数据

我们正在编写的代码只需要数组outReal[0]或任何其他outArray[]中的单个最新元素。是否有方法返回单个元素a,或者startIdx和endIdx之间的排列必须等于Lookbackb

a

b

为什么当startIdx等于0时,这些例程对第一个outArray[0]元素返回0

因为我得到了如此奇怪的结果。startIdx应该是最早的日期还是最新的日期?这意味着您应该从过去的startIdx处理到现在的endIdx,还是从现在的startIdx处理到时间上最早的dateendIdx?我猜我是在倒着计算b

a 2000年startIdx-2003年endIdx, 或 b 2003年startIdx-2000年endIdx


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

每个函数的回溯似乎返回准确计算每个函数所需的最小处理长度。startIdx到endIdx等于回望

Core.RetCode retcode = Core.Ema(startIdx, endIdx, double inReal, optInTimePeriod, ref outBegIdx, ref outNBElement, double outReal)
否,它返回计算第一个输出元素所需的输入元素数。通常等于或大于时间段值。这就是全部。所以,如果您输入1000个元素StartIdx==0和endIdx==9999,而Lookback函数给您25个元素,您将得到1000-25=9975==outNBElement结果元素。outBegIdx将是24岁。 注:noone保证函数的准确性。回溯只是让您预先计算结果数组的大小,这对于可能分配固定大小数组的C/C++来说至关重要

数组unstablePeriod[]对所有条目初始化为0。这是应该发生的吗?如果不是的话,我在TA库中的什么地方可以找到初始化它的代码或数据

好像是这样。它发生在TA Lib Core.h中的Core::GlobalsType构造函数中

Globals.unstablePeriod是一个数组,它为某些TA函数保留不稳定设置。通过在ta_defs.h中声明的枚举类FuncUnstId寻址的值。0x17值将对应于T3技术指示器

在T3指示器的情况下,此不稳定期只会为回望结果增加一个值。所以T3的回望是6*timePeriod-1+TA_GLOBALS_UNSTABLE_PERIOD[TA_FUNC_UNST_T3]。这就是为什么它默认为0。很明显,函数的精确性并不是那么简单

以EMA为例。它的回溯是时间周期-1+TA_全局不稳定周期[TA_FUNC_UNST_EMA]。假设不稳定值为0。所以EMA只是一个时间段-1。我建议不要无缘无故地接触不稳定。根据我看到的代码,默认情况下,它的第一个EMA结果计算为元素的第一个回望计数的简单平均值。有一个全局兼容性设置,它可能是{CLASSIC、METASTOCK、TRADESTATION},并且会影响第一个元素的计算,但这不会有太大的改变。您的第一个元素是平均值,其他元素的计算公式为:今天的EMA_=今天的值-旧的EMA*系数+旧的EMA

这就是为什么不能只传递元素的回溯计数,就可以得到准确的函数结果。它不会是准确的-它将是第一个,而不是正确的。在EMA的情况下,它将始终是一个简单平均值,因为简单平均值被用作此函数的种子。下面的结果不仅计算前N个输入元素,还包括以前的EMA值。前面的EMA包括前面的EMA等等,所以你不能只通过元素的回溯计数,就期望得到准确的结果。您还需要传递上一个函数值。 此外,大多数滚动指标的表现都是这样的。它们的前N个值在很大程度上取决于您开始计算它们的点。这可以通过不稳定期来解决,但最好不要限制输入数据

为什么这些例程对于第一个outArray[0]元素返回0 我猜在你的回溯计算中是bcs的-1。另外,outBegIdx的第个元素返回0,而不是0元素

有没有办法返回单个元素a

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

在这一响应中,我在过去几周的搜索中无法找到更多的信息。如果你对TA库的C版本感兴趣的话,我在几年前用dot net reflector做了一个。我还有一个问题。编辑并添加到上面。由于我得到了一些奇怪的结果,startIdx应该是最早的日期还是最新的日期?这意味着你应该从过去开始,还是从现在回到过去?@davidfuchs startIdx应该指向最早的日期。当我发现这一点时,aI昨晚开始重新设计数据引擎。使用平滑的指标的初始化周期可能比你想象的要长得多。作为一个例子,我已经在这里演示了平滑是如何影响RSI值的。对于EMA,在精度达到两个小数点之前,它可以超过回望期200+条。和你一样,尽管我已经用了十年的TA Lib,但我一直在为之奋斗。与其修改TA库,不如尝试更现代的库:。
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);