以下是一个使用Java获取市场数据的示例:
import quickfix.; import quickfix.fix44.;
public class IBGatewayFIXClient implements Application {
public void onCreate(SessionID sessionID) {
System.out.println("Session created: " + sessionID);
}
public void onLogon(SessionID sessionID) {
System.out.println("Logged on: " + sessionID);
requestMarketData(sessionID);
}
public void onLogout(SessionID sessionID) {
System.out.println("Logged out: " + sessionID);
}
public void toAdmin(Message message, SessionID sessionID) {
System.out.println("To admin: " + message);
}
public void fromAdmin(Message message, SessionID sessionID) {
System.out.println("From admin: " + message);
}
public void toApp(Message message, SessionID sessionID) {
System.out.println("To app: " + message);
}
public void fromApp(Message message, SessionID sessionID) {
System.out.println("From app: " + message);
if (message instanceof MarketDataSnapshotFullRefresh) {
MarketDataSnapshotFullRefresh marketData = (MarketDataSnapshotFullRefresh) message;
System.out.println("Symbol: " + marketData.getSymbol().getValue());
System.out.println("Bid price: " + marketData.getMDEntries().get(0).getMDEntryPx().getValue());
System.out.println("Bid size: " + marketData.getMDEntries().get(0).getMDEntrySize().getValue());
System.out.println("Ask price: " + marketData.getMDEntries().get(1).getMDEntryPx().getValue());
System.out.println("Ask size: " + marketData.getMDEntries().get(1).getMDEntrySize().getValue());
}
}
private void requestMarketData(SessionID sessionID) {
MarketDataRequest marketDataRequest = new MarketDataRequest();
marketDataRequest.set(new MDReqID("123"));
marketDataRequest.set(new SubscriptionRequestType(SubscriptionRequestType.SNAPSHOT_PLUS_UPDATES));
marketDataRequest.set(new MarketDepth(1));
marketDataRequest.set(new MDUpdateType(MDUpdateType.INCREMENTAL_REFRESH));
marketDataRequest.set(new NoMDEntryTypes(2));
marketDataRequest.set(new MDEntryType(MDEntryType.BID));
marketDataRequest.set(new MDEntryType(MDEntryType.OFFER));
marketDataRequest.set(new Symbol("AAPL"));
marketDataRequest.set(new SecurityExchange("SMART"));
marketDataRequest.set(new SecurityType(SecurityType.COMMON_STOCK));
Session.sendToTarget(marketDataRequest, sessionID);
}
public static void main(String[] args) throws ConfigError {
SessionSettings settings = new SessionSettings("config.cfg");
Application application = new IBGatewayFIXClient();
FileStoreFactory storeFactory = new FileStoreFactory(settings);
FileLogFactory logFactory = new FileLogFactory(settings);
DefaultMessageFactory messageFactory = new DefaultMessageFactory();
SocketInitiator initiator = new SocketInitiator(application, storeFactory, settings, logFactory, messageFactory);
initiator.start();
}
} 以上代码中我们使用了MarketDataRequest消息来请求市场数据。我们设置了订阅类型为SNAPSHOT_PLUS_UPDATES,表示我们希望获取市场数据的快照和更新。我们还设置了市场深度为1,表示我们只需要获取最佳买价和最佳卖价。最后,我们在onLogon方法中发送了MarketDataRequest消息。
需要注意的是,在订阅市场数据时需要设置正确的Symbol、SecurityExchange和SecurityType等信息,否则可能无法获取到数据。另外,在处理从IB Gateway返回的市场数据时,需要判断消息类型是否为MarketDataSnapshotFullRefresh,然后从中提取出所需的数据。
以上代码仅供参考,实际使用中需要根据具体情况进行修改和优化。