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;
}
}
}