/// <summary> /// add data to existing symbol. /// </summary> /// <param name="raw"> /// The raw trade data /// </param> private void AddDataToExistingSymbol(RawTradeData raw) { TradeSummary updateSummary = this._summary.FirstOrDefault(x => x.Symbol == raw.Symbol); updateSummary.MaxTimeGap = raw.TimeStamp - updateSummary.LastTimeStamp > updateSummary.MaxTimeGap ? raw.TimeStamp - updateSummary.LastTimeStamp : updateSummary.MaxTimeGap; updateSummary.LastTimeStamp = raw.TimeStamp; updateSummary.MaxPrice = raw.Price > updateSummary.MaxPrice ? raw.Price : updateSummary.MaxPrice; updateSummary.TotalAmount = updateSummary.TotalAmount + raw.Price * raw.Quantity; updateSummary.Volume = updateSummary.Volume + raw.Quantity; }
protected override void BasePostProcessing(ref Trade entity, OperationType operationType) { ///2. add entry to TradeSummaryAudit ///3. calculate the TradeSummary var tickerTradeSummary = tradeSummaryRepo.GetByTickerId(entity.TickerId); if (tickerTradeSummary == null || tickerTradeSummary.Id == 0) { tickerTradeSummary = new TradeSummary() { TickerId = entity.TickerId, Ticker = entity.Ticker, Quantity = 0, UnitPrice = 0, UnitPriceWithCost = 0 }; } var tradeaudit = new TradeSummaryAudit() { TickerId = entity.TickerId, Ticker = entity.Ticker, MovementType = operationType.ToString(), OldQuantity = tickerTradeSummary != null ? tickerTradeSummary.Quantity: 0, OldUnitPrice = tickerTradeSummary != null ? tickerTradeSummary.UnitPrice: 0, OldUnitPriceWithCost = tickerTradeSummary != null ? tickerTradeSummary.UnitPriceWithCost: 0, TradeId = entity.Id, TradeQuantity = entity.Quantity, TradeUnitPrice = entity.UnitPrice, TradePriceWithCost = entity.UnitPriceWithCost, }; if (entity.TradeType == TradeType.Buy.ToString()) { tickerTradeSummary.UnitPrice = ((tickerTradeSummary.UnitPrice * tickerTradeSummary.Quantity) + (entity.UnitPrice * entity.Quantity)) / (tickerTradeSummary.Quantity + entity.Quantity); tickerTradeSummary.UnitPriceWithCost = ((tickerTradeSummary.UnitPriceWithCost * tickerTradeSummary.Quantity) + (entity.UnitPriceWithCost * entity.Quantity)) / (tickerTradeSummary.Quantity + entity.Quantity); tickerTradeSummary.Quantity = tickerTradeSummary.Quantity + entity.Quantity; } else if (entity.TradeType == TradeType.Sell.ToString()) { tickerTradeSummary.Quantity = tickerTradeSummary.Quantity - entity.Quantity; //for sell transaction, just log the quantity reduced but the profit or loss should be track in separately as realized P & L } tradeaudit.NewQuantity = tickerTradeSummary.Quantity; tradeaudit.NewUnitPrice = tickerTradeSummary.UnitPrice; tradeaudit.NewUnitPriceWithCost = tickerTradeSummary.UnitPriceWithCost; if (tickerTradeSummary.Id == 0) { tradeSummaryRepo.Add(tickerTradeSummary); } else { tradeSummaryRepo.Update(tickerTradeSummary); } tradeaudit.TradeSummaryId = tickerTradeSummary.Id; tradeSummaryAuditRepo.Add(tradeaudit); tradeSummaryRepo.Commit(); tradeSummaryAuditRepo.Commit(); }