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); }
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); }
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)); }