Loading...
Loading...
Loading...
Loading...
IValuesHandlerWithPrecalc - интерфейс класса скрипта, показывает, что обработчик работает с текущими значениями, но требует предварительной обработки.
Имеет следующие методы:
PreCalc - метод выполняется до основного расчета.
Execute - метод основного расчета.
PostCalc - метод выполняется после основного расчета.
Входящие данные
Перед классом указываются входящие данные индикатора через атрибут Input, пример: [InputsCount(2)] [Input(0, TemplateTypes.DOUBLE, false, "list1")] [Input(1, TemplateTypes.DOUBLE, false, "list2")]
Это означает, что индикатор принимает два списка данных с вещественными числами. Количество параметров может быть не ограничено.
Выходящие данные
[OutputsCount(1)] [OutputType(TemplateTypes.DOUBLE)]
Это означает, что индикатор выдает один список вещественных чисел.
Пример с потоковыми данными:
В этом примере, сначала выполняется метод PreCalc, в него передаются два списка данных list1 и list2. Метод ничего не возвращает. Потом поочередно запускается метод Execute для каждого бара, тут i - номер бара. Метод возвращает вещественное число. После этого запускается метод PostCalc, он ничего не возвращает.
Пример с не потоковыми данными
Можно указать что данные не потоковые, тогда значения будут передаваться поэлементно в метод Execute, пример: [InputsCount(2)] [Input(0, TemplateTypes.DOUBLE, true, "list1")] [Input(1, TemplateTypes.DOUBLE, true, "list2")]
Обратите внимание, что теперь в метод PreCalc ничего не передается.
Особенность индикатора с одним списком данных
Если у индикатора только один входящий список данных, то он может работать только с потоковыми данными и метода PostCalc не будет.
Потоковый индикатор работает со списками значений.
Пример, напишем индикатор, который принимает два списка и выводит один список со средними значениями:
Побарный индикатор принимает на вход единичные значения и выдает одно значение. На вход так же приходит номер бара (переменная i).
Пример индикатора, который принимает два числа и выводит среднее значение:
2. Пример индикатора, который принимает Источник и одно число. Выводит close + число.
3. Пример индикатора, который имеет 2 перегрузки метода Execute и принимает Источник и одно или два числа. Выводит close + число1 + число2.
В TSLab у блоков есть ограничение, блок может выдавать только одно значение. Бывают ситуации, когда один индикатор должен рассчитывать несколько значений и все их нужно использовать в скрипте.
Например, мы хотим написать индикатор Боллинжера, причем в скрипте мы хотим использовать верхнюю линию, нижнюю линию и ширину канала. Для расчета этих значений достаточно рассчитать среднюю линию SMA и стандартное отклонение StDev.
Напишем универсальный блок MyBollinger, который может в зависимости от параметров выдавать верхнюю линию, нижнюю линию или ширину боллинжера. У блока будут параметры:
Period – это период расчета индикатора.
Coef – это коэффициент расчета индикатора
Type – это тип перечисления задающий способ расчета индикатора. Если Top, то выводит верхнюю линию. Если Bottom, то выводит нижнюю линию. Если Width, то выводит ширину канала.
Формулы такие: Верхняя линия: SMA + StDev * Coef. Нижняя линия: SMA - StDev * Coef. Ширина канала: верхняя линия - нижняя линия.
Расчеты индикаторов SMA и StDev мы сделаем через кеширование (Context.GetData). Это сократит количество одинаковых расчетов. Например, в скрипт добавим один блок выдающий верхнюю линию, один блок выдающий нижнюю линию и один блок выдающий ширину канала. При выполнении скрипта первый блок рассчитает значения SMA, StDev и запишет их в кеш. Потом второй и третий блоки уже не будет рассчитывать эти значения, они просто возьмут их из кеша.
Важно: кешировать индикаторы нужно с полной цепочкой зависимых параметров (подробнее тут). Для этого добавлен интерфейс INeedVariableParentNames, у него есть одно свойство VariableParentNames, которое содержит названия родительских блоков с параметрами. Это свойство добавим во все кеши рассчитываемых индикаторов, для того чтобы точно идентифицировать входящий список IList<double> values.