protected override ITradeStatisticsWithKind InternalExecute(ISecurity security)
        {
            var           timeFrame = TimeFrameFactory.Create(TimeFrame, TimeFrameUnit);
            int           topTimeFrameNumber;
            TimeFrameUnit topTimeFrameUnit;
            TimeSpan      topTimeFrame;

            if (UseTopTimeFrame)
            {
                topTimeFrameNumber = TopTimeFrame;
                topTimeFrameUnit   = TopTimeFrameUnit;
                topTimeFrame       = TimeFrameFactory.Create(topTimeFrameNumber, topTimeFrameUnit);

                if (topTimeFrame.Ticks % timeFrame.Ticks != 0)
                {
                    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;

                default:
                    throw new InvalidEnumArgumentException(nameof(TimeFrameUnit), (int)TimeFrameUnit, TimeFrameUnit.GetType());
                }
                topTimeFrameNumber = topTimeFrameNumber / TimeFrame * TimeFrame;
                topTimeFrameUnit   = TimeFrameUnit;
                topTimeFrame       = TimeFrameFactory.Create(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, timeFrame, TimeFrameUnit, topTimeFrame));

            return(new TradeStatisticsWithKind(tradeStatistics, Kind, WidthPercent));
        }
        protected override ITradeStatisticsWithKind InternalExecute(ISecurity security)
        {
            var timeFrame      = TimeFrameFactory.Create(TimeFrame, TimeFrameUnit);
            var timeFrameShift = TimeFrameFactory.Create(TimeFrameShift, TimeFrameShiftUnit);
            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, timeFrame, TimeFrameUnit, timeFrameShift, TimeFrameShiftUnit));

            return(new TradeStatisticsWithKind(tradeStatistics, Kind, WidthPercent));
        }
Esempio n. 3
0
        public IList <double> Execute(ISecurity security)
        {
            if (security == null)
            {
                throw new ArgumentNullException(nameof(security));
            }

            if (TimeFrame <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(TimeFrame));
            }

            var timeFrame = TimeFrameFactory.Create(TimeFrame, TimeFrameUnit);

            var bars = security.Bars;

            if (bars.Count == 0)
            {
                return(EmptyArrays.Double);
            }

            if (bars.Count == 1)
            {
                return new[] { bars[0].Volume }
            }
            ;

            DateTime firstDateTime, lastDateTime;

            TimeFrameUtils.GetFirstBounds(timeFrame, bars[0].Date, out firstDateTime, out lastDateTime);
            var results = Context?.GetArray <double>(bars.Count) ?? new double[bars.Count];

            for (int i = 0, firstIndex = 0; i <= results.Length; i++)
            {
                if (i == results.Length || bars[i].Date >= lastDateTime)
                {
                    var count = i - firstIndex;
                    if (count > 0)
                    {
                        var result = 0D;
                        switch (ValueMode)
                        {
                        case ValueForPeriodMode.Sum:
                            for (int j = 0, index = firstIndex; j < count; j++, index++)
                            {
                                result        += GetValue(security, index);
                                results[index] = result;
                            }
                            break;

                        case ValueForPeriodMode.Average:
                            for (int j = 0, index = firstIndex; j < count; j++, index++)
                            {
                                result        += GetValue(security, index);
                                results[index] = result / (j + 1);
                            }
                            break;

                        default:
                            throw new InvalidEnumArgumentException(nameof(ValueMode), (int)ValueMode, ValueMode.GetType());
                        }
                    }
                    if (i == results.Length)
                    {
                        break;
                    }

                    TimeFrameUtils.GetBounds(timeFrame, bars[i].Date, ref firstDateTime, ref lastDateTime);
                    firstIndex = i;
                }
            }
            return(results);
        }
        public ISecurity Execute(ISecurity security)
        {
            var timeFrame = TimeFrameFactory.Create(TimeFrame, TimeFrameUnit);

            return(new AlignedSecurity(security, timeFrame));
        }