public void AddAggregateTrade(AggregateTradeViewModel aggregateTrade) { AggregateTrades.Add(aggregateTrade); AggregateTrades.OrderByDescending(t => t.Time); RaisePropertyChangedEvent("AggregateTrades"); }
private void UpdateAggregateTrades(IEnumerable <Interface.AggregateTrade> trades) { lock (aggregateTradesLock) { if (AggregateTrades == null || AggregateTradesChart == null) { var orderedTrades = (from t in trades orderby t.Id select new AggregateTrade { Id = t.Id, Time = t.Time, Price = t.Price.Trim(Symbol.PricePrecision), Quantity = t.Quantity.Trim(Symbol.QuantityPrecision), IsBuyerMaker = t.IsBuyerMaker }); AggregateTradesChart = new ChartValues <AggregateTrade>(orderedTrades); Action initialiseAggregateTrades = () => { AggregateTrades = new ObservableCollection <AggregateTrade>(orderedTrades.Take(tradesDisplayLimit)); }; if (Dispatcher == null) { initialiseAggregateTrades(); } else { Dispatcher.Invoke(initialiseAggregateTrades); } } else { var maxId = AggregateTrades.Max(at => at.Id); var orderedAggregateTrades = (from t in trades where t.Id > maxId orderby t.Id select new AggregateTrade { Id = t.Id, Time = t.Time, Price = t.Price.Trim(Symbol.PricePrecision), Quantity = t.Quantity.Trim(Symbol.QuantityPrecision), IsBuyerMaker = t.IsBuyerMaker }).ToList(); var newCount = orderedAggregateTrades.Count; if (AggregateTradesChart.Count >= chartDisplayLimit) { var oldTrades = AggregateTradesChart.Take(newCount); foreach (var oldTrade in oldTrades) { AggregateTradesChart.Remove(oldTrade); } } AggregateTradesChart.AddRange(orderedAggregateTrades); Action updateAggregateTrades = () => { for (int i = 0; i < newCount; i++) { while (AggregateTrades.Count >= tradesDisplayLimit) { AggregateTrades.RemoveAt(AggregateTrades.Count - 1); } AggregateTrades.Insert(0, orderedAggregateTrades[i]); } }; if (Dispatcher == null) { updateAggregateTrades(); } else { Dispatcher.Invoke(updateAggregateTrades); } } } }