using System.Collections.Generic; using System.ComponentModel; using TSLab.Script; using TSLab.Script.Handlers; using TSLab.Script.Handlers.Options; namespace GanovCubes { public enum RiskDataType { InitRiskLong, InitRiskShort, InitReserveLong, InitReserveShort } #region CubeDescription [HandlerCategory("Ganov Cubes. MarketData")] [HelperName("TicketRiskData ", Language = "ru-RU")] [Description("Кубик принимает данные с кубика \"FinamRiskData\" по конкретному тикету (инструменту), который подается на вход кубика. В случае если в исходных данных отсутствует" + " информация по инструменту, то кубик выдает -1. Кубик работает только в режиме агента. В режиме лаборатории на выходе всегда ноль")] [HelperLink("http://forum.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=87071&page=1", "Страница на форуме TSLab", "ru-ru")] [InputsCount(1)] [Input(0, TemplateTypes.SECURITY, Name = "Sec")] [OutputsCount(1)] [OutputType(TemplateTypes.DOUBLE)] #endregion public class TicketRiskData : IStreamHandler, ISecurityInput0, IDoubleReturns, IContextUses { #region Properties public IContext Context { get; set; } /// /// Тип риск-данных /// [HandlerParameter(true, "InitRiskLong", NotOptimized = false, Name = "Тип риск-данных", IsVisibleInBlock = false)] [Description("Тип необходимых риск-данных по инструменту")] public RiskDataType RiskType { get; set; } #endregion public IList Execute(ISecurity sec) { IList retValue = Context.GetArray(Context.BarsCount); if (!Context.Runtime.IsAgentMode) return retValue; return GetTickerData(sec); } /// /// Метод получает данные по риску по конкретному инструменту /// /// Данные по выбранному риск-параметру private IList GetTickerData(ISecurity sec) { IList retValue = Context.GetArray(Context.BarsCount); var cacheData = Context.LoadGlobalObject("FinamMinRisk", true); bool secRiskDataNotFound = true; if (cacheData != null && cacheData is Dictionary riskData) foreach (var item in riskData) { if (item.Key.ToLower() == sec.FinInfo.Security.Id.ToLower()) { var secRiskData = RiskType switch { RiskDataType.InitRiskLong => item.Value[0], RiskDataType.InitRiskShort => item.Value[1], RiskDataType.InitReserveLong => item.Value[2], _ => item.Value[3] }; retValue = Context.GetValueTypeCollection(double.Parse(secRiskData), Context.BarsCount); secRiskDataNotFound = false; break; } } if (secRiskDataNotFound) retValue = Context.GetValueTypeCollection(-1d, Context.BarsCount); return retValue; } } }