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