using System;
using System.Collections.Generic;
using System.ComponentModel;
using TSLab.DataSource;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Handlers.Options;
using static GanovCubes.FileLogger;
namespace GanovCubes
{
#region CubeDescription
[Obsolete]
[HandlerCategory("Ganov Cubes. Filters")]
[HandlerName("IsReadyForTrade", Language = "ru-ru")]
[Description("Кубик предназначен для контроля готовности инструмента к реальным торгам. В режиме лаборатории всегда выдает True")]
[HelperLink("http://forum.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=87076&page=1", "Страница на форуме TSLab", "ru-ru")]
[InputsCount(1)]
[Input(0, TemplateTypes.SECURITY, Name = "Sec")]
[OutputsCount(1)]
[OutputType(TemplateTypes.BOOL)]
#endregion
public class IsReadyForTrade : IStreamHandler, ISecurityInput0, IBar2BoolsHandler, IBooleanReturns, IContextUses
{
#region Propeties
public IContext Context { set; get; }
///
/// IsRealTime
///
[HandlerParameter(true, "true", NotOptimized = false, Name = "IsRealTime", IsVisibleInBlock = false)]
[Description("Контролирует находится ли агент скрипт в режиме агента")]
public bool IsRealTime { get; set; }
///
/// IsPortfolioReady
///
[HandlerParameter(true, "true", NotOptimized = false, Name = "IsPortfolioReady", IsVisibleInBlock = false)]
[Description("Контролирует подготовлены ли данные по инструменту, то есть получены ли все позиции от брокера" +
" и отображены в окне \"Позиции\"")]
public bool IsPortfolioReady { get; set; }
///
/// IsConnected
///
[HandlerParameter(true, "true", NotOptimized = false, Name = "IsConnected", IsVisibleInBlock = false)]
[Description("Контролирует подключен ли коннектор счета, по которому торгуется инструмент на входе в кубик")]
public bool IsConnected { get; set; }
///
/// IsDataReady
///
[HandlerParameter(true, "true", NotOptimized = false, Name = "IsDataReady", IsVisibleInBlock = false)]
[Description("Контролирует подгружены ли все необходимые данные по торгуемому инструменту")]
public bool IsDataReady { get; set; }
///
/// AreCandlesExists
///
[HandlerParameter(true, "true", NotOptimized = false, Name = "AreCandlesExists", IsVisibleInBlock = false)]
[Description("Контролирует имеются ли свечи по данному инструменту. Фактически причиной отсутствия свечей может быть как" +
" отсутствие их загрузки от брокера, так и неверные настройки скрипта (ограничено на ноль баров, \"дата от\" больше \"дата к\" и т.д., то " +
" есть фактически проверяется, чтобы кол-во баров в агенте было больше нуля")]
public bool AreCandlesExists { get; set; }
///
/// IsLastBarDateTimeCorrect
///
[HandlerParameter(true, "true", NotOptimized = false, Name = "IsLastBarDateTimeCorrect", IsVisibleInBlock = false)]
[Description("Контролирует, что принятое с сервера время не более, чем на 1 используемый тайм-фрейм расходится с временем последнего бара")]
public bool IsLastBarDateTimeCorrect { get; set; }
///
/// Писать данные в лог
///
[HandlerParameter(true, "false", NotOptimized = false, Name = "Писать данные в лог", IsVisibleInBlock = false)]
[Description("При установленной опции все контролируемые параметры будут записаны в лог на каждом пересчете, что позволяет отследить работу" +
" кубика в динамике. По умолчанию отключено. Лог пишется в файл по адресу: " + @"C:\Users\UserName\AppData\Local\TSLab\TSLab 2.0\DataStorage\Logs\")]
public bool WriteToLog { get; set; }
#endregion
public IList Execute(ISecurity sec)
{
if (!Context.Runtime.IsAgentMode) return Context.GetValueTypeCollection(true, Context.BarsCount);
var lastBarNum = Context.SetLastBarNum();
var connect = sec.SecurityDescription.TradePlace.DataSource as IConnectable;
var isConnected = connect?.IsConnected ?? false;
var isReady = connect?.IsReady ?? false;
/* ТФ умножается на 2, то есть 60*2=120 потому как в ТСЛаб время - это время начало свечи и когда в ТСлаб получено
время начало свечи, то фактическое серверное время будет уже начало свечи + ТФ, например, если время начала свечи 19.41
и ТФ 1 минута, то время в платформе будет 19.42, то есть фактически пока не закрыта текущая свеча, то нет возможности
проконтролировать ее время, таким образом контролируется, чтобы время последней свечи было не больше, чем 2ТФ. Если же
время последней свечи будет больше, чем 2ТФ, то это говорит о том, что есть проблемы и предполагаемая последняя свеча
не пришла в ТСЛаб*/
var diffSecondsAcceptable = sec.MinutesInSecBaseInterval() * 120;
var isReadyForTrade = true &&
(!IsRealTime || sec.IsRealtime) &&
(!IsPortfolioReady || sec.IsPortfolioReady) &&
(!IsConnected || isConnected) &&
(!IsDataReady || isReady) &&
(!AreCandlesExists || sec.Bars.Count > 0) &&
(!IsLastBarDateTimeCorrect || sec.Bars[lastBarNum].Date > connect.ServerTime.AddSeconds(-diffSecondsAcceptable));
if (WriteToLog)
LogDebug($"Вывод данных кубика \"IsReadyForTrade\"" +
$"\nisReadyForTrade: {isReadyForTrade}" +
$"\nIsRealTime: {sec.IsRealtime}" +
$"\nIsPortfolioReady: {sec.IsPortfolioReady}" +
$"\nIsConnected: {isConnected}" +
$"\nIsReady: {isReady}" +
$"\nAreCandlesExists: {sec.Bars.Count > 0}" +
$"\nIsLastBarDateTimeCorrect: {sec.Bars[lastBarNum].Date > connect.ServerTime.AddSeconds(-diffSecondsAcceptable)}, LastBarDT: {sec.Bars[lastBarNum].Date}, ServerDT {connect.ServerTime}," +
$" DiffSeconds {(connect.ServerTime - sec.Bars[lastBarNum].Date).TotalSeconds}, DiffSecondsAcceptable {diffSecondsAcceptable}," +
$" AcceptableCandleTime {connect.ServerTime.AddSeconds(-diffSecondsAcceptable)}");
return Context.GetValueTypeCollection(isReadyForTrade, Context.BarsCount);
}
}
}