protected override ITradeStatisticsWithKind InternalExecute(ISecurity security) { var interval = TimeFrameFactory.GetInterval(TimeFrame, TimeFrameUnit); var intervalShift = TimeFrameShift > 0 ? TimeFrameFactory.GetInterval(TimeFrameShift, TimeFrameShiftUnit) : null; var runTime = Context.Runtime; var id = runTime != null ? string.Join(".", runTime.TradeName, runTime.IsAgentMode, VariableId) : VariableId; var stateId = string.Join(".", security.Symbol, security.Interval, security.IsAligned, CombinePricesCount, TimeFrameKind, TimeFrame, TimeFrameUnit, TimeFrameShift, TimeFrameShiftUnit); var tradeStatistics = Context.GetTradeStatistics(stateId, () => new LastTradeStatistics(id, stateId, GetTradeHistogramsCache(security), TimeFrameKind, TimeFrameUnit, TimeFrameShiftUnit, interval, intervalShift)); return(new TradeStatisticsWithKind(tradeStatistics, Kind, WidthPercent)); }
protected override ITradeStatisticsWithKind InternalExecute(ISecurity security) { var interval = TimeFrameFactory.GetInterval(TimeFrame, TimeFrameUnit); int topTimeFrameNumber; TimeFrameUnit topTimeFrameUnit; Interval topInterval; if (UseTopTimeFrame) { topTimeFrameNumber = TopTimeFrame; topTimeFrameUnit = TopTimeFrameUnit; topInterval = TimeFrameFactory.GetInterval(topTimeFrameNumber, topTimeFrameUnit); if (topInterval.ToSeconds() % interval.ToSeconds() != 0 && !(topInterval.Base == DataIntervals.MONTHS && interval.Base == DataIntervals.WEEKS)) { throw new InvalidOperationException(string.Format( RM.GetString("TopTimeFrameMustBeDivisableByTimeFrame"), ToString(TopTimeFrame, topTimeFrameUnit), ToString(TimeFrame, TimeFrameUnit))); } } else { var maxTimeSpan = TimeSpan.FromSeconds(int.MaxValue); switch (TimeFrameUnit) { case TimeFrameUnit.Second: topTimeFrameNumber = (int)maxTimeSpan.TotalSeconds; break; case TimeFrameUnit.Minute: topTimeFrameNumber = (int)maxTimeSpan.TotalMinutes; break; case TimeFrameUnit.Hour: topTimeFrameNumber = (int)maxTimeSpan.TotalHours; break; case TimeFrameUnit.Day: topTimeFrameNumber = (int)maxTimeSpan.TotalDays; break; case TimeFrameUnit.Week: topTimeFrameNumber = (int)maxTimeSpan.TotalDays / 7; break; case TimeFrameUnit.Month: topTimeFrameNumber = (int)maxTimeSpan.TotalDays / 30; break; default: throw new InvalidEnumArgumentException(nameof(TimeFrameUnit), (int)TimeFrameUnit, TimeFrameUnit.GetType()); } topTimeFrameNumber = topTimeFrameNumber / TimeFrame * TimeFrame; topTimeFrameUnit = TimeFrameUnit; topInterval = TimeFrameFactory.GetInterval(topTimeFrameNumber, topTimeFrameUnit); } var runTime = Context.Runtime; var id = runTime != null ? string.Join(".", runTime.TradeName, runTime.IsAgentMode, VariableId) : VariableId; var stateId = string.Join(".", security.Symbol, security.Interval, security.IsAligned, CombinePricesCount, TimeFrameKind, TimeFrame, TimeFrameUnit, topTimeFrameNumber, topTimeFrameUnit); var tradeStatistics = Context.GetTradeStatistics(stateId, () => new TradeStatistics(id, stateId, GetTradeHistogramsCache(security), TimeFrameKind, TimeFrameUnit, interval, topInterval, StartTime)); return(new TradeStatisticsWithKind(tradeStatistics, Kind, WidthPercent)); }