.
Jump to content

Recommended Posts

В данном разделе размещены кубики, выполненные пользователями ТСЛаб.
Кубики размещены as is, то есть автор провел определенное тестирование, но не гарантирует работоспособность во всех случаях применения

Правила:
-- каждый кубик выкладывается в новую ветку с описанием функционала и целей применения
-- кубик распространяется свободно, то есть бесплатно, любое желающий может воспользоваться, в том числе изменить код кубика для личных целей
-- в случае выявления ошибок и/или наличия предложений, они (ошибки, предложения и т.д.) указываются в ветке соответствующего кубика, автор кубика по наличию времени и желания дорабатывает замечания и выкладывает новую версию кубика

Edited by AlexGanov
Link to post
Share on other sites

Кубик "IntervalsBetweenDates"

Периодически встает задача подсчитать конкретное кол-во дней между двумя датами. В ТСЛаб нет способа сделать это быстро, особенно учитывая формат времени ТСЛАБ в видео ГГММДД, то есть ГОД, Месяц, ДЕНЬ. Данный кубик автоматически рассчитывает необходимое кол-во интервалов между двумя датами, для чего необходимо на вход №1 подать дату начала интервала, на вход №2 - дату окончания интервала. В кубике имеется выбор необходимо интервала для расчета: дней, часов, минут. В зависимости от настройки будет выдаваться необходимо значение.

Кубик не потоковый, что говорит о том, что кубик рассчитывается в торговом цикле и оперирует конкретными значениями, а не списками значений, однако это не мешает вывести данные значения на график и обратиться к предыдущим данным через индекс, например, [i-1] или [-1], ТСЛаб достаточно умен, чтобы обыграть этот момент автоматически созданием и заполнением списка необходимых данные, которые будут рассчитаны и добавлены в данный  список на каждом баре.

Входные параметры проверяются по следующим критериям:

  1. Дата начала и дата окончания не должны быть равны нулю
  2. Дата начала и дата окончания не могут быть менее 10101, то есть 01.01.2001 года
  3. Дата начала не может быть больше даты окончания
  4. Дата начала и дата окончания не могут иметь дробные части, несмотря не то, что имеют тип Double
  5. Длина числа не может быть менее 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, чтобы не повторяться и всегда иметь "свежие" версии кода.

свойства кубика.jpg

Пример применения.jpg

gaaCommon_ServiceLib.dll gaaDifferent_IntervalsBetweenDates.dll

Edited by AlexGanov
  • Like 1
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...