TA-Lib: библиотека технического анализа, Lookback и нестабильный период - PullRequest
0 голосов
/ 15 мая 2018

TA-Lib - это библиотека технического анализа рынка / финансового рынка / OHLC для Java, C ++, .Net и т. Д. В ней содержится ~ 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)?

* * Тысяча двадцать-один а) * * тысяча двадцать две
int startIdx = this.ohlcArray.IdxCurrent;
int endIdx = startIdx; 
// call to TA Routine goes here

б) * * тысячу двадцать-пять

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. Почему эти процедуры возвращают 0 для первого элемента outArray [0], когда startIdx равен 0?

  2. Так как я получаю такие странные результаты. Должен ли startIdx быть самой старой или самой новой датой? Смысл, который вы должны обрабатывать от прошлого (startIdx) к настоящему моменту (endIdx) или с настоящего момента (startIdx) к самой старой дате (endIdx) во времени? Я предполагаю, что я вычисляю задом наперед (б)

    a) 2000 (startIdx) - 2003 (endIdx),
    или
    б) 2003 (startIdx) - 2000 (endIdx)

1 Ответ

0 голосов
/ 16 мая 2018

Я уже забыл C #, поэтому могу ошибаться, но:

Похоже, что просмотр для каждой функции возвращает минимальную продолжительность обработки, необходимую для точного вычисления каждой функции.С startIdx до endIdx, равным Lookback.

Нет, возвращает количество входных элементов, необходимых для вычисления первого выходного элемента.Который обычно равен или больше значения timePeriod.Это все.Поэтому, если вы введете 1000 элементов (StartIdx == 0 и endIdx == 9999), а функция Lookback даст вам 25, вы получите 1000-25 = 9975 == outNBElement результирующие элементы обратно.И outBegIdx будет 24. Примечание: никто не гарантирует точность функции.Оглядываясь назад, можно заранее рассчитать размер результирующего массива, что очень важно для C / C ++, где могут быть размещены массивы фиксированного размера.

Массив unstablePeriod [] инициализируется значением 0 для всех записей.Это то, что должно произойти, если нет, где в TA-Lib я нахожу код или данные, с которыми он инициализируется?

Похоже на это.Это происходит в конструкторе Core :: GlobalsType в TA-Lib-Core.h

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 сильно зависят от точки, с которой вы начали их вычислять.Это может быть решено с помощью периода нестабильности, но вам лучше не ограничивать входные данные.

Почему эти подпрограммы возвращают 0 для первого элемента outArray [0] Я думаю, это bcs of -1 в вашем расчете назад.Также возвращается 0 для элемента outBegIdx'th, а не элемента 0.

Есть ли способ вернуть один элемент (a)

С обычным TA-Lib - нет,или вам нужно каждый раз обрабатывать достаточно большой кусок данных, чтобы убедиться, что ваши текущие результаты «сходятся».Но я сделал для себя вилку TA-Lib здесь , которая предназначена для этой цели.Основная идея описана в readme.Это должно быть почти так же быстро, как оригинал, и вы можете просто передать одно значение и объект состояния, чтобы получить один результат обратно без пересчета всех данных.Таким образом, вычисление может быть приостановлено и продолжено при поступлении новых данных без потери предыдущих результатов вычислений.Проблема в том, что TA-Lib написан на C, а код всех его оболочек на C # / Java и т. Д. Фактически генерируется его внутренним инструментом (ta-gen).Никто никогда не пытался работать с моим форком через эти интерфейсы-обертки.Так что они могут быть сломаны.Кроме того, я не предоставляю предварительно скомпилированные двоичные файлы, и поскольку TA-Lib очень старая, а ее инфраструктура довольно причудливая, для ее построения на целевой платформе могут потребоваться некоторые навыки и усилия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...