Пример индикатора

using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using TSLab.Script; using TSLab.Script.Handlers; using TSLab.Script.Handlers.Options; using TSLab.Script.Helpers; namespace MyLib { [HandlerCategory("MyLib")] [HelperName("Middle channel", Language = Constants.En)] [HelperName("Середина канала", Language = Constants.Ru)] [InputsCount(1)] [Input(0, TemplateTypes.SECURITY, Name = "SECURITYSource")] [OutputsCount(1)] [OutputType(TemplateTypes.DOUBLE)] [Description("Рассчитывает середину канала как (Highest + Lowest) / 2.")] [HelperDescription("Calculates the middle of the channel as (Highest + Lowest) / 2.", Constants.En)] public class MiddleChannel : IBar2DoubleHandler, IContextUses { public IContext Context { get; set; } [Description("Период индикатора")] [HandlerParameter(true, "20", Min = "10", Max = "100", Step = "5", EditorMin = "1")] [HelperDescription("Indicator period", Constants.En)] [HelperName("Period", Constants.En)] [HelperName("Период", Constants.Ru)] public int Period { get; set; } public IList<double> Execute(ISecurity source) { // Вычисляем максимумы и минимумы // Используем GetData для кеширования данных и ускорения оптимизации var high = Context.GetData("Highest", new[] { Period.ToString() }, () => Series.Highest(source.GetHighPrices(Context), Period)); var low = Context.GetData("Lowest", new[] { Period.ToString() }, () => Series.Lowest(source.GetLowPrices(Context), Period)); // Расчет значений var list = new double[source.Bars.Count]; for (int i = 0; i < list.Length; i++) { list[i] = (high[i] + low[i]) / 2; } return list; } } }