using System.Collections.Generic;
using System.ComponentModel;
using TSLab.Script.Handlers;
using TSLab.Script.Handlers.Options;
namespace GanovCubes
{
public enum MessageShowMode { FirstBar, LastBar, EveryBar }
#region СubeDescription
[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; } = MessageType.Info;
///
/// Разрешение вывода
///
[HandlerParameter(true, "true", NotOptimized = true, Name = "Разрешение вывода", IsVisibleInBlock = false)]
[Description("Выводить сообщения или не выводить (принудительный запрет на вывод при снятии опции)")]
public bool Use { get; set; } = true;
///
/// Режим вывода сообщения
///
[HandlerParameter(true, "LastBar", NotOptimized = true, Name = "Режим вывода сообщения", IsVisibleInBlock = false)]
[Description("Определяет на каком баре выводить сообщение: первый, последний, все бары")]
public MessageShowMode MessageShowMode { get; set; } = MessageShowMode.LastBar;
///
/// Выводить имя агента
///
[HandlerParameter(true, "true", NotOptimized = true, Name = "Выводить имя агента", IsVisibleInBlock = false)]
[Description("Выводить/не выводит имя агента. В качестве имя агента используется либо торговое имя скрипта (имя агента в режиме реальной" +
" торговли, либо произвольный текст, подаваемый на 3-й вход кубика. Последний случай нужен тогда, когда торговое имя агента по каким-либо" +
" причинам было сброшено (агент переименован), но прим этом необходимо, чтобы сообщения приходили с тем же именем. В этом случае на вход" +
" подаем нужное имя с кубика \"Текст\" или любого иного кубика и получаем имя агента, не зависящее от его фактического названия в ТСЛаб")]
public bool ShowAgentName { get; set; } = true;
///
/// Выводить число со входа №2
///
[HandlerParameter(true, "false", NotOptimized = true, Name = "Выводить число со входа №2", IsVisibleInBlock = false)]
[Description("В случае если опция снята, то даже при подключенном входе №2 его значение не будет выводиться в сообщение")]
public bool ShowDigitEnterTwo { get; set; } = false;
///
/// Выводить номер бара
///
[HandlerParameter(true, "false", NotOptimized = true, Name = "Выводить номер бара", IsVisibleInBlock = false)]
[Description("Выводить/не выводить номер текущего бара при выдаче сообщения в лог")]
public bool ShowBarNumber { get; set; } = false;
///
/// Выводить в общий лог
///
[HandlerParameter(true, "true", NotOptimized = true, Name = "Выводить в общий лог", IsVisibleInBlock = false)]
[Description("При установленной опции сообщение выводится в общий лог и в лог скрипта, при снятой опции сообщение выводится" +
" только в лог скрипта")]
public bool ShowInCommonLog { get; set; } = true;
///
/// Пользовательская метка (Tag)
///
[HandlerParameter(true, "Tag", NotOptimized = true, Name = "Пользовательская метка (Tag)", IsVisibleInBlock = false)]
[Description("Пользовательская метка, которая может быть использована в дальнейшем для отбора в менеджере сообщений")]
public string Tag { get; set; } = "Tag";
#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)
{
_lastBarNumber = Context.SetLastBarNum();
_dictionary = new() { { "$UserMessageTag", Tag ?? string.Empty } };
}
if (ShowAgentName) agentName = $"{(agentName == "" ? Context.Runtime.TradeName : agentName)}: ";
if (!Context.IsOptimization & Use && value && barNum <= Context.BarsCount &&
(MessageShowMode == MessageShowMode.EveryBar
|| MessageShowMode == MessageShowMode.FirstBar && barNum == 0
|| MessageShowMode == MessageShowMode.LastBar && barNum == _lastBarNumber))
Context.Log($"{agentName}{(ShowBarNumber ? $"Бар: {barNum}, " : "")}{Message}{(ShowDigitEnterTwo ? $"{num}" : "")}", Type, ShowInCommonLog, _dictionary);
}
}
}