using System; using System.ComponentModel; using GanovCubes; using TSLab.Script.Handlers; namespace CubesLib { #region CubeDescription [Obsolete] [HandlerCategory("Ganov Cubes. Different")] [HandlerName("InterRecalcBoolMemorizer", Language = "ru-ru")] [Description("Кубик представляет \"запоминатель\" сигналов между пересчетами. Работает в двух режимах, либо просто запоминает сигнал и переносит его на следующий пересчет, " + " либо увеличивает значение сигнала на 1 и переносит на сл.пересчет, таким образом либо осуществляется просто запоминание, либо счет количества событий." + " Значение запоминается на последнем баре, то есть если на последнем баре было True, то на следующем пересчете кубик будет выдавать 1, на следующем 2 и т.д. (в режиме счетчика)" + " будет 1. Значение, выданное на первом баре будет неизменно до окончания пересчета. Как только значение на последнем баре станет false, то на следующем пересчете кубик выдаст 0 " + " и так далее по кругу. В случае если в кеше не содержится никакого значения, то возвращается ноль. Для запоминания данных кубик использует локальный кеш")] [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; } #endregion public double Execute(bool value, int curBarNum) { if (curBarNum == 0) { _lastBarNumber = Context.SetLastBarNum(); var obj = Context.LoadObject($"InterRecalcBoolStorage{ID}{Context.Runtime.TradeName}", false); _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); return _retValue; } } }