Java获取IB Gateway市场数据

158 阅读1分钟

以下是一个使用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,然后从中提取出所需的数据。

以上代码仅供参考,实际使用中需要根据具体情况进行修改和优化。