diff --git a/CM2005 Object Oriented Programming/Topic 4/4.5.4/OrderBook.cpp b/CM2005 Object Oriented Programming/Topic 4/4.5.4/OrderBook.cpp index da8a2af..7d167d3 100644 --- a/CM2005 Object Oriented Programming/Topic 4/4.5.4/OrderBook.cpp +++ b/CM2005 Object Oriented Programming/Topic 4/4.5.4/OrderBook.cpp @@ -95,4 +95,49 @@ void OrderBook::insertOrder(OrderBookEntry& order) { orders.push_back(order); std::sort(orders.begin(), orders.end(), OrderBookEntry::compareByTimestamp); +} + +std::vector OrderBook::matchAsksToBids(std::string product, std::string timestamp) +{ + std::vector asks = getOrders(OrderBookType::ask, product, timestamp); + std::vector bids = getOrders(OrderBookType::bid, product, timestamp); + + std::vector sales; + + std::sort(asks.begin(), asks.end(), OrderBookEntry::compareByPriceAsc); + std::sort(bids.begin(), bids.end(), OrderBookEntry::compareByPriceDesc); + + for(OrderBookEntry& thisAsk : asks) + { + for(OrderBookEntry& thisBid : bids) + { + if(thisBid.price >= thisAsk.price) + { + OrderBookEntry sale{thisAsk.price, 0, timestamp, product, OrderBookType::sale}; + if(thisBid.amount == thisAsk.amount) + { + sale.amount = thisAsk.amount; + sales.push_back(sale); + thisBid.amount = 0; + break; + } + else if(thisBid.amount > thisAsk.amount) + { + sale.amount = thisAsk.amount; + sales.push_back(sale); + thisBid.amount = thisBid.amount - thisAsk.amount; + break; + } + else if(thisBid.amount < thisAsk.amount) + { + sale.amount = thisBid.amount; + sales.push_back(sale); + thisAsk.amount = thisAsk.amount - thisBid.amount; + thisBid.amount = 0; + continue; + } + } + } + } + return sales; } \ No newline at end of file diff --git a/CM2005 Object Oriented Programming/Topic 4/4.5.4/a.exe b/CM2005 Object Oriented Programming/Topic 4/4.5.4/a.exe index 7eb3f3b..84b15a4 100644 Binary files a/CM2005 Object Oriented Programming/Topic 4/4.5.4/a.exe and b/CM2005 Object Oriented Programming/Topic 4/4.5.4/a.exe differ