Пример #1
0
  private void closeOpenOrder(OpenOrder openOrder, double commissionAmount) {
    openOrdersById.remove(openOrder.getOrderId());
    if (Double.isNaN(commissionAmount) || commissionAmount <= 0.0) {
      commissionAmount =
          commission.calculate(openOrder.getQuantityFilled(), openOrder.getAvgFillPrice());
    }
    openOrder.setCommission(commissionAmount);
    logger.info("{} {}", openOrder.isFilled() ? "Filled" : "Partially filled", openOrder);

    Position position = portfolio.getPosition(openOrder.getSymbol());
    double[] values =
        position.update(
            openOrder.getFillDate(),
            openOrder.getQuantityFilled(),
            openOrder.getAvgFillPrice(),
            openOrder.getCommission());

    logTrade(openOrder, position.getQuantity(), values[0], values[1], values[2]);

    for (OrderListener listener : orderListeners) {
      try {
        listener.onOrderFilled(openOrder, position);
      } catch (Throwable t) {
        logger.error(t.getMessage(), t);
      }
    }
  }
Пример #2
0
  @Override
  public void openOrder(int orderId, Contract contract, Order order, OrderState orderState) {
    try {
      if (logger.isDebugEnabled())
        logger.debug(
            "openOrder: {} {} {} {}",
            new Object[] {
              orderId, Util.toString(contract), Util.toString(order), Util.toString(orderState)
            });

      OpenOrder openOrder = openOrdersById.get(orderId);
      if (openOrder != null) {
        if ((openOrder.isFilled() || (!openOrder.isOpen() && openOrder.getQuantityFilled() > 0))
            && orderState.m_commission != Double.MAX_VALUE) {
          closeOpenOrder(openOrder, orderState.m_commission);
        }
      } else {
        if ("PendingSubmit".equals(orderState.m_status)
            || "PreSubmitted".equals(orderState.m_status)
            || "Submitted".equals(orderState.m_status)) {
          openOrder = toOpenOrder(contract, order);
          openOrdersById.put(orderId, openOrder);
          logger.info("Added {}", openOrder);
        }
      }
    } catch (Throwable t) {
      logger.error(t.getMessage(), t);
    }
  }
Пример #3
0
  @Override
  public void orderStatus(
      int orderId,
      String status,
      int filled,
      int remaining,
      double avgFillPrice,
      int permId,
      int parentId,
      double lastFillPrice,
      int clientId,
      String whyHeld) {
    try {
      if (logger.isDebugEnabled())
        logger.debug(
            "orderStatus: {} {} {} {} {} {} {} {} {} {}",
            new Object[] {
              orderId,
              status,
              filled,
              remaining,
              avgFillPrice,
              permId,
              parentId,
              lastFillPrice,
              clientId,
              whyHeld
            });

      if ("Cancelled".equals(status)) {
        OpenOrder openOrder = openOrdersById.remove(orderId);
        if (openOrder != null) {
          openOrder.setCancelled();
          logger.info("Cancelled {}", openOrder);
          for (OrderListener listener : orderListeners) {
            try {
              listener.onOrderCancelled(openOrder);
            } catch (Throwable t) {
              logger.error(t.getMessage(), t);
            }
          }
          if ((openOrder.isFilled()
              || (!openOrder.isOpen() && openOrder.getQuantityFilled() > 0))) {
            closeOpenOrder(openOrder, 0);
          }
        } else {
          logger.warn("Cancelled order {}, no matching order found!", orderId);
        }
      }

    } catch (Throwable t) {
      // Do not allow exceptions come back to the socket -- it will cause
      // disconnects
      logger.error(t.getMessage(), t);
    }
  }
Пример #4
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);
 }