Индикатор расчета спреда двух инструментов

Индикатор считает спред двух инструментов по формуле (K1 * sec1 - K2 * sec2). Возвращает новый инструмент. Показан пример работы метода sec.CloneAndReplaceBars(bars).

using System;
using System.ComponentModel;
using TSLab.DataSource;
using TSLab.Script;
using TSLab.Script.Handlers;

namespace MyLib_net.Handlers
{
    [HandlerCategory("MyLib")]
    [HandlerName("Spread")]
    [InputsCount(2)]
    [Input(0, TemplateTypes.SECURITY, Name = "SECURITYSource")]
    [Input(1, TemplateTypes.SECURITY, Name = "SECURITYSource")]
    [OutputsCount(1)]
    [OutputType(TemplateTypes.SECURITY)]
    [Description("Считает спред двух инструментов по формуле (K1 * sec1 - K2 * sec2)." +
        "Возвращает новый инструмент.")]
    public class Spread : IStreamHandler
    {
        [HandlerParameter(true, "1")]
        public double K1 { get; set; }

        [HandlerParameter(true, "1")]
        public double K2 { get; set; }

        public ISecurity Execute(ISecurity sec1, ISecurity sec2)
        {
            // Получаем нужные данные
            var bars1 = sec1.Bars;
            var closePrices = sec1.ClosePrices;
            var highPrices = sec1.HighPrices;
            var lowPrices = sec1.LowPrices;
            var openPrices = sec1.OpenPrices;
            var closePrices2 = sec2.ClosePrices;
            var highPrices2 = sec2.HighPrices;
            var lowPrices2 = sec2.LowPrices;
            var openPrices2 = sec2.OpenPrices;

            // Создаем пустой массив в котором будут новые бары
            var barsNew = new DataBar[closePrices.Count];

            for (int i = 0; i < closePrices.Count; i++)
            {
                // Считаем для каждого бара новые Open, Low, High, Close
                var open = K1 * openPrices[i] - K2 * openPrices2[i];
                var high = K1 * highPrices[i] - K2 * highPrices2[i];
                var low = K1 * lowPrices[i] - K2 * lowPrices2[i];
                var close = K1 * closePrices[i] - K2 * closePrices2[i];
                low = Math.Min(Math.Min(open, low), Math.Min(high, close));
                high = Math.Max(Math.Max(open, low), Math.Max(high, close));
                
                // Создаем новый бар и помещаем в массив.
                barsNew[i] = new DataBar(bars1[i].Date, open, high, low, close);
            }
            
            // Клонируем инструмент в котором бары будут из нашего списка.
            return sec1.CloneAndReplaceBars(barsNew);
        }
    }

}

Last updated