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