Exemple #1
0
        protected Extremum GetExtremum(IBaseTradeStatisticsWithKind tradeStatistics, IAggregatedHistogramBarsProvider aggregatedHistogramBarsProvider, int barIndex, ref double lastPrice)
        {
            var bars = aggregatedHistogramBarsProvider.GetAggregatedHistogramBars(barIndex);

            if (bars.Count == 0)
            {
                return(new Extremum(null, double.NaN, lastPrice));
            }

            if (bars.Count == 1)
            {
                var bar = bars[0];
                return(new Extremum(bar, Math.Abs(tradeStatistics.GetValue(bar)), lastPrice = bar.AveragePrice));
            }
            IEnumerable <ITradeHistogramBar> orderedBars;

            switch (PriceMode)
            {
            case ExtremumPriceMode.Minimum:
                orderedBars = bars;
                break;

            case ExtremumPriceMode.Maximum:
                orderedBars = bars.Reverse();
                break;

            default:
                throw new InvalidEnumArgumentException(nameof(PriceMode), (int)PriceMode, PriceMode.GetType());
            }
            var extremumBar   = orderedBars.First();
            var extremumValue = Math.Abs(tradeStatistics.GetValue(extremumBar));

            foreach (var bar in orderedBars.Skip(1))
            {
                var value = Math.Abs(tradeStatistics.GetValue(bar));
                if (extremumValue < value)
                {
                    extremumBar   = bar;
                    extremumValue = value;
                }
            }
            return(new Extremum(extremumBar, extremumValue, lastPrice = extremumBar.AveragePrice));
        }
        private double GetPrice(IBaseTradeStatisticsWithKind tradeStatistics, IAggregatedHistogramBarsProvider aggregatedHistogramBarsProvider, int barIndex, double lastPrice)
        {
            var bars = aggregatedHistogramBarsProvider.GetAggregatedHistogramBars(barIndex);

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

            var allValuesSum = bars.Sum(item => Math.Abs(tradeStatistics.GetValue(item)));

            if (allValuesSum == 0)
            {
                return(lastPrice);
            }

            var trimLevelPercent = TrimLevelPercent;

            if (trimLevelPercent == 0)
            {
                return(GetFirstPrice(bars));
            }

            if (trimLevelPercent == 100)
            {
                return(GetLastPrice(bars));
            }

            var edgeValuesSum = allValuesSum * trimLevelPercent / 100;

            foreach (var bar in GetOrderedBars(bars))
            {
                var value = Math.Abs(tradeStatistics.GetValue(bar));
                if (edgeValuesSum <= value)
                {
                    var result = GetPrice(bar, edgeValuesSum / value);
                    return(result);
                }
                edgeValuesSum -= value;
            }
            return(GetLastPrice(bars));
        }