AlexGanov 1 Posted February 8 Share Posted February 8 (edited) В данном разделе размещены кубики, выполненные пользователями ТСЛаб. Кубики размещены as is, то есть автор провел определенное тестирование, но не гарантирует работоспособность во всех случаях применения Правила: -- каждый кубик выкладывается в новую ветку с описанием функционала и целей применения -- кубик распространяется свободно, то есть бесплатно, любое желающий может воспользоваться, в том числе изменить код кубика для личных целей -- в случае выявления ошибок и/или наличия предложений, они (ошибки, предложения и т.д.) указываются в ветке соответствующего кубика, автор кубика по наличию времени и желания дорабатывает замечания и выкладывает новую версию кубика Edited February 8 by AlexGanov Quote Link to post Share on other sites
AlexGanov 1 Posted February 9 Author Share Posted February 9 (edited) Кубик "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 Edited February 9 by AlexGanov 1 Quote Link to post Share on other sites
AlexGanov 1 Posted February 9 Author Share Posted February 9 Дополнительная информация: побарный (не потоковый) кубик: https://docs.tslab.pro/pages/viewpage.action?pageId=38961293 папка Handlers и создание индикаторов на API: https://docs.tslab.pro/pages/viewpage.action?pageId=20185716 Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.