import java.math.BigDecimal; import org.marketcetera.trade.Equity; import org.marketcetera.event.AskEvent; import org.marketcetera.event.BidEvent; import org.marketcetera.event.TradeEvent; import org.marketcetera.strategy.java.Strategy; import org.marketcetera.trade.ReportBase; import org.marketcetera.trade.ExecutionReport; import org.marketcetera.trade.Factory; import org.marketcetera.trade.OrderID; import org.marketcetera.trade.OrderSingle; import org.marketcetera.trade.OrderType; import org.marketcetera.trade.Side; import org.marketcetera.trade.TimeInForce; import org.marketcetera.trade.OrderCancel; import org.marketcetera.trade.OrderReplace; import java.util.Deque; /* $License$ */ /** * Sample strategy to test the ability to send orders. * * @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a> * @version $Id: Orders.java 16154 2012-07-14 16:34:05Z colin $ * @since 1.0.0 */ public class Orders extends Strategy { /* (non-Javadoc) * @see org.marketcetera.strategy.java.Strategy#onAsk(org.marketcetera.event.AskEvent) */ @Override public void onAsk(AskEvent inAsk) { if(getProperty("orderShouldBeNull") != null) { doOrderSend(false); } else { doOrderSend(true); } } /* (non-Javadoc) * @see org.marketcetera.strategy.java.Strategy#onBid(org.marketcetera.event.BidEvent) */ @Override public void onBid(BidEvent inBid) { String orderID = getProperty("orderID"); if(orderID != null) { Deque<ReportBase> exeReports = getExecutionReports(new OrderID(orderID)); setProperty("executionReportCount", Integer.toString(exeReports.size())); } } /* (non-Javadoc) * @see org.marketcetera.strategy.java.Strategy#onExecutionReport(org.marketcetera.trade.ExecutionReport) */ @Override public void onExecutionReport(ExecutionReport inExecutionReport) { String executionReportsReceived = getProperty("executionReportsReceived"); if(executionReportsReceived == null) { setProperty("executionReportsReceived", "1"); } else { setProperty("executionReportsReceived", Integer.toString(Integer.parseInt(executionReportsReceived) + 1)); } } /* (non-Javadoc) * @see org.marketcetera.strategy.java.Strategy#onTrade(org.marketcetera.event.TradeEvent) */ @Override public void onTrade(TradeEvent inTrade) { if(getProperty("cancelAll") != null) { int ordersCanceled = cancelAllOrders(); setProperty("ordersCanceled", Integer.toString(ordersCanceled)); } } /* (non-Javadoc) * @see org.marketcetera.strategy.java.Strategy#onOther(java.lang.Object) */ @Override public void onOther(Object inEvent) { if(inEvent instanceof OrderID) { String shouldSkipSend = getProperty("skipSubmitOrders"); String shouldDelaySend = getProperty("delaySubmitOrders"); String newAccountName = getProperty("newAccountName"); OrderCancel orderCancel = cancelOrder((OrderID)inEvent, (shouldSkipSend == null ? true : false)); setProperty("orderCanceled", orderCancel == null ? "false" : "true"); if(shouldDelaySend != null) { orderCancel.setAccount(newAccountName); send(orderCancel); } } else if(inEvent instanceof OrderSingle) { doCancelReplaceTest(inEvent); } else if(inEvent instanceof String){ doCancelReplaceTest(inEvent); } else { OrderCancel orderCancel = cancelOrder(null, true); setProperty("orderCanceled", orderCancel == null ? "false" : "true"); } } /* (non-Javadoc) * @see org.marketcetera.strategy.java.Strategy#onStop() */ @Override public void onStop() { doOrderSend(true); String rawOrderID = getProperty("orderID"); if(rawOrderID != null) { OrderID orderID = new OrderID(rawOrderID); if(getProperty("shouldReplace") != null) { OrderSingle order = Factory.getInstance().createOrderSingle(); OrderReplace replace = cancelReplace(orderID, order, false); if(replace != null) { setProperty("orderReplaceNull", "false"); } else { setProperty("orderReplaceNull", "true"); } } else { OrderCancel orderCancel = cancelOrder(orderID, false); if(orderCancel != null) { setProperty("orderCancelNull", "false"); } else { setProperty("orderCancelNull", "true"); } } } setProperty("allOrdersCanceled", String.valueOf(cancelAllOrders())); } /** * Executes the tests for <code>cancelReplace</code>. * * @param inEvent an <code>Object</code> value passed to this strategy */ private void doCancelReplaceTest(Object inEvent) { String orderIDString = getProperty("orderID"); String shouldSkipSend = getProperty("skipSubmitOrders"); String shouldDelaySend = getProperty("delaySubmitOrders"); OrderID orderID; if(orderIDString == null || orderIDString.isEmpty()) { orderID = null; } else { orderID = new OrderID(orderIDString); } OrderReplace newOrder; if(inEvent instanceof OrderSingle) { newOrder = cancelReplace(orderID, (OrderSingle)inEvent, (shouldSkipSend == null ? true : false)); if(shouldDelaySend != null) { newOrder.setQuantity(newOrder.getQuantity().add(BigDecimal.ONE)); send(newOrder); } } else { newOrder = cancelReplace(orderID, null, true); } setProperty("newOrderID", (newOrder == null ? null : newOrder.getOrderID().toString())); } /** * Sends an order based on test parameters. * * @param inShouldSendOrder a <code>boolean</code> value indicating whether the order should be * sent or <code>null</code> should be sent instead */ private void doOrderSend(boolean inShouldSendOrder) { if(inShouldSendOrder) { OrderSingle order = Factory.getInstance().createOrderSingle(); order.setAccount(getProperty("account")); String orderType = getProperty("orderType"); if(orderType != null) { order.setOrderType(OrderType.valueOf(orderType)); } String price = getProperty("price"); if(price != null) { order.setPrice(new BigDecimal(price)); } String quantity = getProperty("quantity"); if(quantity != null) { order.setQuantity(new BigDecimal(quantity)); } String side = getProperty("side"); if(side != null) { order.setSide(Side.valueOf(side)); } String symbol = getProperty("symbol"); if(symbol != null) { order.setInstrument(new Equity(symbol)); } String timeInForce = getProperty("timeInForce"); if(timeInForce != null) { order.setTimeInForce(TimeInForce.valueOf(timeInForce)); } setProperty("orderID", order.getOrderID().toString()); setProperty("transactTime", Long.toString(System.currentTimeMillis())); if(send(order)) { setProperty("sendResult", "true"); } else { setProperty("sendResult", "false"); } } else { send(null); } } }