def compose_market_data_request(self): market_data_request = quickfix44.MarketDataRequest() market_data_request.setField(quickfix.MDReqID('1')) market_data_request.setField(quickfix.SubscriptionRequestType(quickfix.SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES)) market_data_request.setField(quickfix.MarketDepth(0)) market_data_request.setField(quickfix.NoMDEntryTypes(2)) market_data_request.setField(quickfix.MDUpdateType(quickfix.MDUpdateType_INCREMENTAL_REFRESH)) group = quickfix44.MarketDataRequest().NoMDEntryTypes() group.setField(quickfix.MDEntryType(quickfix.MDEntryType_BID)) market_data_request.addGroup(group) group.setField(quickfix.MDEntryType(quickfix.MDEntryType_OFFER)) market_data_request.addGroup(group) market_data_request.setField(quickfix.NoRelatedSym(self.reference_data.get_count())) symbol = quickfix44.MarketDataRequest().NoRelatedSym() for instrument in self.reference_data.get_instruments(): symbol.setField(quickfix.SecurityExchange(instrument.exchange)) symbol.setField(quickfix.Symbol(instrument.symbol)) market_data_request.addGroup(symbol) return market_data_request
def onLogon(self, sessionID): self.sessionID = sessionID print("onLogon - sessionID: " + sessionID.toString()) currency_pairs = ['GBP/USD', 'EUR/USD'] for ccy in currency_pairs: mdr = fix.Message() mdr.getHeader().setField(fix.BeginString(fix.BeginString_FIX44)) mdr.getHeader().setField(fix.MsgType(fix.MsgType_MarketDataRequest)) current_milli_time = lambda: int(round(time.time() * 1000)) mdr.setField(fix.MDReqID(str(current_milli_time()))) # a random string mdr.setField(fix.SubscriptionRequestType(fix.SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES)) # what stater required mdr.setField(fix.MarketDepth(1)) # what stater required mdr.setField(fix.AggregatedBook(True)) mdr.setField(fix.NoMDEntryTypes(1)) # what stater required mdr.setField(fix.MDUpdateType(fix.MDUpdateType_INCREMENTAL_REFRESH)) # what stater required group = fix44.MarketDataRequest().NoMDEntryTypes() group.setField(fix.MDEntryType(fix.MDEntryType_BID)) mdr.addGroup(group) group.setField(fix.MDEntryType(fix.MDEntryType_OFFER)) mdr.addGroup(group) mdr.setField(fix.NoRelatedSym(1)) symbol = fix44.MarketDataRequest().NoRelatedSym() symbol.setField(fix.Symbol(ccy)) mdr.addGroup(symbol) fix.Session.sendToTarget(mdr, sessionID)
def on_market_data_request(self, message): print('Market Data REQUEST!') message_fields = { 'md_reqID': fix.MDReqID(), 'depth': fix.MarketDepth(), 'subscription_type': fix.SubscriptionRequestType(), } message_details = {} for k, v in message_fields.items(): message_details[k] = self.get_field_value(message, v) message_details['entry_types'] = {} message_details['symbols'] = {} n_entry_types = self.get_field_value(message, fix.NoMDEntryTypes()) group = fix44.MarketDataRequest().NoMDEntryTypes() for i in range(n_entry_types): message.getGroup(i + 1, group) message_details['entry_types'][i] = self.get_field_value( group, fix.MDEntryType()) n_symbols = self.get_field_value(message, fix.NoRelatedSym()) group = fix44.MarketDataRequest().NoRelatedSym() for i in range(n_symbols): message.getGroup(i + 1, group) message_details['symbols'][i] = self.get_field_value( group, fix.Symbol()) orderID = self.gen_orderID() self.orders[orderID] = message_details # testing self.test_snaps(message_details, full=True) self.test_snaps(message_details, full=False)
def main(): sessionID = fix.SessionID('FIX.4.4', SENDERCOMPID, 'PAYMIUM') params = fix.Dictionary() params.setString('ConnectionType', 'initiator') params.setString('StartTime', '00:00:00') params.setString('EndTime', '00:00:00') params.setString('HeartBtInt', '30') params.setString('CheckLatency', 'Y') params.setString('SocketConnectHost', '195.154.171.115') params.setString('SocketConnectPort', '8359') params.setString('DataDictionary', FIX44FILE) params.setString('EncryptMethod', '0') settings = fix.SessionSettings() settings.set(sessionID, params) application = MyApplication() factory = fix.FileStoreFactory("store") acceptor = fix.SocketInitiator(application, factory, settings, fix.ScreenLogFactory(DEBUG, DEBUG, DEBUG)) acceptor.start() time.sleep(2) mdr = fixMsg.MarketDataRequest() mdr.setField(fix.MDReqID("MDRQ-%d" % (time.time() * 1000000))) # We want the full book here, not just the top mdr.setField(fix.MarketDepth(1)) # We want to get a snapshot and also subscribe to the market depth updates mdr.setField( fix.SubscriptionRequestType( fix.SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES)) # We'll want only incremental refreshes when new data is available mdr.setField(fix.MDUpdateType(fix.MDUpdateType_INCREMENTAL_REFRESH)) # Specify the currency instruments = fixMsg.MarketDataRequest().NoRelatedSym() instruments.setField(fix.Symbol("EUR/XBT")) mdr.addGroup(instruments) # Specify that we'll want the bids and asks mdr.setField(fix.NoMDEntryTypes(2)) group = fixMsg.MarketDataRequest().NoMDEntryTypes() group.setField(fix.MDEntryType(fix.MDEntryType_BID)) group.setField(fix.MDEntryType(fix.MDEntryType_OFFER)) mdr.addGroup(group) fix.Session.sendToTarget(mdr, sessionID) while True: time.sleep(10) acceptor.stop()
def send_market_data_request(self, symbol): """Sends a market data request to server Args: symbol (string): the ticker symbol of a stock Returns: """ # Create Fix Message for Market Data Request message = fix.Message(); header = message.getHeader(); header.setField(fix.MsgType(fix.MsgType_MarketDataRequest)) header.setField(fix.SendingTime()) message.setField(fix.MDReqID(str(self.client_database_handler.generate_market_data_request_id()))) message.setField(fix.SubscriptionRequestType(fix.SubscriptionRequestType_SNAPSHOT)) message.setField(fix.MarketDepth(1)) message.setField(fix.NoMDEntryTypes(10)) group_md_entry = fix42.MarketDataRequest().NoMDEntryTypes() group_md_entry.setField(fix.MDEntryType(fix.MDEntryType_BID)) message.addGroup(group_md_entry) group_md_entry.setField(fix.MDEntryType(fix.MDEntryType_OFFER)) message.addGroup(group_md_entry) group_md_entry.setField(fix.MDEntryType(fix.MDEntryType_TRADE)) message.addGroup(group_md_entry) group_md_entry.setField(fix.MDEntryType(fix.MDEntryType_OPENING_PRICE)) message.addGroup(group_md_entry) group_md_entry.setField(fix.MDEntryType(fix.MDEntryType_CLOSING_PRICE)) message.addGroup(group_md_entry) group_md_entry.setField(fix.MDEntryType(fix.MDEntryType_TRADING_SESSION_HIGH_PRICE)) message.addGroup(group_md_entry) group_md_entry.setField(fix.MDEntryType(fix.MDEntryType_TRADING_SESSION_LOW_PRICE)) message.addGroup(group_md_entry) group_symbol = fix42.MarketDataRequest().NoRelatedSym() group_symbol.setField(fix.Symbol(symbol)) message.addGroup(group_symbol) # Send Fix Message to Server fix.Session.sendToTarget(message, self.fix_application.sessionID) return
def marketDataRequest(self, ticker, subscription_type): mdr = fix.Message() mdr.getHeader().setField(fix.BeginString(fix.BeginString_FIX44)) mdr.getHeader().setField(fix.MsgType(fix.MsgType_MarketDataRequest)) group = fix44.MarketDataRequest().NoRelatedSym() group.setField(fix.Symbol(ticker)) mdr.addGroup(group) mdr.setField(fix.MDReqID('1')) mdr.setField(fix.SubscriptionRequestType(subscription_type)) mdr.setField(fix.MarketDepth(0)) mdr.setField(fix.NoMDEntryTypes(3)) group = fix44.MarketDataRequest().NoMDEntryTypes() group.setField(fix.MDEntryType(fix.MDEntryType_BID)) mdr.addGroup(group) group.setField(fix.MDEntryType(fix.MDEntryType_OFFER)) mdr.addGroup(group) group.setField(fix.MDEntryType(fix.MDEntryType_TRADE)) mdr.addGroup(group) fix.Session.sendToTarget(mdr, self.sessionID) return