AlexGanov Posted February 8, 2021 Share Posted February 8, 2021 (edited) В данном разделе размещены кубики, выполненные пользователями ТСЛаб. Кубики размещены as is, то есть автор провел определенное тестирование, но не гарантирует работоспособность во всех случаях применения Правила: -- каждый кубик выкладывается в новую ветку с описанием функционала и целей применения -- кубик распространяется свободно, то есть бесплатно, любое желающий может воспользоваться, в том числе изменить код кубика для личных целей -- в случае выявления ошибок и/или наличия предложений, они (ошибки, предложения и т.д.) указываются в ветке соответствующего кубика, автор кубика по наличию времени и желания дорабатывает замечания и выкладывает новую версию кубика Edited February 8, 2021 by AlexGanov Quote Link to comment Share on other sites More sharing options...
AlexGanov Posted February 9, 2021 Author Share Posted February 9, 2021 (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, 2021 by AlexGanov 1 Quote Link to comment Share on other sites More sharing options...
AlexGanov Posted February 9, 2021 Author Share Posted February 9, 2021 Дополнительная информация: побарный (не потоковый) кубик: https://docs.tslab.pro/pages/viewpage.action?pageId=38961293 папка Handlers и создание индикаторов на API: https://docs.tslab.pro/pages/viewpage.action?pageId=20185716 Quote Link to comment Share on other sites More sharing options...
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.