using System; using System.ComponentModel; using GanovCubes; using TSLab.Script.Handlers; using TSLab.Script.Handlers.Options; namespace CubesLib { #region CubeDescription [Obsolete] [HandlerCategory("Ganov Cubes. Different")] [HandlerName("InterRecalcDoubleMemorizer", Language = "ru-ru")] [Description("Кубик представляет \"запоминатель\" значений между пересчетами. Значение запоминается на последнем баре, то есть если на последнем баре было 1000, то на следующем " + " пересчете кубик будет выдавать 1000. Значение, выданное на первом баре будет неизменно до окончания пересчета. Как только значение на последнем баре изменится, то на " + " следующем пересчете кубик выдаст измененное значение и так далее по кругу. В случае если в кеше не содержится никакого значения, то возвращается ноль." + " Для запоминания данных кубик использует локальный кеш. В случае если данных в кеше не оказалось (то есть кеш пустой), то кубик возвращает ноль.")] [HelperLink("http://forum.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=87041&page=1", "Страница на форуме TSLab", "ru-ru")] [InputsCount(1)] [Input(0, TemplateTypes.DOUBLE, Name = "Значение")] [OutputsCount(1)] [OutputType(TemplateTypes.DOUBLE)] #endregion public class InterRecalcDoubleMemorizer : IValuesHandlerWithNumber, IContextUses, IDoubleInput0, IDoubleReturns { #region Fields private double _retValue; private int _lastBarNumber; #endregion #region Properties public IContext Context { set; get; } /// /// Доп.идентификатор /// [HandlerParameter(true, "ID01", NotOptimized = true, Name = "Доп.идентификатор", IsVisibleInBlock = false)] [Description("Дополнительный идентификатор, используется если в одном скрипте задействовано более одного кубика \"запоминателя\", в этом случае" + " необходимо для каждого указать свой уникальный ID. В противном случае каждый кубик будет перетирать данные другого кубика при сохранении информации в кеш" + " (при одинаковых ID перетираться будут данные только однотипных \"запоминателей\", то есть данные InterRecalcDoubleMemorizer не перетираются данными" + " InterRecalcBoolMemorizer и наборот)")] public string ID { get; set; } /// /// Кешировать данные на диск /// [HandlerParameter(true, "false", NotOptimized = true, Name = "Кэшировать данные на диск", IsVisibleInBlock = false)] [Description("Настройка определяет требуется ли кэшировать данные на диск и восстанавливать их с диcка. Кэширование на диск нужно в тех случаях, когда значение" + " должно быть восстановлено в том числе после перезагрузки ТСЛаб, например, запоминается последняя дата отправленного сообщения, если не кэшировать на диск," + " то после перезапуска ТСЛаб по расписанию в скрипт придет информация с пустой датой, соответственно, логика отработает неверно, т.к. будет принято значение НОЛЬ." + " По умолчанию настройка отключена, чтобы не было неверной логики там, где запоминание данных на диск не требуется и нужны лишь данные, когда агент реально" + " работает и которые теряют свою актуальность при перезагрузке системы")] public bool CashOnDisk { get; set; } #endregion public double Execute(double value, int curBarNum) { if (curBarNum == 0) { _lastBarNumber = Context.SetLastBarNum(); var obj = Context.LoadObject($"InterRecalcDoubleMemorizer{ID}{Context.Runtime.TradeName}", CashOnDisk); _retValue = obj is double cacheValue ? (double)cacheValue : 0; } if (curBarNum == _lastBarNumber) Context.StoreObject($"InterRecalcDoubleMemorizer{ID}{Context.Runtime.TradeName}", value, CashOnDisk); return _retValue; } } }