using System; using System.ComponentModel; using GanovCubes; using TSLab.Script; using TSLab.Script.Handlers; using static TSLab.Script.ScriptColors; namespace CubesLib { #region CubeDescription [Obsolete] [HandlerCategory("Ganov Cubes. Graphs")] [HandlerName("TradesDistribution", Language = "ru-ru")] [Description("Кубик строит гистограмму распределения доходности сделок исходя из дохода по каждой сделке в процентах. По оси \"х\" отложены " + " доходности сделок, по оси \"Y\" - частота повторения доходности соответствующей величины (диапазона величины).")] [InputsCount(1)] [Input(0, TemplateTypes.SECURITY, Name = "Sec")] [OutputsCount(0)] #endregion public class TradesDistribution : IValuesHandler, IContextUses, ISecurityInput0 { #region Fileds int _lastBarNumber; #endregion #region Properties public IContext Context { set; get; } /// /// ID /// [HandlerParameter(true, "1", NotOptimized = true, Name = "ID", IsVisibleInBlock = false)] [Description("По умолчанию устанавливается единица. В случае если необходимо вывести несколько распределений с разных инструментов, то будет конфликт названий объектов. К сожалению," + " в ТСЛаб нет метода контекста, чтобы получить коллекцию открытых дополнительных окон и автоматически добавить другой ID, поэтому придется контролировать данный процесс вручную" + " посредством текущей настройки")] public ulong ID { get; set; } = 1; /// /// Количество баров гистрограммы распределения доходности /// [HandlerParameter(true, "100", NotOptimized = true, Name = "Количество баров гистограммы распределения доходности", IsVisibleInBlock = false)] [Description("Данная опция задает количество баров гистограммы (столбиков), по умолчанию стоит 100. Однако в некоторых случаях потребуется \"поиграться\" данным значением для корректного отображения" + " данных, например, если хочется большей дискретизации значений по группам (большего кол-ва баров). Максимальное кол-во баров в методе построения гистограммы равно 200, то есть если даже указать" + " бОльшее значение, то в любом случае выведется только 200 баров")] public ulong HistogramBars { get; set; } = 100; /// /// Цвет баров гистограммы распределения доходности /// [HandlerParameter(true, "Black", NotOptimized = true, Name = "Цвет баров гистограммы распределения доходности", IsVisibleInBlock = false)] [Description("Цвет баров гистограммы на случай использования темной темы, по умолчанию гисрограмма строится черным цветом, но если включена черная тема, то данных построения не будет видно." + " Данная настройка позволяет менять цвет построения, например, на желтый.")] public GraphicColor HistogramBarsColor { get; set; } = GraphicColor.Black; #endregion public void Execute(ISecurity sec, int bar) { if (bar == 0) _lastBarNumber = Context.SetLastBarNum(); if (bar == _lastBarNumber) { var tradesDistr = Context.GetProfitPctDistribution(sec); Context.PlotDistributionHistogram($"TradesDistibution_{(uint)ID}", "TradesDistibution", tradesDistr.ProfitPct, tradesDistr.Frequency, (uint)HistogramBars, HistogramBarsColor.GetColor(), yAxisPrecision: 0); } } } /// /// Цвета элементов графика /// public enum GraphicColor { Black, Blue, Green, YellowGreen, Yellow, Red } /// /// Вспомогательный класс для методов-расширений /// public static class ServiceFunction { /// /// Метод получается необходимый цвет элемента графика /// /// Выбранный цвет public static Color GetColor(this GraphicColor color) { return color switch { GraphicColor.Black => Black, GraphicColor.Blue => Blue, GraphicColor.Green => Green, GraphicColor.Yellow => Yellow, GraphicColor.YellowGreen => YellowGreen, GraphicColor.Red => Red, _ => Black }; } } }