protected void logTrade( OpenOrder openOrder, int position, double costBasis, double realized, double unrealized) { Object[] params = new Object[] { openOrder.getFillDate(), "TRADE", openOrder.getAction(), openOrder.getType(), openOrder.getQuantityFilled(), openOrder.getSymbol(), openOrder.getSymbol().getCurrency(), openOrder.getAvgFillPrice(), position, Util.round(costBasis, 4), Util.round(realized, 4), Util.round(unrealized, 4), Util.round(openOrder.getCommission(), 4), openOrder.getReference() != null ? openOrder.getReference() : "", accountCode }; blotter.info( MarkerFactory.getMarker("TRADE"), "{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}", params); }
@Override public synchronized OpenOrder placeOrder( Symbol symbol, OrderType type, int quantity, double price, double stopPercent, String reference) { if (quantity == 0) { throw new IllegalArgumentException(String.format("Invalid quantity %s", quantity)); } if ((OrderType.LIMIT.equals(type) || OrderType.STOP_LIMIT.equals(type) || OrderType.TRAIL_LIMIT.equals(type)) && price <= 0) { throw new IllegalArgumentException(String.format("Invalid limit order price %s", price)); } if ((OrderType.STOP_MARKET.equals(type) || OrderType.STOP_LIMIT.equals(type) || OrderType.TRAIL_MARKET.equals(type) || OrderType.TRAIL_LIMIT.equals(type)) && stopPercent <= 0) { throw new IllegalArgumentException( String.format("Invalid stop order with stop percent %s", stopPercent)); } checkConnected(); OpenOrder openOrder = getOpenOrder(symbol, type); if (openOrder != null && !openOrder.isFilled() && !openOrder.isCancelled()) { throw new IllegalStateException( "OpenOrder for same strategy, symbol and type already exists: " + openOrder); } DateTime now = new DateTime(); double stopPrice = -1; double trailingStopOffset = -1; if (OrderType.STOP_MARKET.equals(type) || OrderType.STOP_LIMIT.equals(type) || OrderType.TRAIL_MARKET.equals(type) || OrderType.TRAIL_LIMIT.equals(type)) { Tick t = getLastTick(symbol); if (t == null) { t = getLastTick(symbol, now); if (t == null) { throw new IllegalStateException( String.format("Cannot set stop without tick data for symbol %s", symbol)); } } trailingStopOffset = Util.round(t.getMidPrice() * stopPercent, 10.0); if (quantity < 0) { stopPrice = t.getMidPrice() - trailingStopOffset; } else { stopPrice = t.getMidPrice() + trailingStopOffset; } stopPrice = Util.round(stopPrice, 2.0); } int orderId = nextValidOrderId.getAndIncrement(); openOrder = new OpenOrder( orderId, symbol, type, quantity, price, stopPrice, trailingStopOffset, new DateTime(), reference); openOrdersById.put(orderId, openOrder); Contract contract = makeContract(symbol); Order order = makeOrder(openOrder); logger.info("Placing order {}", openOrder); socket.placeOrder(orderId, contract, order); for (OrderListener listener : orderListeners) { try { listener.onOrderPlaced(openOrder); } catch (Throwable t) { logger.error(t.getMessage(), t); } } return openOrder; }