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));
        }
示例#2
0
        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));
        }