public SymbolViewModel(Exchange exchange, IWpfExchangeService exchangeService, IChartHelper chartHelper, IOrderBookHelper orderBookHelper, ITradeHelper tradeHelper, Preferences preferences, ILoggerFacade logger) : base(exchangeService, logger) { this.exchange = exchange; this.orderBookHelper = orderBookHelper; this.tradeHelper = tradeHelper; TradeLimit = preferences.TradeLimit; TradesDisplayCount = preferences.TradesDisplayCount; TradesChartDisplayCount = preferences.TradesChartDisplayCount; ShowAggregateTrades = preferences.ShowAggregateTrades; OrderBookLimit = preferences.OrderBookLimit; OrderBookDisplayCount = preferences.OrderBookDisplayCount; OrderBookChartDisplayCount = preferences.OrderBookChartDisplayCount; TimeFormatter = chartHelper.TimeFormatter; PriceFormatter = chartHelper.PriceFormatter; symbolCancellationTokenSource = new CancellationTokenSource(); OnPropertyChanged(string.Empty); }
public override async Task OrderNotificationsAsync(List <StrategyNotification> orderNotifications) { if (orderNotifications == null) { throw new ArgumentNullException(nameof(orderNotifications)); } if (cancellationTokenSource.IsCancellationRequested) { return; } await orderBookSemaphoreSlim.WaitAsync(cancellationTokenSource.Token).ConfigureAwait(true); try { if (cancellationTokenSource.IsCancellationRequested) { return; } if (Symbols != null) { IsLoadingOrderBook = false; var orderBookDisplayCount = Strategy.OrderBookDisplayCount; var orderBookChartDisplayCount = Strategy.OrderBookChartDisplayCount; if (OrderBook == null) { var orderBookNotification = orderNotifications.Last(); var ob = JsonConvert.DeserializeObject <TradeView.Core.Model.OrderBook>(orderBookNotification.Message); var orderBookHelper = orderBookHelperFactory.GetOrderBookHelper(ob.Exchange); var symbol = Symbols.First(s => s.ExchangeSymbol.Equals(ob.Symbol, StringComparison.Ordinal)); var pricePrecision = symbol.PricePrecision; var quantityPrecision = symbol.QuantityPrecision; OrderBook = await orderBookHelper.CreateLocalOrderBook(symbol, ob, orderBookDisplayCount, orderBookChartDisplayCount).ConfigureAwait(true); } else { bool first = true; IOrderBookHelper orderBookHelper = null; Symbol symbol = null; int quantityPrecision; int pricePrecision; var orderBookUpdates = new List <TradeView.Core.Model.OrderBook>(); foreach (var notification in orderNotifications) { var ob = JsonConvert.DeserializeObject <TradeView.Core.Model.OrderBook>(notification.Message); if (first) { orderBookHelper = orderBookHelperFactory.GetOrderBookHelper(ob.Exchange); symbol = Symbols.First(s => s.ExchangeSymbol.Equals(ob.Symbol, StringComparison.Ordinal)); quantityPrecision = symbol.QuantityPrecision; pricePrecision = symbol.PricePrecision; } orderBookUpdates.Add(ob); } var newOrderBookUpdates = orderBookUpdates .OrderBy(ob => ob.LastUpdateId) .Where(ob => ob.LastUpdateId > OrderBook.LastUpdateId).ToList(); foreach (var ob in newOrderBookUpdates) { orderBookHelper.UpdateLocalOrderBook(OrderBook, ob, symbol.PricePrecision, symbol.QuantityPrecision, orderBookDisplayCount, orderBookChartDisplayCount); } } } } catch (Exception ex) { OnException($"{Strategy.Name} : OrderNotificationsAsync - {ex.Message}", ex); } finally { orderBookSemaphoreSlim.Release(); } await Task.FromResult <object>(null).ConfigureAwait(false); }