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