Ejemplo n.º 1
0
        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));
            }
        }
Ejemplo n.º 2
0
        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));
        }