Last updated
Was this helpful?
Last updated
Was this helpful?
В 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.