Ejemplo n.º 1
0
        public IReadOnlyList <ICandle> FillGapUpTo(AssetPair assetPair, CandlePriceType priceType, DateTime dateTime, ICandle endCandle)
        {
            var key = GetKey(assetPair.Id, priceType);

            _lastCandles.TryGetValue(key, out var lastCandle);

            if (lastCandle == null)
            {
                return(new List <ICandle>());
            }

            var lastCandleHeight = lastCandle.High - lastCandle.Low;
            var endCandleHeight  = endCandle?.High - endCandle?.Low ?? lastCandleHeight;
            var spread           = CalculateSpread(lastCandleHeight, endCandleHeight);

            var result = GenerateCandles(
                assetPair,
                priceType,
                lastCandle.Timestamp,
                dateTime,
                lastCandle.Close,
                endCandle?.Open ?? lastCandle.Open,
                spread)
                         .ToList();

            // Remember the last candle, if any
            if (result.Any())
            {
                _lastCandles[key] = Candle.Copy(result.Last());
            }

            return(result);
        }
Ejemplo n.º 2
0
        public void SetState(IImmutableDictionary <string, ICandle> state)
        {
            if (_candles.Count > 0)
            {
                throw new InvalidOperationException("Candles generator state already not empty");
            }

            _candles = new ConcurrentDictionary <string, Candle>(state.ToDictionary(
                                                                     i => i.Key,
                                                                     i => Candle.Copy(i.Value)));
        }
        public void SetState(ImmutableDictionary <string, ICandle> state)
        {
            if (_candles.Count > 0)
            {
                throw new InvalidOperationException("Candles generator state already not empty");
            }

            var keyValuePairs = state.Select(i => KeyValuePair.Create(i.Key, Candle.Copy(i.Value)));

            _candles = new ConcurrentDictionary <string, Candle>(keyValuePairs);
        }
Ejemplo n.º 4
0
        public IReadOnlyList <ICandle> FillGapUpTo(AssetPair assetPair, IFeedHistory feedHistory)
        {
            var key     = GetKey(feedHistory.AssetPair, feedHistory.PriceType);
            var candles = feedHistory.Candles
                          .Where(item => item.Low > 0 && item.High > 0 && item.Open > 0 && item.Close > 0)
                          .Select(item => item.ToCandle(feedHistory.AssetPair, feedHistory.PriceType, feedHistory.DateTime))
                          .ToList();

            _lastCandles.TryGetValue(key, out var lastCandle);

            bool removeFirstCandle;

            // Use the last candle as the first candle, if any
            if (lastCandle != null)
            {
                removeFirstCandle = true;
                candles.Insert(0, lastCandle);
            }
            else
            {
                removeFirstCandle = false;
            }

            var result = GenerateMissedCandles(assetPair, candles);

            // Remember the last candle, if any
            if (result.Any())
            {
                _lastCandles[key] = Candle.Copy(result.Last());
            }

            if (removeFirstCandle)
            {
                result.RemoveAt(0);
            }

            return(new ReadOnlyCollection <ICandle>(result));
        }