package sample;
import org.marketcetera.strategy.java.Strategy;
import org.marketcetera.event.AskEvent;
import org.marketcetera.event.BidEvent;
import org.marketcetera.trade.*;
import org.marketcetera.marketdata.MarketDataRequestBuilder;
import java.util.concurrent.atomic.AtomicBoolean;
/* $License$ */
/**
* Order Sender Strategy
*
* @author anshul@marketcetera.com
* @version $Id: OrderSender.java 16154 2012-07-14 16:34:05Z colin $
* @since 2.0.0
*/
public class OrderSender extends Strategy {
private static final String SYMBOLS = "AMZN"; // Depends on MD - can be other symbols
private static final String MARKET_DATA_PROVIDER = "marketcetera"; // Can be activ, bogus, marketcetera
private static final String ACCOUNT = "accountable";
/**
* Executed when the strategy is started.
* Use this method to set up data flows
* and other initialization tasks.
*/
@Override
public void onStart() {
mRequestID = requestMarketData(MarketDataRequestBuilder.newRequest().
withSymbols(SYMBOLS).
withProvider(MARKET_DATA_PROVIDER).create());
info("Issued Market Data Request " + mRequestID);
}
/**
* Executed when the strategy receives a bid event.
*
* @param inBid the bid event.
*/
@Override
public void onBid(BidEvent inBid) {
if(!mReceivedData.compareAndSet(false, true)) {
return;
}
info("Bid: " + inBid);
// Send an order to buy and cancel the request
OrderSingle order = Factory.getInstance().createOrderSingle();
order.setAccount(ACCOUNT);
order.setOrderType(OrderType.Limit);
order.setPrice(inBid.getPrice());
order.setQuantity(inBid.getSize());
order.setSide(Side.Buy);
order.setInstrument(inBid.getInstrument());
order.setTimeInForce(TimeInForce.Day);
warn("Sending Order " + order);
send(order);
warn("Sent Order:" + order);
cancelDataRequest(mRequestID);
info("Cancelled Market Data Request " + mRequestID);
}
/**
* Executed when the strategy receives an ask event.
*
* @param inAsk the ask event.
*/
@Override
public void onAsk(AskEvent inAsk) {
if(!mReceivedData.compareAndSet(false, true)) {
return;
}
info("Ask: " + inAsk);
// Send an order to Sell and cancel the request
OrderSingle order = Factory.getInstance().createOrderSingle();
order.setAccount(ACCOUNT);
order.setOrderType(OrderType.Limit);
order.setPrice(inAsk.getPrice());
order.setQuantity(inAsk.getSize());
order.setSide(Side.Sell);
order.setInstrument(inAsk.getInstrument());
order.setTimeInForce(TimeInForce.Day);
warn("Sending Order " + order);
send(order);
warn("Sent Order:" + order);
cancelDataRequest(mRequestID);
info("Cancelled Market Data Request " + mRequestID);
}
/**
* Executed when the strategy receives an execution report.
*
* @param inExecutionReport the execution report.
*/
@Override
public void onExecutionReport(ExecutionReport inExecutionReport) {
warn("Received Execution Report:" + inExecutionReport);
}
private int mRequestID;
private final AtomicBoolean mReceivedData = new AtomicBoolean();
}