public void addObservedResult( double min, double max, double closeVal, long currentTime, String passCode) throws IllegalStateValueDataModificationException { if (!this.passCode.equals(passCode)) { throw new IllegalStateValueDataModificationException(); } int priority = 0; Set<Long> closedOrders = new HashSet<Long>(); for (Map.Entry<Long, OpenOrder> entry : openOrders.entrySet()) { long orderNumber = entry.getKey(); if (orderNumber != currentTime) { OpenOrder order = entry.getValue(); double weight = Math.exp(-priority); Integer timeClass = (int) (Math.log(currentTime - orderNumber) / Math.log(2)); int maxClass = (int) ((max - order.getPrice()) / res); int minClass = (int) ((min - order.getPrice()) / res); if (!dist.containsKey(timeClass)) { dist.put(timeClass, new TreeMap<Integer, Double>()); } for (int i = minClass; i <= maxClass; i++) { if (!dist.get(timeClass).containsKey(i)) { dist.get(timeClass).put(i, 0.0); } if (!collapsedDist.containsKey(i)) { collapsedDist.put(i, 0.0); } } if (minClass != 0 && maxClass != 0) { for (int i = minClass; i <= maxClass; i++) { dist.get(timeClass).put(i, dist.get(timeClass).get(i) + weight); collapsedDist.put(i, collapsedDist.get(i) + weight); } } sumWeights += weight; boolean closed = false; if (!order.isClosed()) { if (order.getPosition() == 'L') { closed = order.newPrice(min); if (Math.random() > 0.5) // (!closed) { closed = order.newPrice(max); } } else { closed = order.newPrice(max); if (Math.random() > 0.5) // (!closed) { closed = order.newPrice(min); } } if (!closed && (currentTime - orderNumber) > maxAge) { order.close(closeVal); closed = true; } if (closed) { double profit = weight * (order.getPnL() / res); // System.out.println("Order Closed from " + state + ": " + orderNumber + ": Profit: " + // profit); pnl += profit; sum = pnl; sum2PnL += (profit * profit); sum2 = sum2PnL; correlator.pnl -= average; countClosed += weight; average = pnl / countClosed; correlator.pnl += average; correlator.stackPnL.addToStack(Math.signum(profit)); double variance = Math.abs(sum2 / countClosed - average); sdev = Math.sqrt(variance); double average2PnL = average * average; sharpe = Math.sqrt(average2PnL / variance); } } if (closed && (currentTime - orderNumber) >= maxAge) { closedOrders.add(orderNumber); } priority++; } } for (long orderNumber : closedOrders) { openOrders.remove(orderNumber); } if (openOrders.isEmpty()) { correlator.removeLiveState(this); } }