diff --git a/CM2005 Object Oriented Programming/Midterm/Merkelrex-TradingBot/OrderBook.cpp b/CM2005 Object Oriented Programming/Midterm/Merkelrex-TradingBot/OrderBook.cpp index 6c46766..78a0b83 100644 --- a/CM2005 Object Oriented Programming/Midterm/Merkelrex-TradingBot/OrderBook.cpp +++ b/CM2005 Object Oriented Programming/Midterm/Merkelrex-TradingBot/OrderBook.cpp @@ -4,69 +4,64 @@ #include #include - /** construct, reading a csv data file */ OrderBook::OrderBook(std::string filename) { orders = CSVReader::readCSV(filename); + + std::map prodMap; + + for (OrderBookEntry &e : orders) + { + prodMap[e.product] = true; + } + + // now flatten the map to a vector of strings + for (auto const &e : prodMap) + { + knownProducts.push_back(e.first); + } } /** return vector of all know products in the dataset*/ std::vector OrderBook::getKnownProducts() { - std::vector products; - - std::map prodMap; - - for (OrderBookEntry& e : orders) - { - prodMap[e.product] = true; - } - - // now flatten the map to a vector of strings - for (auto const& e : prodMap) - { - products.push_back(e.first); - } - - return products; + return knownProducts; } /** return vector of Orders according to the sent filters*/ -std::vector OrderBook::getOrders(OrderBookType type, - std::string product, - std::string timestamp) +std::vector OrderBook::getOrders(OrderBookType type, std::string product, std::string timestamp) { std::vector orders_sub; - for (OrderBookEntry& e : orders) + for (OrderBookEntry &e : orders) { - if (e.orderType == type && - e.product == product && - e.timestamp == timestamp ) - { - orders_sub.push_back(e); - } + if (e.orderType == type && + e.product == product && + e.timestamp == timestamp) + { + orders_sub.push_back(e); + } } return orders_sub; } - -double OrderBook::getHighPrice(std::vector& orders) +double OrderBook::getHighPrice(std::vector &orders) { double max = orders[0].price; - for (OrderBookEntry& e : orders) + for (OrderBookEntry &e : orders) { - if (e.price > max)max = e.price; + if (e.price > max) + max = e.price; } return max; } - -double OrderBook::getLowPrice(std::vector& orders) +double OrderBook::getLowPrice(std::vector &orders) { double min = orders[0].price; - for (OrderBookEntry& e : orders) + for (OrderBookEntry &e : orders) { - if (e.price < min)min = e.price; + if (e.price < min) + min = e.price; } return min; } @@ -79,9 +74,9 @@ std::string OrderBook::getEarliestTime() std::string OrderBook::getNextTime(std::string timestamp) { std::string next_timestamp = ""; - for (OrderBookEntry& e : orders) + for (OrderBookEntry &e : orders) { - if (e.timestamp > timestamp) + if (e.timestamp > timestamp) { next_timestamp = e.timestamp; break; @@ -94,7 +89,7 @@ std::string OrderBook::getNextTime(std::string timestamp) return next_timestamp; } -void OrderBook::insertOrder(OrderBookEntry& order) +void OrderBook::insertOrder(OrderBookEntry &order) { orders.push_back(order); std::sort(orders.begin(), orders.end(), OrderBookEntry::compareByTimestamp); @@ -102,17 +97,13 @@ void OrderBook::insertOrder(OrderBookEntry& order) std::vector OrderBook::matchAsksToBids(std::string product, std::string timestamp) { -// asks = orderbook.asks - std::vector asks = getOrders(OrderBookType::ask, - product, - timestamp); -// bids = orderbook.bids - std::vector bids = getOrders(OrderBookType::bid, - product, - timestamp); + // asks = orderbook.asks + std::vector asks = getOrders(OrderBookType::ask, product, timestamp); + // bids = orderbook.bids + std::vector bids = getOrders(OrderBookType::bid, product, timestamp); // sales = [] - std::vector sales; + std::vector sales; // I put in a little check to ensure we have bids and asks // to process. @@ -127,24 +118,24 @@ std::vector OrderBook::matchAsksToBids(std::string product, std: // sort bids highest first std::sort(bids.begin(), bids.end(), OrderBookEntry::compareByPriceDesc); // for ask in asks: - std::cout << "max ask " << asks[asks.size()-1].price << std::endl; + std::cout << "max ask " << asks[asks.size() - 1].price << std::endl; std::cout << "min ask " << asks[0].price << std::endl; std::cout << "max bid " << bids[0].price << std::endl; - std::cout << "min bid " << bids[bids.size()-1].price << std::endl; - - for (OrderBookEntry& ask : asks) + std::cout << "min bid " << bids[bids.size() - 1].price << std::endl; + + for (OrderBookEntry &ask : asks) { - // for bid in bids: - for (OrderBookEntry& bid : bids) + // for bid in bids: + for (OrderBookEntry &bid : bids) { - // if bid.price >= ask.price # we have a match + // if bid.price >= ask.price # we have a match if (bid.price >= ask.price) { - // sale = new order() - // sale.price = ask.price - OrderBookEntry sale{ask.price, 0, timestamp, - product, - OrderBookType::asksale}; + // sale = new order() + // sale.price = ask.price + OrderBookEntry sale{ask.price, 0, timestamp, + product, + OrderBookType::asksale}; if (bid.username == "simuser") { @@ -154,63 +145,62 @@ std::vector OrderBook::matchAsksToBids(std::string product, std: if (ask.username == "simuser") { sale.username = "simuser"; - sale.orderType = OrderBookType::asksale; + sale.orderType = OrderBookType::asksale; } - - // # now work out how much was sold and - // # create new bids and asks covering - // # anything that was not sold - // if bid.amount == ask.amount: # bid completely clears ask + + // # now work out how much was sold and + // # create new bids and asks covering + // # anything that was not sold + // if bid.amount == ask.amount: # bid completely clears ask if (bid.amount == ask.amount) { - // sale.amount = ask.amount + // sale.amount = ask.amount sale.amount = ask.amount; - // sales.append(sale) + // sales.append(sale) sales.push_back(sale); - // bid.amount = 0 # make sure the bid is not processed again + // bid.amount = 0 # make sure the bid is not processed again bid.amount = 0; - // # can do no more with this ask - // # go onto the next ask - // break + // # can do no more with this ask + // # go onto the next ask + // break break; } - // if bid.amount > ask.amount: # ask is completely gone slice the bid + // if bid.amount > ask.amount: # ask is completely gone slice the bid if (bid.amount > ask.amount) { - // sale.amount = ask.amount + // sale.amount = ask.amount sale.amount = ask.amount; - // sales.append(sale) + // sales.append(sale) sales.push_back(sale); - // # we adjust the bid in place - // # so it can be used to process the next ask - // bid.amount = bid.amount - ask.amount - bid.amount = bid.amount - ask.amount; - // # ask is completely gone, so go to next ask - // break + // # we adjust the bid in place + // # so it can be used to process the next ask + // bid.amount = bid.amount - ask.amount + bid.amount = bid.amount - ask.amount; + // # ask is completely gone, so go to next ask + // break break; } - - // if bid.amount < ask.amount # bid is completely gone, slice the ask - if (bid.amount < ask.amount && - bid.amount > 0) + // if bid.amount < ask.amount # bid is completely gone, slice the ask + if (bid.amount < ask.amount && + bid.amount > 0) { - // sale.amount = bid.amount + // sale.amount = bid.amount sale.amount = bid.amount; - // sales.append(sale) + // sales.append(sale) sales.push_back(sale); - // # update the ask - // # and allow further bids to process the remaining amount - // ask.amount = ask.amount - bid.amount + // # update the ask + // # and allow further bids to process the remaining amount + // ask.amount = ask.amount - bid.amount ask.amount = ask.amount - bid.amount; - // bid.amount = 0 # make sure the bid is not processed again + // bid.amount = 0 # make sure the bid is not processed again bid.amount = 0; - // # some ask remains so go to the next bid - // continue + // # some ask remains so go to the next bid + // continue continue; } } } } - return sales; + return sales; } diff --git a/CM2005 Object Oriented Programming/Midterm/Merkelrex-TradingBot/OrderBook.h b/CM2005 Object Oriented Programming/Midterm/Merkelrex-TradingBot/OrderBook.h index a331747..9201658 100644 --- a/CM2005 Object Oriented Programming/Midterm/Merkelrex-TradingBot/OrderBook.h +++ b/CM2005 Object Oriented Programming/Midterm/Merkelrex-TradingBot/OrderBook.h @@ -6,33 +6,30 @@ class OrderBook { - public: +public: /** construct, reading a csv data file */ - OrderBook(std::string filename); + OrderBook(std::string filename); /** return vector of all know products in the dataset*/ - std::vector getKnownProducts(); + std::vector getKnownProducts(); /** return vector of Orders according to the sent filters*/ - std::vector getOrders(OrderBookType type, - std::string product, - std::string timestamp); + std::vector getOrders(OrderBookType type, std::string product, std::string timestamp); - /** returns the earliest time in the orderbook*/ - std::string getEarliestTime(); - /** returns the next time after the + /** returns the earliest time in the orderbook*/ + std::string getEarliestTime(); + /** returns the next time after the * sent time in the orderbook * If there is no next timestamp, wraps around to the start * */ - std::string getNextTime(std::string timestamp); + std::string getNextTime(std::string timestamp); - void insertOrder(OrderBookEntry& order); + void insertOrder(OrderBookEntry &order); - std::vector matchAsksToBids(std::string product, std::string timestamp); - - static double getHighPrice(std::vector& orders); - static double getLowPrice(std::vector& orders); - - private: - std::vector orders; + std::vector matchAsksToBids(std::string product, std::string timestamp); + static double getHighPrice(std::vector &orders); + static double getLowPrice(std::vector &orders); +private: + std::vector orders; // private variable which holds all loaded orders from the file + std::vector knownProducts; };