Exemple #1
0
        /// <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();
        }