Beispiel #1
0
        private ImmutableArray <OrderbookPosition> Aggregate(AggregateOrderbookSettings settings,
                                                             ImmutableArray <OrderbookPosition> positions)
        {
            if (settings.AsIsLevelsCount >= positions.Length)
            {
                return(positions);
            }

            var r = _system.GetRandom();
            var aggregatedLevels = new Stack <decimal>(settings.CumulativeVolumeLevels.Reverse()
                                                       .Select(n => n * (1 + ((decimal)r.NextDouble() - 0.5m) * settings.RandomFraction)));
            var result = ImmutableArray.CreateBuilder <OrderbookPosition>(settings.AsIsLevelsCount
                                                                          + aggregatedLevels.Count);

            result.AddRange(positions.Take(settings.AsIsLevelsCount));

            var prevLevelCumulativeVolume = result.Sum(p => p.Volume);

            if (!TryGetNewLimit(aggregatedLevels, prevLevelCumulativeVolume, out var currentLimit))
            {
                return(result.ToImmutable());
            }

            var currentVolume    = 0m;
            var cumulativeVolume = prevLevelCumulativeVolume;

            foreach (var position in positions.Skip(settings.AsIsLevelsCount))
            {
                cumulativeVolume += position.Volume;
                currentVolume    += position.Volume;
                if (cumulativeVolume >= currentLimit)
                {
                    result.Add(new OrderbookPosition(position.Price, currentVolume));
                    prevLevelCumulativeVolume = cumulativeVolume;
                    currentVolume             = 0;
                    if (!TryGetNewLimit(aggregatedLevels, prevLevelCumulativeVolume, out currentLimit))
                    {
                        break;
                    }
                }
            }

            return(result.ToImmutable());
        }
Beispiel #2
0
            private void Validate(AggregateOrderbookSettings aggregateOrderbookSettings)
            {
                aggregateOrderbookSettings.RequiredNotNull("aggregateOrderbookSettings for pair " + _assetPairId);
                aggregateOrderbookSettings.AsIsLevelsCount.RequiredNotLessThan(0,
                                                                               "aggregateOrderbookSettings.AsIsLevelsCount for pair " + _assetPairId);
                var assetPairId = _assetPairId;

                aggregateOrderbookSettings.CumulativeVolumeLevels.RequiredAll(v =>
                                                                              v.RequiredGreaterThan(0,
                                                                                                    "aggregateOrderbookSettings.CumulativeVolumeLevels for pair " + assetPairId));
                aggregateOrderbookSettings.RandomFraction.RequiredBetween(0, 0.5m,
                                                                          "aggregateOrderbookSettings.RandomFraction for pair " + _assetPairId);

                if (aggregateOrderbookSettings.AsIsLevelsCount == 0 &&
                    aggregateOrderbookSettings.CumulativeVolumeLevels.IsEmpty)
                {
                    throw new ArgumentException("Either AsIsLevelsCount or CumulativeVolumeLevels should be filled",
                                                "aggregateOrderbookSettings for pair " + _assetPairId);
                }
            }