Индикатор считает спред двух инструментов по формуле (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);
}
}
}