package com.quantcomponents.ib; import java.net.ConnectException; import java.util.Deque; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.naming.ConfigurationException; import com.quantcomponents.algo.IExecutionService; import com.quantcomponents.algo.IOrder; import com.quantcomponents.algo.IOrderStatusListener; import com.quantcomponents.algo.IPositionListener; import com.quantcomponents.algo.ITrade; import com.quantcomponents.core.exceptions.RequestFailedException; import com.quantcomponents.core.model.BarSize; import com.quantcomponents.core.model.DataType; import com.quantcomponents.core.model.IContract; import com.quantcomponents.core.model.ITaskMonitor; import com.quantcomponents.core.utils.HostUtils; import com.quantcomponents.marketdata.IRealTimeMarketDataManager; import com.quantcomponents.marketdata.IStockDatabaseContainerFactory; import com.quantcomponents.marketdata.RealTimeMarketDataManager; public class IBAdapterComponent extends RealTimeMarketDataManager implements IRealTimeMarketDataManager, IExecutionService { private static final Logger logger = Logger.getLogger(IBAdapterComponent.class.getName()); private static final String PRETTY_NAME = "InteractiveBrokers@" + HostUtils.hostname(); private static final String IB_DB_ID = "ib"; public static final String HOST_KEY = "host"; public static final String PORT_KEY = "port"; public static final String CLIENT_ID_KEY = "clientId"; public static final String ACCOUNT_ID_KEY = "accountId"; public static final String FIRST_REQUEST_NO_KEY = "firstRequestNo"; public static final String NO_MKT_DATA_LINES_KEY = "noMktDataLinesKey"; private volatile IStockDatabaseContainerFactory stockDatabaseContainerFactory; private volatile IBAdapter ibAdapter; public void setStockDatabaseContainerFactory(IStockDatabaseContainerFactory stockDatabaseContainerFactory) { this.stockDatabaseContainerFactory = stockDatabaseContainerFactory; } public void activate(Map<?,?> properties) throws Exception { logger.log(Level.INFO, "Received new configuration: "); for (Object key : properties.keySet()) { logger.log(Level.INFO, key + " -> " + properties.get(key)); } String host = (String) properties.get(HOST_KEY); if (host == null) { throw new ConfigurationException("Property not set: " + HOST_KEY); } Object portValue = properties.get(PORT_KEY); if (portValue == null) { throw new ConfigurationException("Property not set: " + PORT_KEY); } Integer port = parsePropertyValue(portValue); Object clientIdValue = properties.get(CLIENT_ID_KEY); if (clientIdValue == null) { throw new ConfigurationException("Property not set: " + CLIENT_ID_KEY); } Integer clientId = parsePropertyValue(clientIdValue); String accountId = (String) properties.get(ACCOUNT_ID_KEY); if (accountId == null) { throw new ConfigurationException("Property not set: " + ACCOUNT_ID_KEY); } Object firstRequestNoValue = properties.get(FIRST_REQUEST_NO_KEY); if (firstRequestNoValue == null) { firstRequestNoValue = 0; } Integer firstRequestNo = parsePropertyValue(firstRequestNoValue); Object noMktDataLinesKeyValue = properties.get(NO_MKT_DATA_LINES_KEY); if (noMktDataLinesKeyValue == null) { noMktDataLinesKeyValue = 0; } Integer noMktDataLinesKey = parsePropertyValue(noMktDataLinesKeyValue); ibAdapter = new IBAdapter(host, port, clientId, firstRequestNo, noMktDataLinesKey, accountId); setMarketDataProvider(ibAdapter); setStockDatabaseContainer(stockDatabaseContainerFactory.getInstance(IB_DB_ID)); } public void deactivate() { ibAdapter.disconnect(); } private Integer parsePropertyValue(Object propertyValue) { if (propertyValue instanceof Integer) { return (Integer) propertyValue; } else if (propertyValue instanceof String) { String str = (String) propertyValue; return Integer.parseInt(str); } return null; } @Override public DataType[] availableDataTypes() { return ibAdapter.availableDataTypes(); } @Override public BarSize[] availableBarSizes() { return ibAdapter.availableBarSizes(); } @Override public Deque<ITrade> getTrades() throws ConnectException, RequestFailedException { return ibAdapter.getTrades(); } @Override public List<IContract> searchContracts(IContract criteria, ITaskMonitor taskMonitor) throws ConnectException, RequestFailedException { return ibAdapter.searchContracts(criteria, taskMonitor); } @Override public String sendOrder(IOrder order) throws ConnectException, RequestFailedException { return ibAdapter.sendOrder(order); } @Override public String[] sendBracketOrders(IOrder parent, IOrder[] children) throws ConnectException, RequestFailedException { return ibAdapter.sendBracketOrders(parent, children); } @Override public void addOrderStatusListener(IOrderStatusListener listener) throws ConnectException { ibAdapter.addOrderStatusListener(listener); } @Override public void removeOrderStatusListener(IOrderStatusListener listener) throws ConnectException { ibAdapter.removeOrderStatusListener(listener); } @Override public void addPositionListener(IPositionListener listener) throws ConnectException { ibAdapter.addPositionListener(listener); } @Override public void removePositionListener(IPositionListener listener) throws ConnectException { ibAdapter.removePositionListener(listener); } @Override public String getPrettyName() { return PRETTY_NAME; } }