Кубик "IntervalsBetweenDates"
Периодически встает задача подсчитать конкретное кол-во дней между двумя датами. В ТСЛаб нет способа сделать это быстро, особенно учитывая формат времени ТСЛАБ в видео ГГММДД, то есть ГОД, Месяц, ДЕНЬ. Данный кубик автоматически рассчитывает необходимое кол-во интервалов между двумя датами, для чего необходимо на вход №1 подать дату начала интервала, на вход №2 - дату окончания интервала. В кубике имеется выбор необходимо интервала для расчета: дней, часов, минут. В зависимости от настройки будет выдаваться необходимо значение.
Кубик не потоковый, что говорит о том, что кубик рассчитывается в торговом цикле и оперирует конкретными значениями, а не списками значений, однако это не мешает вывести данные значения на график и обратиться к предыдущим данным через индекс, например, [i-1] или [-1], ТСЛаб достаточно умен, чтобы обыграть этот момент автоматически созданием и заполнением списка необходимых данные, которые будут рассчитаны и добавлены в данный список на каждом баре.
Входные параметры проверяются по следующим критериям:
Дата начала и дата окончания не должны быть равны нулю
Дата начала и дата окончания не могут быть менее 10101, то есть 01.01.2001 года
Дата начала не может быть больше даты окончания
Дата начала и дата окончания не могут иметь дробные части, несмотря не то, что имеют тип Double
Длина числа не может быть менее 5-ти символов
Во всех вышеуказанных случаях кубик будет выдавать ноль.
Код кубика:
using System;
using System.ComponentModel;
using GanovCubes;
using TSLab.Script.Handlers;
namespace CubesLib
{
public enum IntervalType { Дней, Часов, Минут };
#region CubeDescription
[Obsolete]
[HandlerCategory("Ganov Cubes. Different")]
[HandlerName("Интервалов между датами", Language = "ru-ru")]
[Description("Считает количество интервалов: Дней, Часов, Минут между датами")]
[InputsCount(2)]
[Input(0, TemplateTypes.DOUBLE, Name = "StartDate (меньшая дата)")]
[Input(1, TemplateTypes.DOUBLE, Name = "EndDate (бОльшая дата)")]
[OutputsCount(1)]
[OutputType(TemplateTypes.DOUBLE)]
#endregion
public class IntervalsBetweenDates : IContextUses, IValuesHandler
{
/// <summary>
/// Минимальная дата для тестировании на истории
/// </summary>
private const double minHistoryData = 10101; // 01.01.2001
public IContext Context { set; get; }
[HandlerParameter(true, "Дней", NotOptimized = true, Name = "Интервал", IsVisibleInBlock = true)]
[Description("Интервал: Дней, Часов, Минут")]
public IntervalType IntType { get; set; }
public double Execute() => CalculateInterval(0, 0);
public double Execute(double startDate) => CalculateInterval(startDate, 0);
public double Execute(double startDate, double endDate) => CalculateInterval(startDate, endDate);
private double CalculateInterval(double startDate, double endDate)
{
if (startDate == 0 || endDate == 0
|| startDate.ToString().Length < 5 || endDate.ToString().Length < 5
|| startDate < minHistoryData || endDate < minHistoryData
|| startDate % 1 != 0 || endDate % 1 != 0) return 0;
var dtStartDate = ((int)startDate).ConvertTSLabDateToDateTime();
var dtEndDate = ((int)endDate).ConvertTSLabDateToDateTime();
if (dtStartDate > dtEndDate) return 0;
var interval = dtEndDate - dtStartDate;
return IntType switch
{
IntervalType.Дней => interval.TotalDays,
IntervalType.Часов => interval.TotalHours,
IntervalType.Минут => interval.TotalMinutes,
_ => 0
};
}
}
}
Для корректной работы кубика необходимо в папку Handlers также поместить общую библиотеку для кубиков. Библиотека содержит методы логирования, расчета и т.д., которые применяются в разных кубиках, поэтому весь этот функционал вынесен в отдельную dll, чтобы не повторяться и всегда иметь "свежие" версии кода.
gaaCommon_ServiceLib.dll gaaDifferent_IntervalsBetweenDates.dll