除了连接和交易,IB Gateway还提供了许多其他功能,例如获取市场数据、查询账户信息等。以下是一个使用Python获取市场数据的示例:
import quickfix as fix import time
class IBGatewayFIXClient(fix.Application):
def onCreate(self, sessionID):
print("Session created:", sessionID)
def onLogon(self, sessionID):
print("Logged on:", sessionID)
def onLogout(self, sessionID):
print("Logged out:", sessionID)
def toAdmin(self, message, sessionID):
print("To admin:", message)
def fromAdmin(self, message, sessionID):
print("From admin:", message)
def toApp(self, message, sessionID):
print("To app:", message)
def fromApp(self, message, sessionID):
print("From app:", message)
def requestMarketData(self):
sessionID = fix.Session.lookupSession("FIX.4.4:CLIENT->IBGATEWAY")
marketDataRequest = fix.Message()
marketDataRequest.getHeader().setField(fix.BeginString("FIX.4.4"))
marketDataRequest.getHeader().setField(fix.MsgType("V"))
marketDataRequest.setField(fix.MDReqID("123"))
marketDataRequest.setField(fix.SubscriptionRequestType(fix.SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES))
marketDataRequest.setField(fix.MarketDepth(1))
marketDataRequest.setField(fix.Symbol("AAPL"))
marketDataRequest.setField(fix.SecurityExchange("SMART"))
marketDataRequest.setField(fix.SecurityType(fix.SecurityType_COMMON_STOCK))
fix.Session.sendToTarget(marketDataRequest, sessionID)
def sendMarketDataRequest(self):
sessionID = fix.Session.lookupSession("FIX.4.4:CLIENT->IBGATEWAY")
marketDataRequest = fix.Message()
marketDataRequest.getHeader().setField(fix.BeginString("FIX.4.4"))
marketDataRequest.getHeader().setField(fix.MsgType("V"))
marketDataRequest.setField(fix.MDReqID("123"))
marketDataRequest.setField(fix.SubscriptionRequestType(fix.SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES))
marketDataRequest.setField(fix.MarketDepth(1))
marketDataRequest.setField(fix.Symbol("AAPL"))
marketDataRequest.setField(fix.SecurityExchange("SMART"))
marketDataRequest.setField(fix.SecurityType(fix.SecurityType_COMMON_STOCK))
marketDataRequest.setField(fix.NoMDEntryTypes(2))
marketDataRequest.setField(fix.MDEntryType(0, fix.MDEntryType_BID))
marketDataRequest.setField(fix.MDEntryType(1, fix.MDEntryType_OFFER))
fix.Session.sendToTarget(marketDataRequest, sessionID)
if name == 'main': settings = fix.SessionSettings("config.cfg") application = IBGatewayFIXClient() storeFactory = fix.FileStoreFactory(settings) logFactory = fix.FileLogFactory(settings) messageFactory = fix.DefaultMessageFactory() initiator = fix.SocketInitiator(application, storeFactory, settings, logFactory, messageFactory) initiator.start() time.sleep(5) # Wait for connection to be established application.requestMarketData() time.sleep(5) # Wait for market data to be received initiator.stop() 以上代码中我们使用了MarketDataRequest消息来请求市场数据。我们设置了订阅类型为SNAPSHOT_PLUS_UPDATES,表示我们希望获取市场数据的快照和更新。我们还设置了市场深度为1,表示我们只需要获取最佳买价和最佳卖价。最后,我们在main方法中启动了SocketInitiator并发送了MarketDataRequest消息。
需要注意的是,由于IB Gateway的FIX接口使用的是FIX 4.4协议,因此我们需要在消息中设置BeginString为FIX.4.4。另外,在订阅市场数据时需要设置正确的Symbol、SecurityExchange和SecurityType等信息,否则可能无法获取到数据。
以上代码仅供参考,实际使用中需要根据具体情况进行修改和优化。