using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Handlers.Options;
using static GanovCubes.FileLogger;
namespace GanovCubes
{
///
/// Тип интервала пересчета метронома
///
public enum MetronomeIntervalType { Seconds, mSeconds };
#region CubeDescription
[HandlerCategory("Ganov Cubes. Different")]
[HandlerName("RandomMetronome", Language = "ru-ru")]
[Description("Метроном на базе штатного метронома, но с возможностью задавать рандомный период пересчета." +
" В случае если максимальное значение периода пересчета указано меньше, чем минимальное значение, то" +
" период пересчета будет равен минимальному значению")]
[HelperLink("http://forum.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=87237&page=1", "Страница на форуме TSLab", "ru-ru")]
[InputsCount(2)]
[Input(0, TemplateTypes.SECURITY, Name = "Security")]
[Input(1, TemplateTypes.BOOL, Name = "IsEnabled")]
[OutputsCount(0)]
#endregion
public class RandomMetronome : IStreamHandler, ISecurityInput0, IContextUses
{
public IContext Context { set; get; }
#region Properties
///
/// Тип интервала пересчета метронома
///
[HandlerParameter(true, "Seconds", NotOptimized = true, Name = "Тип интервала", IsVisibleInBlock = false)]
[Description("Настройка задает единицы измерения времени пересчета интервала: сек, мсек")]
public MetronomeIntervalType IntervalType { get; set; } = MetronomeIntervalType.Seconds;
///
/// Мин.период пересчета
///
[HandlerParameter(true, "5", NotOptimized = true, Name = "Мин.период пересчета", IsVisibleInBlock = false, Min = "1", EditorMin = "1")]
[Description("Настройка задает минимальный период пересчета в заданных единицах измерения времени")]
public int MinRecalcPeriod { get; set; } = 5;
///
/// Макс.период пересчета
///
[HandlerParameter(true, "10", NotOptimized = true, Name = "Макс.период пересчета", IsVisibleInBlock = false, Min = "1", EditorMin = "1")]
[Description("Настройка задает максимальный период пересчета в заданных единицах измерения времени")]
public int MaxRecalcPeriod { get; set; } = 10;
///
/// Вывести данные в лог
///
[HandlerParameter(true, "false", NotOptimized = false, Name = "Вывести данные в лог", IsVisibleInBlock = false)]
[Description("При установленной опции данные по работе кубика будут выведены в лог")]
public bool WriteLog { get; set; } = false;
#endregion
public void Execute(ISecurity sec, IList isEnabled)
{
var rnd = new System.Random();
var timeFactor = IntervalType == MetronomeIntervalType.Seconds ? 1000 : 1;
var recalcPeriod = rnd.Next(MinRecalcPeriod * timeFactor,
Math.Max(MinRecalcPeriod * timeFactor, MaxRecalcPeriod * timeFactor));
var metronome = new TSLab.Script.Handlers.Options.Heartbeat()
{
Context = Context,
DelayMs = recalcPeriod,
OnlyAtTradingSession = false
};
metronome.Execute(sec, isEnabled);
if (WriteLog)
{
LogDebug($"RandomMetronome. Разрешение на пересчет: {isEnabled.FirstOrDefault()}, " +
$"период пересчета: {recalcPeriod / timeFactor:F2} {(timeFactor == 1000 ? "сек" : "мсек")}");
}
}
}
}