public PortfolioData(Portfolio portfolio, IDataContext dataContext) { this._portfolio = portfolio; this._dataTable = PositionData.SchemaTable.Clone(); this._dataTable.TableName = portfolio.Id; this._subscribers = new HashSet <string>(); this._positions = new List <Position>(); IOrderedQueryable <IGrouping <Security, Trade> > groups = dataContext.Trades .Where(trade => trade.PortfolioId == portfolio.Id) .Include(trade => trade.Security) .GroupBy(trade => trade.Security) .OrderBy(group => group.Key.Ticker); foreach (IGrouping <Security, Trade> group in groups) { Position position = new Position { Ticker = group.Key.Ticker, Description = group.Key.Description }; foreach (Trade trade in group.OrderBy(trade => trade.TradeDate)) { PortfolioData.ProcessTrade(position, trade.Quantity, trade.Price); } this._positions.Add(position); this._dataTable.Rows.Add(this.CreateRow(position)); } }
public void ProcessTrades(IEnumerable <Trade> trades) { List <RowChangeBase> list = new List <RowChangeBase>(); PositionChangeProcessor changeProcessor = new PositionChangeProcessor(this._dataTable); lock (this) { foreach (Trade trade in trades) { int index = this._positions.BinarySearchByValue(trade.Security.Ticker, pos => pos.Ticker); if (index < 0) { Position position = new Position { Ticker = trade.Security.Ticker, Description = trade.Security.Description }; PortfolioData.ProcessTrade(position, trade.Quantity, trade.Price); this._positions.Insert(~index, position); DataRow dataRow = this.CreateRow(position); this._dataTable.Rows.InsertAt(dataRow, ~index); list.Add(new RowAdded { RowKey = position.Ticker, Data = dataRow.ItemArray }); } else { Position position = this._positions[index]; position.PropertyChanged += changeProcessor.PropertyChangedEventHandler; PortfolioData.ProcessTrade(position, trade.Quantity, trade.Price); position.PropertyChanged -= changeProcessor.PropertyChangedEventHandler; } } } this.OnDataChanged(list.Count == 0 ? changeProcessor.RowChanges : list.Concat(changeProcessor.RowChanges)); }