private void initialiseDefaultMarket() { market = new Market(); matchList = new LinkedList<RequestOfferMatch>(); PriceOffer po780_1 = new PriceOffer(1000000); po780_1.setPrice(new BigDecimal(7.80)); po780_1.setOfferTime(DateTimeUtil.createDateFromTime(1, 20)); market.addOffer(po780_1); PriceOffer po780_2 = new PriceOffer(1000000); po780_2.setPrice(new BigDecimal(7.80)); po780_2.setOfferTime(DateTimeUtil.createDateFromTime(1, 30)); market.addOffer(po780_2); PriceOffer po775_1 = new PriceOffer(500000); po775_1.setPrice(new BigDecimal(7.75)); po775_1.setOfferTime(DateTimeUtil.createDateFromTime(0, 10)); market.addOffer(po775_1); PriceRequest pr765_1 = new PriceRequest(250000); pr765_1.setPrice(new BigDecimal(7.65)); pr765_1.setRequestTime(DateTimeUtil.createDateFromTime(0, 40)); pr765_1.setTier(1); market.addRequest(pr765_1); }
private RequestOfferMatch checkForMatchingOffers(PriceRequest req) { RequestOfferMatch match = null; List<PriceOffer> matchingOffers = market.getOffersFromPrice(req.getPrice()); if (matchingOffers.isEmpty()) { return null; } else { int amountToFill = req.getAmount(); int totalMatchedAmount = 0; match = new RequestOfferMatch(); // The first match will be the best price match.setPrice(matchingOffers.get(0).getPrice()); match.setRequestList(new ArrayList<PriceRequest>()); match.setOfferList(new ArrayList<PriceOffer>()); ListIterator<PriceOffer> iter = matchingOffers.listIterator(); while (amountToFill > 0 && iter.hasNext()) { PriceOffer offer = iter.next(); if (offer.getAmount() >= amountToFill) { PriceOffer matchedOffer = offer.clone(); matchedOffer.setAmount(amountToFill); offer.setAmount(offer.getAmount() - amountToFill); if (offer.getAmount() == 0) { market.removeOffer(offer); } match.getOfferList().add(matchedOffer); if (match.getRequestList().isEmpty()) { match.getRequestList().add(req.clone()); } else { PriceRequest matchedRequest = match.getRequestList().get(0); matchedRequest.setAmount(matchedRequest.getAmount() + amountToFill); } market.removeRequest(req); totalMatchedAmount += amountToFill; amountToFill = 0; } else { PriceOffer matchedOffer = offer.clone(); match.getOfferList().add(matchedOffer); PriceRequest matchedRequest; if (match.getRequestList().isEmpty()) { matchedRequest = req.clone(); matchedRequest.setAmount(0); match.getRequestList().add(matchedRequest); } else { matchedRequest = match.getRequestList().get(0); } int matchedAmount = offer.getAmount(); matchedRequest.setAmount(matchedRequest.getAmount() + matchedAmount); amountToFill -= matchedAmount; totalMatchedAmount += matchedAmount; req.setAmount(amountToFill); iter.remove(); market.removeOffer(offer); } } match.setMatchedAmount(totalMatchedAmount); match.setMatchTime(new Date()); matchList.push(match); return match.clone(); } }
/** * @param offer * @return details of a match if there is one, otherwise null */ public RequestOfferMatch saveOffer(PriceOffer offer) { market.addOffer(offer); return checkForMatchingRequests(offer); }
/** * @param request * @return details of a match if there is one, otherwise null */ public RequestOfferMatch saveRequest(PriceRequest request) { market.addRequest(request); return checkForMatchingOffers(request); }
/** @return */ public List<MarketPrice> getDefaultMarketPrices() { return cloneList(market.getPriceList()); }