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

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;
        }
    }
}

Last updated