Индикатор с предварительной обработкой

IValuesHandlerWithPrecalc - интерфейс класса скрипта, показывает, что обработчик работает с текущими значениями, но требует предварительной обработки.

Имеет следующие методы:

  • PreCalc - метод выполняется до основного расчета.

  • Execute - метод основного расчета.

  • PostCalc - метод выполняется после основного расчета.

Входящие данные

Перед классом указываются входящие данные индикатора через атрибут Input, пример:
[InputsCount(2)]
[Input(0, TemplateTypes.DOUBLE, false, "list1")]
[Input(1, TemplateTypes.DOUBLE, false, "list2")]

Это означает, что индикатор принимает два списка данных с вещественными числами.
Количество параметров может быть не ограничено.

Выходящие данные

[OutputsCount(1)]
[OutputType(TemplateTypes.DOUBLE)]

Это означает, что индикатор выдает один список вещественных чисел.

Пример с потоковыми данными:

using System.Collections.Generic; using TSLab.Script.Handlers; namespace MyLib { [HandlerCategory("MyLib")] [HandlerName("TestPrecalc1")] [InputsCount(2)] [Input(0, TemplateTypes.DOUBLE, false, "list1")] [Input(1, TemplateTypes.DOUBLE, false, "list2")] [OutputsCount(1)] [OutputType(TemplateTypes.DOUBLE)] public class TestPrecalc1 : IValuesHandlerWithPrecalc { public void PreCalc(IList<double> list1, IList<double> list2) { // Выполняется до расчетов } public double Execute(int i) { // Метод расчета, параметр i перебирается от 0 до n баров return 0; } public void PostCalc() { // Выполняется после расчетов } } }

В этом примере, сначала выполняется метод PreCalc, в него передаются два списка данных list1 и list2. Метод ничего не возвращает.
Потом поочередно запускается метод Execute для каждого бара, тут i - номер бара. Метод возвращает вещественное число.
После этого запускается метод PostCalc, он ничего не возвращает.

Пример с не потоковыми данными

Можно указать что данные не потоковые, тогда значения будут передаваться поэлементно в метод Execute, пример:
[InputsCount(2)]
[Input(0, TemplateTypes.DOUBLE, true, "list1")]
[Input(1, TemplateTypes.DOUBLE, true, "list2")]

using System.Collections.Generic; using TSLab.Script.Handlers; namespace MyLib { [HandlerCategory("MyLib")] [HandlerName("TestPrecalc2")] [InputsCount(2)] [Input(0, TemplateTypes.DOUBLE, true, "list1")] [Input(1, TemplateTypes.DOUBLE, true, "list2")] [OutputsCount(1)] [OutputType(TemplateTypes.DOUBLE)] public class TestPrecalc2 : IValuesHandlerWithPrecalc { public void PreCalc() { // Выполняется до расчетов } public double Execute(double value1, double value2, int i) { // Метод расчета, параметр i перебирается от 0 до n баров return 0; } public void PostCalc() { // Выполняется после расчетов } } }

Обратите внимание, что теперь в метод PreCalc ничего не передается.

Особенность индикатора с одним списком данных

Если у индикатора только один входящий список данных, то он может работать только с потоковыми данными и метода PostCalc не будет.

using System.Collections.Generic; using TSLab.Script.Handlers; namespace MyLib { [HandlerCategory("MyLib")] [HandlerName("TestPrecalc3")] [InputsCount(1)] [Input(0, TemplateTypes.DOUBLE, false, "list1")] [OutputsCount(1)] [OutputType(TemplateTypes.DOUBLE)] public class TestPrecalc3 : IValuesHandlerWithPrecalc { public void PreCalc(IList<double> list1) { // Выполняется до расчетов } public double Execute(double value1, int i) { // Метод расчета, параметр i перебирается от 0 до n баров return 0; } } }