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("InterRecalcBoolMemorizer", Language = "ru-ru")] [Description("Кубик представляет \"запоминатель\" сигналов между пересчетами. Работает в двух режимах, либо просто запоминает сигнал и переносит его на следующий пересчет, " + " либо увеличивает значение сигнала на 1 и переносит на сл.пересчет, таким образом либо осуществляется просто запоминание, либо счет количества событий." + " Значение запоминается на последнем баре, то есть если на последнем баре было True, то на следующем пересчете кубик будет выдавать 1, на следующем 2 и т.д. (в режиме счетчика)" + " будет 1. Значение, выданное на первом баре будет неизменно до окончания пересчета. Как только значение на последнем баре станет false, то на следующем пересчете кубик выдаст 0 " + " и так далее по кругу. На выходе кубик выдает тип double, то есть число, для преобразования в логическое значение необходимо использовать дополнительную формулу после кубика, например, " + " \"InterRecalcBoolMemorizer==1? true: false\". В случае если в кеше не содержится никакого значения, то возвращается ноль. Для запоминания данных кубик использует локальный кеш.")] [HelperLink("http://forum.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=87041&page=1", "Страница на форуме TSLab", "ru-ru")] [InputsCount(1)] [Input(0, TemplateTypes.BOOL, Name = "Сигнал")] [OutputsCount(1)] [OutputType(TemplateTypes.DOUBLE)] #endregion public class InterRecalcBoolMemorizer : IValuesHandlerWithNumber, IContextUses, IBooleanInput0, IDoubleReturns { #region Fields private double _retValue; private int _lastBarNumber; #endregion #region Properties public IContext Context { set; get; } /// /// Режим счетчика /// [HandlerParameter(true, "false", NotOptimized = true, Name = "Режим счетчика", IsVisibleInBlock = false)] [Description("При установке данной опции кубик будет работать в режиме счетчика, при снятой опции в режиме запоминания")] public bool CountSignals { get; set; } /// /// Доп.идентификатор /// [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ка. Кэширование на диск нужно в тех случаях, когда значение" + " должно быть восстановлено в том числе после перезагрузки ТСЛаб, например, запоминается событие отправленного сообщения, если не кэшировать на диск," + " то после перезапуска ТСЛаб по расписанию в скрипт придет информация о том, что события не было, соответственно, логика отработает неверно, т.к. будет принято false." + " По умолчанию настройка отключена, чтобы не было неверной логики там, где запоминание данных на диск не требуется и нужны лишь данные, когда агент реально" + " работает и которые теряют свою актуальность при перезагрузке системы")] public bool CashOnDisk { get; set; } #endregion public double Execute(bool value, int curBarNum) { if (curBarNum == 0) { _lastBarNumber = Context.SetLastBarNum(); var obj = Context.LoadObject($"InterRecalcBoolStorage{ID}{Context.Runtime.TradeName}", CashOnDisk); _retValue = obj is double cacheValue ? (double)cacheValue : 0; } if (curBarNum == _lastBarNumber) Context.StoreObject($"InterRecalcBoolStorage{ID}{Context.Runtime.TradeName}", value ? CountSignals || _retValue == 0 ? ++_retValue : _retValue : 0, CashOnDisk); return _retValue; } } }