/// <summary> /// Event handler for streaming quote ticks /// </summary> /// <param name="quote">The data object containing the received tick</param> private void OnQuoteReceived(IStreamQuote quote) { Symbol symbol; if (!_subscribedSymbols.TryGetValue(quote.Symbol, out symbol)) { return; } var time = quote.Time; // live ticks timestamps must be in exchange time zone DateTimeZone exchangeTimeZone; if (!_symbolExchangeTimeZones.TryGetValue(key: symbol, value: out exchangeTimeZone)) { exchangeTimeZone = _marketHours.GetExchangeHours(Market.USA, symbol, SecurityType.Equity).TimeZone; _symbolExchangeTimeZones.Add(symbol, exchangeTimeZone); } time = time.ConvertFromUtc(exchangeTimeZone); var bidPrice = quote.BidPrice; var askPrice = quote.AskPrice; var tick = new Tick(time, symbol, bidPrice, bidPrice, askPrice) { TickType = TickType.Quote, BidSize = quote.BidSize, AskSize = quote.AskSize }; lock (_ticks) { _ticks.Add(tick); } }
private async Task SubscriptionResult_Received(IStreamQuote obj) { if (CheckIfLastMessageIsOldEnough(obj)) { await _hub.Clients.All.StockUpdate(new StockChangedResponse { Symbol = obj.Symbol, Price = obj.AskPrice }); await UpdateStockPrice(obj.Symbol, obj.AskPrice); } }
private bool CheckIfLastMessageIsOldEnough(IStreamQuote obj) { var lastMessage = _lastBroadcastedMessages.FirstOrDefault(x => x.Key == obj.Symbol); if (lastMessage.Key == null || (DateTime.UtcNow - lastMessage.Value).Seconds > 20) { if (lastMessage.Key == null) { _lastBroadcastedMessages.Add(obj.Symbol, DateTime.UtcNow); } else { _lastBroadcastedMessages.Remove(lastMessage.Key); _lastBroadcastedMessages.Add(obj.Symbol, obj.TimeUtc); } return(true); } return(false); }