using System.Collections.Generic; using System.ComponentModel; using TSLab.Script.Handlers; using TSLab.Script.Handlers.Options; namespace CubesLib { #region СubeDesription [System.Obsolete] [HandlerCategory("Ganov Cubes. Messages")] [HandlerName("MessageAdv", Language = "ru-ru")] [HelperLink("http://forum.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=87025&page=1", "Страница на форуме TSLab", "ru-ru")] [InputsCount(3)] [Input(0, TemplateTypes.BOOL, false, "Сигнал")] [Input(1, TemplateTypes.DOUBLE, false, "Число")] [Input(2, TemplateTypes.STRING, false, "ИмяАгента")] [OutputsCount(0)] [Description("При появлении на входе блока значения True выводит в лог программы пользовательское сообщение, работает для каждого бара." + " При необходимости можно принудительно отключить вывод собщения на баре. Также можно выводить какое-либо внешнее пользовательское значение и/или" + " имя скрипта (в режиме агента - имя агента). Имя скрипта выводится только в том случае, если установлена соответсвующая опция. В случае если разрешение" + " на вывод имени скрипта установлено, но на вход №3 не подано никакое значение, то будет использовано фактическое имя скрипта/агента")] #endregion public sealed class MessageAdv : IValuesHandlerWithNumber, IContextUses { #region Fields /// /// Номер последнего бара /// int _lastBarNumber; /// /// Словарь доп.информации к сообщению /// Dictionary _dictionary; #endregion #region Properties public IContext Context { get; set; } /// /// Сообщение /// [HandlerParameter(true, "Выводимое сообщение: ", NotOptimized = true, Name = "Сообщение", IsVisibleInBlock = false)] [Description("Пользовательское сообщения для выдачи на каждом баре с учетом условия на входе")] public string Message { get; set; } /// /// Тип сообщения /// [HandlerParameter(true, "Info", NotOptimized = true, Name = "Тип сообщения", IsVisibleInBlock = false)] [Description("Тип выводимого сообщения: Debug, Info, Warning, Error")] public MessageType Type { get; set; } /// /// Разрешение вывода /// [HandlerParameter(true, "false", NotOptimized = true, Name = "Разрешение вывода", IsVisibleInBlock = false)] [Description("Выводить сообщения или не выводить (принудительный запрет на вывод при снятии опции)")] public bool Use { get; set; } /// /// Вывод только на последнем баре /// [HandlerParameter(true, "true", NotOptimized = true, Name = "Вывод только на последнем баре", IsVisibleInBlock = false)] [Description("При установленной опции выводит только на последнем баре, при снятой опции сообщение будет выводиться на каждом баре")] public bool UseOnlyOnLastBar { get; set; } /// /// Выводить имя агента /// [HandlerParameter(true, "true", NotOptimized = true, Name = "Выводить имя агента", IsVisibleInBlock = false)] [Description("Выводить/не выводит имя агента. В качестве имя агента используется либо торговое имя скрипта (имя агента в режиме реальной" + " торговли, либо произвольные текст, подаваемый на 3-й вход кубика. Последний случай нужен тогда, когда торговое имя агента по каким-либо" + " причинам было сброшено (агент переименован), но прим этом необходимо, чтобы сообщения приходили с тем же именем. В этом случае на вход" + " подаем нужное имя с кубика \"Текст\" или любого иного кубика и получаем имя агента, не зависящее от его фактического названия в ТСЛаб")] public bool ShowAgentName { get; set; } /// /// Выводить число со входа №2 /// [HandlerParameter(true, "false", NotOptimized = true, Name = "Выводить число со входа №2", IsVisibleInBlock = false)] [Description("В случае если опция снята, то даже при подключенном входе №2 его значение не будет выводиться в сообщение")] public bool ShowDigitEnterTwo { get; set; } /// /// Выводить номер бара /// [HandlerParameter(true, "false", NotOptimized = true, Name = "Выводить номер бара", IsVisibleInBlock = false)] [Description("Выводить/не выводить номер текущего бара при выдаче сообщения в лог")] public bool ShowBarNumber { get; set; } /// /// Пользовательская метка (Tag) /// [HandlerParameter(true, "Tag", NotOptimized = true, Name = "Пользовательская метка (Tag)", IsVisibleInBlock = false)] [Description("Пользовательская метка, которая может быть использована в дальнейшем для отбора в менеджере сообщений")] public string Tag { get; set; } #endregion public void Execute(bool value, int barNum) => Execute(value, 0, "", barNum); public void Execute(bool value, double num, int barNum) => Execute(value, num, "", barNum); public void Execute(bool value, string agentName, int barNum) => Execute(value, 0, agentName, barNum); public void Execute(bool value, double num, string agentName, int barNum) { if (barNum == 0) { SetLastBarNum(); _dictionary = new() { { "$UserMessageTag", Tag ?? string.Empty } }; } if (ShowAgentName) agentName = $"{(agentName == "" ? Context.Runtime.TradeName : agentName)}: "; if (!Context.IsOptimization & Use && value && barNum <= Context.BarsCount && (!UseOnlyOnLastBar || barNum == _lastBarNumber)) Context.Log($"{agentName}{(ShowBarNumber ? $"Бар: {barNum}, " : "")}{Message} {(ShowDigitEnterTwo ? $"вход: {num}" : "")}", Type, true, _dictionary); } /// /// Метод устанавливает номер последнего бара с учетом настройки "IsLastBarUsed" /// void SetLastBarNum() { _lastBarNumber = Context.BarsCount - 1; if (!Context.IsLastBarUsed) --_lastBarNumber; } } }