private bool MakeDeal(ConfirmedDeal confirmedDeal) { IExchangeUser seller = GetUserByUniqueId(confirmedDeal.SellerUniqueId); IExchangeUser buyer = GetUserByUniqueId(confirmedDeal.BuyerUniqueId); seller.DeattachShares(confirmedDeal.Deal); buyer.TakeShares(confirmedDeal.Deal); return(_bank.TransferMoney(buyer, seller, confirmedDeal.Deal.SharesCost, out double comission)); }
private ICollection <ConfirmedDeal> TryMatchOffers( ICollection <SellDealOffer> sellDealOffers, ICollection <BuyDealOffer> buyDealOffers, ref List <DealOffer> remainOffers) { // Список итоговых сопоставленных сделок var deals = new List <ConfirmedDeal>(); // Пробегаемся по списку предложений о продаже foreach (SellDealOffer sell in sellDealOffers) { BuyDealOffer buy = buyDealOffers.FirstOrDefault(b => IsDealsMatched(sell, b)); if (buy == null) { // Если сделка не состоялась continue; } // если предложения о покупке и продаже совпадают, то добавляем в список подтвержденных сделок // при этом корректиуем показатели сделки о продаже, чтобы совпадали sell.Deal.ShareCount = buy.Deal.ShareCount <= sell.Deal.ShareCount ? buy.Deal.ShareCount : sell.Deal.ShareCount; sell.Deal.SharesCost = sell.Deal.SharePrice * sell.Deal.ShareCount; var confirmedDeal = new ConfirmedDeal { BuyerUniqueId = buy.UniqueExhcangeUserId, SellerUniqueId = sell.UniqueExhcangeUserId, Deal = sell.Deal }; deals.Add(confirmedDeal); // Убираем из общего списка предложений те, которые свершились remainOffers.Remove(buy); remainOffers.Remove(sell); } return(deals); }