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