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