import java.math.BigDecimal;
import java.util.Date;
import java.util.Properties;
import org.marketcetera.client.brokers.BrokerStatus;
import org.marketcetera.event.AskEvent;
import org.marketcetera.event.QuoteEvent;
import org.marketcetera.event.BidEvent;
import org.marketcetera.event.DividendEvent;
import org.marketcetera.event.MarketstatEvent;
import org.marketcetera.event.Event;
import org.marketcetera.event.TradeEvent;
import org.marketcetera.marketdata.MarketDataRequestBuilder;
import org.marketcetera.trade.ExecutionReport;
import org.marketcetera.trade.Factory;
import org.marketcetera.trade.OrderCancelReject;
import org.marketcetera.trade.OrderSingle;
import org.marketcetera.util.test.UnicodeData;
public class JavaStrategy
extends org.marketcetera.strategy.java.Strategy
{
private int callbackCounter = 0;
@Override
public void onStart()
{
setProperty("onStartBegins",
Long.toString(System.currentTimeMillis()));
callbackCounter = 0;
String shouldFail = getParameter("shouldFailOnStart");
if(shouldFail != null) {
int x = 10 / 0;
}
String shouldLoop = getParameter("shouldLoopOnStart");
if(shouldLoop != null) {
while(true) {
String shouldStopLoop = getProperty("shouldStopLoop");
if(shouldStopLoop != null) {
break;
}
try {
Thread.sleep(100);
} catch (Exception e) {
// loop has been interrupted, stop onStart method
break;
}
}
setProperty("loopDone",
"true");
}
String marketDataSource = getParameter("shouldRequestData");
if(marketDataSource != null) {
String symbols = getParameter("symbols");
String content = getParameter("content");
if(content == null) {
content = "LATEST_TICK,TOP_OF_BOOK";
}
String stringAPI = getParameter("useStringAPI");
try {
if(stringAPI != null) {
setProperty("requestID",
Integer.toString(requestMarketData(MarketDataRequestBuilder.newRequest().withContent(content)
.withSymbols(symbols)
.withProvider(marketDataSource).create().toString())));
} else {
setProperty("requestID",
Integer.toString(requestMarketData(MarketDataRequestBuilder.newRequest().withContent(content)
.withSymbols(symbols)
.withProvider(marketDataSource).create())));
}
} catch (Exception e) {
e.printStackTrace();
}
}
if(getParameter("shouldRequestCEPData") != null) {
String cepDataSource = getParameter("source");
if(cepDataSource != null) {
String statementString = getParameter("statements");
String[] statements;
if(statementString != null) {
statements = statementString.split("#");
} else {
statements = null;
}
setProperty("requestID",
Integer.toString(requestCEPData(statements,
cepDataSource)));
}
}
doRequestParameterCallbacks();
doRequestPropertiesCallbacks();
if(getParameter("shouldNotify") != null) {
notifyLow("low subject",
Long.toString(System.nanoTime()));
notifyMedium("medium subject",
Long.toString(System.nanoTime()));
notifyHigh("high subject",
Long.toString(System.nanoTime()));
debug(null);
debug("");
debug("Some statement");
debug(UnicodeData.HOUSE_AR);
info(null);
info("");
info("Some statement");
info(UnicodeData.HOUSE_AR);
warn(null);
warn("");
warn("Some statement");
warn(UnicodeData.HOUSE_AR);
error(null);
error("");
error("Some statement");
error(UnicodeData.HOUSE_AR);
}
if(getProperty("askForBrokers") != null) {
int counter = 0;
for(BrokerStatus broker : getBrokers()) {
setProperty("" + counter++,
broker.toString());
}
}
Properties userdata = getUserData();
userdata.setProperty("onStart",
Long.toString(System.currentTimeMillis()));
setUserData(userdata);
setProperty("onStart",
Long.toString(System.currentTimeMillis()));
}
@Override
public void onStop()
{
setProperty("onStopBegins",
Long.toString(System.currentTimeMillis()));
String shouldFail = getProperty("shouldFailOnStop");
if(shouldFail != null) {
int x = 10 / 0;
}
String marketDataSource = getParameter("shouldRequestDataOnStop");
if(marketDataSource != null) {
String symbols = getParameter("symbols");
setProperty("requestID",
Long.toString(requestMarketData(MarketDataRequestBuilder.newRequest().withContent("LATEST_TICK")
.withSymbols(symbols)
.withProvider(marketDataSource).create())));
}
String shouldLoop = getParameter("shouldLoopOnStop");
if(shouldLoop != null) {
while(true) {
String shouldStopLoop = getProperty("shouldStopLoop");
if(shouldStopLoop != null) {
break;
}
try {
Thread.sleep(100);
} catch (Exception e) {
// thread has been interrupted
break;
}
}
setProperty("loopDone",
"true");
}
setProperty("onStop",
Long.toString(System.currentTimeMillis()));
}
@Override
public void onAsk(AskEvent ask)
{
String shouldFail = getParameter("shouldFailOnAsk");
if(shouldFail != null) {
int x = 10 / 0;
}
if(getParameter("shouldRequestCEPData") != null) {
suggestionFromEvent(ask);
}
setProperty("onAsk",
ask.toString());
}
@Override
public void onBid(BidEvent bid)
{
String shouldFail = getParameter("shouldFailOnBid");
if(shouldFail != null) {
int x = 10 / 0;
}
if(getParameter("shouldRequestCEPData") != null) {
suggestionFromEvent(bid);
}
setProperty("onBid",
bid.toString());
}
@Override
public void onMarketstat(MarketstatEvent statistics)
{
String shouldFail = getParameter("shouldFailOnStatistics");
if(shouldFail != null) {
int x = 10 / 0;
}
setProperty("onStatistics",
statistics.toString());
}
@Override
public void onCallback(Object data)
{
callbackCounter += 1;
String shouldCancel = getProperty("shouldCancel");
if(shouldCancel != null) {
String requestToCancel = getProperty("requestID");
cancelDataRequest(Integer.parseInt(requestToCancel));
}
String shouldFail = getParameter("shouldFailOnCallback");
if(shouldFail != null) {
int x = 10 / 0;
}
if(getParameter("shouldRequestCEPData") != null) {
cancelAllDataRequests();
}
setProperty("onCallback",
Integer.toString(callbackCounter));
}
@Override
public void onExecutionReport(ExecutionReport executionReport)
{
String shouldFail = getParameter("shouldFailOnExecutionReport");
if(shouldFail != null) {
int x = 10 / 0;
}
setProperty("onExecutionReport",
executionReport.toString());
}
@Override
public void onCancelReject(OrderCancelReject cancel)
{
String shouldFail = getParameter("shouldFailOnCancel");
if(shouldFail != null) {
int x = 10 / 0;
}
setProperty("onCancel",
cancel.toString());
}
@Override
public void onTrade(TradeEvent trade)
{
String shouldFail = getParameter("shouldFailOnTrade");
if(shouldFail != null) {
int x = 10 / 0;
}
if(getParameter("shouldRequestCEPData") != null) {
suggestionFromEvent(trade);
}
setProperty("onTrade",
trade.toString());
}
@Override
public void onOther(Object data)
{
String shouldFail = getParameter("shouldFailOnOther");
if(shouldFail != null) {
int x = 10 / 0;
}
if(getProperty("shouldCancelCEPData") != null) {
cancelDataRequest(Integer.parseInt(getProperty("requestID")));
}
setProperty("onOther",
data.toString());
}
@Override
public void onDividend(DividendEvent dividend)
{
String shouldFail = getParameter("shouldFailOnDividend");
if(shouldFail != null) {
int x = 10 / 0;
}
setProperty("onDividend",
dividend.toString());
}
private void doRequestParameterCallbacks()
{
doCallbacks(getParameter("shouldRequestCallbackAfter"),
getParameter("shouldRequestCallbackAt"),
getParameter("shouldRequestCallbackEvery"));
}
private void doRequestPropertiesCallbacks()
{
doCallbacks(getProperty("shouldRequestCallbackAfter"),
getProperty("shouldRequestCallbackAt"),
getProperty("shouldRequestCallbackEvery"));
}
private void doCallbacks(String callbackAfter,
String callbackAt,
String callbackEvery)
{
String shouldDoubleCallbacks = getParameter("shouldDoubleCallbacks");
int multiplier;
if(shouldDoubleCallbacks != null) {
multiplier = 2;
} else {
multiplier = 1;
}
String callbackDataIsNull = getParameter("callbackDataIsNull");
for(int i=1;i<=multiplier;i++) {
if(callbackDataIsNull != null) {
if(callbackAfter != null) {
requestCallbackAfter(Long.parseLong(callbackAfter),
null);
}
if(callbackAt != null) {
requestCallbackAt(new Date(Long.parseLong(callbackAt)),
null);
}
if(callbackEvery != null) {
String[] params = callbackEvery.split(",");
requestCallbackEvery(Long.parseLong(params[0]),
Long.parseLong(params[1]),
this);
}
} else {
if(callbackAfter != null) {
requestCallbackAfter(Long.parseLong(callbackAfter),
this);
}
if(callbackAt != null) {
requestCallbackAt(new Date(Long.parseLong(callbackAt)),
this);
}
if(callbackEvery != null) {
try {
String[] params = callbackEvery.split(",");
requestCallbackEvery(Long.parseLong(params[0]),
Long.parseLong(params[1]),
this);
} catch (Exception ex) {
ex.printStackTrace();
setProperty("callbackEveryException", ex.getClass().getName());
}
}
}
}
}
/**
* Creates a trade suggestion from the given event.
*
* @param inEvent an <code>Event</code> value
*/
private void suggestionFromEvent(Event inEvent)
{
OrderSingle suggestedOrder = Factory.getInstance().createOrderSingle();
if(inEvent instanceof QuoteEvent) {
QuoteEvent event = (QuoteEvent)inEvent;
suggestedOrder.setPrice(event.getPrice());
suggestedOrder.setInstrument(event.getInstrument());
suggestedOrder.setQuantity(event.getSize());
} else if(inEvent instanceof TradeEvent) {
TradeEvent event = (TradeEvent)inEvent;
suggestedOrder.setPrice(event.getPrice());
suggestedOrder.setInstrument(event.getInstrument());
suggestedOrder.setQuantity(event.getSize());
}
suggestTrade(suggestedOrder,
new BigDecimal("1.0"),
"CEP Event Received");
}
}