/// <summary> /// To calculate trade profitability. If the trade was already processed earlier, previous information returns. /// </summary> /// <param name="trade">Trade.</param> /// <param name="info">Information on new trade.</param> /// <returns><see langword="true" />, if new trade received, otherwise, <see langword="false" />.</returns> public bool ProcessMyTrade(ExecutionMessage trade, out PnLInfo info) { if (trade == null) throw new ArgumentNullException(nameof(trade)); var tradeId = trade.GetTradeId(); if (_tradeInfos.TryGetValue(tradeId, out info)) return false; var queue = _securityPnLs.SafeAdd(trade.SecurityId, security => new PnLQueue(security)); info = queue.Process(trade); _tradeInfos.Add(tradeId, info); _realizedPnL += info.PnL; return true; }