Beispiel #1
0
 private bool IsDealsMatched(SellDealOffer sell, BuyDealOffer buy)
 {
     return(buy.UniqueExhcangeUserId != sell.UniqueExhcangeUserId // Чтобы с самим собой сделка не случилась
            //&& buy.ShareCount <= sell.ShareCount // У покупатель хочет купить
            && buy.Deal.ShareCompanyId == sell.Deal.ShareCompanyId && // компании акций совпадают
            Math.Abs(buy.Deal.SharePrice - sell.Deal.SharePrice) <= SellBuyPriceMaxDifference);    // Если цены покупки и продажи близки по значению
 }
Beispiel #2
0
        public void ExecuteExchanging()
        {
            var result = new ExchangeStepResult();

            var sellOffersList = new List <SellDealOffer>();
            var buyOffersList  = new List <BuyDealOffer>();

            // Формирование списка предложений о продаже
            foreach (IExchangeUser user in _exchangeUsers)
            {
                SellDealOffer offer = null;
                if (!user.WannaMakeSellDeals() || (offer = user.GetSellDealOffer()) == null)
                {
                    // Если участник-покупатель не захотел торговать сейчас
                    continue;
                }

                sellOffersList.Add(offer);
            }

            // Формирование списка предлжений о покупке
            foreach (IExchangeUser user in _exchangeUsers)
            {
                BuyDealOffer offer = null;
                if (!user.WannaMakeBuyDeals() || (offer = user.GetBuyDealOffer()) == null)
                {
                    // Если участник-покупатель не захотел торговать сейчас
                    continue;
                }

                buyOffersList.Add(offer);
            }

            // предложения сделок, которые на этапе сопоставления остаются несвершившимися
            List <DealOffer> remainOffers = sellOffersList
                                            .Cast <DealOffer>()
                                            .Concat(buyOffersList)
                                            .ToList();

            ICollection <ConfirmedDeal> confirmedDeals
                = TryMatchOffers(sellOffersList, buyOffersList, ref remainOffers);

            foreach (ConfirmedDeal deal in confirmedDeals)
            {
                if (!MakeDeal(deal))
                {
                    // Если сделка не удалась по некоторой причине
                    continue;
                }
                result.StepDealCount++;
                result.StepDealSumm += deal.Deal.SharesCost;
            }

            //оповещаем участников, чьи сделки не состоялись, об этом
            foreach (DealOffer offer in remainOffers)
            {
                GetUserByUniqueId(offer.UniqueExhcangeUserId)
                .NotifyAboutFiredOffer(offer);
            }

            if (result.StepDealCount != 0)
            {
                // Если сделки состоялись, то сообщаем слушателям
                ExchangeStepExecuted?.Invoke(result);
            }
        }