Пример #1
0
 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);
 }
Пример #2
0
  @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;
  }