package org.marketcetera.strategy;
import java.util.ArrayList;
import java.util.List;
import org.marketcetera.event.AskEvent;
import org.marketcetera.event.BidEvent;
import org.marketcetera.event.DividendEvent;
import org.marketcetera.event.MarketstatEvent;
import org.marketcetera.event.TradeEvent;
import org.marketcetera.module.DataFlowID;
import org.marketcetera.module.DataRequest;
import org.marketcetera.module.ModuleURN;
import org.marketcetera.strategy.java.Strategy;
import org.marketcetera.trade.ExecutionReport;
import org.marketcetera.trade.OrderCancelReject;
/* $License$ */
/**
* Tests a strategy's ability to create custom data flows.
*
* @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a>
* @version $Id: DataFlow.java 16154 2012-07-14 16:34:05Z colin $
* @since 2.0.0
*/
public class DataFlow
extends Strategy
{
/* (non-Javadoc)
* @see org.marketcetera.strategy.java.Strategy#onStart()
*/
@Override
public void onStart()
{
dataFlowID = doDataFlow();
if(dataFlowID != null) {
setProperty("dataFlowID",
dataFlowID.getValue());
}
}
/* (non-Javadoc)
* @see org.marketcetera.strategy.java.Strategy#onStop()
*/
@Override
public void onStop()
{
boolean shouldSkipCancel = Boolean.parseBoolean(getParameter("shouldSkipCancel"));
if(dataFlowID != null &&
!shouldSkipCancel) {
cancelDataFlow(dataFlowID);
setProperty("dataFlowStopped",
"true");
}
boolean shouldMakeNewRequest = Boolean.parseBoolean(getParameter("shouldMakeNewRequest"));
if(shouldMakeNewRequest) {
setProperty("newDataFlowAttempt",
"false");
DataFlowID newDataFlowID = doDataFlow();
setProperty("newDataFlowAttempt",
"true");
if(newDataFlowID == null) {
setProperty("newDataFlowID",
"null");
} else {
setProperty("newDataFlowID",
newDataFlowID.getValue());
}
}
}
/* (non-Javadoc)
* @see org.marketcetera.strategy.java.Strategy#onOther(java.lang.Object)
*/
@Override
public void onOther(Object inEvent)
{
send(inEvent);
}
/* (non-Javadoc)
* @see org.marketcetera.strategy.java.Strategy#onAsk(org.marketcetera.event.AskEvent)
*/
@Override
public void onAsk(AskEvent inAsk)
{
send(inAsk);
}
/* (non-Javadoc)
* @see org.marketcetera.strategy.java.Strategy#onBid(org.marketcetera.event.BidEvent)
*/
@Override
public void onBid(BidEvent inBid)
{
send(inBid);
}
/* (non-Javadoc)
* @see org.marketcetera.strategy.java.Strategy#onCallback(java.lang.Object)
*/
@Override
public void onCallback(Object inData)
{
boolean shouldCancelDataFlow = Boolean.parseBoolean(getParameter("shouldCancelDataFlow"));
if(shouldCancelDataFlow) {
if(inData instanceof DataFlowID) {
DataFlowID localDataFlowID = (DataFlowID)inData;
cancelDataFlow(localDataFlowID);
setProperty("localDataFlowStopped",
"true");
}
}
}
/* (non-Javadoc)
* @see org.marketcetera.strategy.java.Strategy#onCancelReject(org.marketcetera.trade.OrderCancelReject)
*/
@Override
public void onCancelReject(OrderCancelReject inCancel)
{
send(inCancel);
}
/* (non-Javadoc)
* @see org.marketcetera.strategy.java.Strategy#onExecutionReport(org.marketcetera.trade.ExecutionReport)
*/
@Override
public void onExecutionReport(ExecutionReport inExecutionReport)
{
send(inExecutionReport);
}
/* (non-Javadoc)
* @see org.marketcetera.strategy.java.Strategy#onMarketstat(org.marketcetera.event.MarketstatEvent)
*/
@Override
public void onMarketstat(MarketstatEvent inStatistics)
{
send(inStatistics);
}
/* (non-Javadoc)
* @see org.marketcetera.strategy.java.Strategy#onTrade(org.marketcetera.event.TradeEvent)
*/
@Override
public void onTrade(TradeEvent inTrade)
{
send(inTrade);
}
/* (non-Javadoc)
* @see org.marketcetera.strategy.java.Strategy#onDividend(org.marketcetera.event.DividendEvent)
*/
@Override
public void onDividend(DividendEvent inDividend)
{
send(inDividend);
}
/**
* Sets up the data flow as dictated by strategy parameters.
*
* @return a <code>DataFlowID</code> containing the data flow ID or <code>null</code> if the
* data flow could not be established
*/
private DataFlowID doDataFlow()
{
String baseURNList = getParameter("urns");
boolean routeToSink = Boolean.parseBoolean(getParameter("routeToSink"));
List<DataRequest> requests = new ArrayList<DataRequest>();
if(baseURNList != null) {
String[] urns = baseURNList.split(",");
for(String urn : urns) {
requests.add(new DataRequest(new ModuleURN(urn)));
}
if(getParameter("useStrategyURN") != null) {
if(routeToSink) {
requests.add(new DataRequest(getURN(),
OutputType.ALL));
} else {
requests.add(new DataRequest(getURN()));
}
}
}
return createDataFlow(routeToSink,
baseURNList == null ? null : requests.toArray(new DataRequest[0]));
}
/**
* data flow ID of the data flow created when the strategy starts
*/
private DataFlowID dataFlowID = null;
}