Индикатор с предварительной обработкой
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
Was this helpful?