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 market_data_request(self, sender_comp_id, target_comp_id, symbols): md_types = [ fix.MDEntryType_BID, fix.MDEntryType_OFFER, fix.MDEntryType_TRADE ] message = fix44.MarketDataRequest() header = message.getHeader() header.setField(fix.SenderCompID(sender_comp_id)) header.setField(fix.TargetCompID(target_comp_id)) message.setField(fix.MDReqID(self._generate_id())) message.setField( fix.SubscriptionRequestType( fix.SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES)) # message.setField( # fix.SubscriptionRequestType( # fix.SubscriptionRequestType_SNAPSHOT # ) # ) """ Valid values: 0 = Full Book 1 = Top of Book N>1 = Report best N price tiers of data """ message.setField(fix.MarketDepth(0)) """ Valid values: 0 = Full Refresh 1 = Incremental Refresh """ message.setField(fix.MDUpdateType( fix.MDUpdateType_INCREMENTAL_REFRESH)) group = fix44.MarketDataRequest().NoMDEntryTypes() for md_type in md_types: group.setField(fix.MDEntryType(md_type)) message.addGroup(group) group = fix44.MarketDataRequest().NoRelatedSym() for symbol in symbols: group.setField(fix.Symbol(symbol)) message.addGroup(group) try: fix.Session.sendToTarget(message) except fix.SessionNotFound: raise Exception(f"No session found {message}, exiting...")
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 createOrderBookRequest(self): orderBookRequest = fix44.MarketDataRequest() noRelatedSym = fix44.MarketDataRequest.NoRelatedSym() noRelatedSym.setField(fix.Symbol('BTC/CNY')) orderBookRequest.addGroup(noRelatedSym) orderBookRequest.setField( fix.MDReqID("123")) # Unique ID assigned to this request orderBookRequest.setField( fix.SubscriptionRequestType('1')) # 0 = Snapshot # 1 = Snapshot + Subscribe # 2 Unsubscribe orderBookRequest.setField( fix.MDUpdateType(1)) # 0 = full refresh, 1: incremental refresh orderBookRequest.setField(fix.MarketDepth(0)) # 0 = full book, group1 = fix44.MarketDataRequest.NoMDEntryTypes() group1.setField(fix.MDEntryType('0')) # bids orderBookRequest.addGroup(group1) group2 = fix44.MarketDataRequest.NoMDEntryTypes() group2.setField(fix.MDEntryType('1')) # asks orderBookRequest.addGroup(group2) return orderBookRequest
def send_mkt_data_req(self, symbol): """ :param symbol: str """ print("send_mkt_data_req: ", symbol) message = fix44.MarketDataRequest() message.setField(fix.MDReqID(self.next_id())) message.setField( fix.SubscriptionRequestType( fix.SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES)) message.setField(fix.MarketDepth(3)) message.setField(fix.MDUpdateType( fix.MDUpdateType_INCREMENTAL_REFRESH)) symbol_group = fix44.MarketDataRequest.NoRelatedSym() symbol_group.setField(fix.Symbol(symbol)) message.addGroup(symbol_group) types = fix44.MarketDataRequest.NoMDEntryTypes() types.setField(fix.MDEntryType(fix.MDEntryType_BID)) message.addGroup(types) types = fix44.MarketDataRequest.NoMDEntryTypes() types.setField(fix.MDEntryType(fix.MDEntryType_OFFER)) message.addGroup(types) fix.Session_sendToTarget(message, self.sessionID)
def market_data_request(self): request = fix44.MarketDataRequest() request.setField(fix.MDReqID(self.gen_mdReqID())) request.setField(fix.MarketDepth(0)) request.setField(fix.SubscriptionRequestType('0')) group = fix44.MarketDataRequest().NoMDEntryTypes() group.setField(fix.MDEntryType('0')) request.addGroup(group) group.setField(fix.MDEntryType('1')) request.addGroup(group) group = fix44.MarketDataRequest().NoRelatedSym() group.setField(fix.Symbol('SNAP')) request.addGroup(group) fix.Session.sendToTarget(request, self.sessionID)
def GetMarketData(self): message = fix.Message() header = message.getHeader() header.setField(fix.MsgType(fix.MsgType_MarketDataRequest)) noRelatedSym = fix44.MarketDataRequest().NoRelatedSym() noRelatedSym.setField(fix.Symbol('XBTCNY')) message.addGroup(noRelatedSym) message.setField(fix.NoRelatedSym(1)) message.setField(fix.MDReqID('1')) message.setField(fix.SubscriptionRequestType('0')) message.setField(fix.MarketDepth(10)) group = fix44.MarketDataRequest().NoMDEntryTypes() group.setField(fix.MDEntryType('0')) message.addGroup(group) group.setField(fix.MDEntryType('1')) message.addGroup(group) group.setField(fix.MDEntryType('2')) message.addGroup(group) group.setField(fix.MDEntryType('3')) message.addGroup(group) group.setField(fix.MDEntryType('4')) message.addGroup(group) group.setField(fix.MDEntryType('5')) message.addGroup(group) group.setField(fix.MDEntryType('6')) message.addGroup(group) group.setField(fix.MDEntryType('7')) message.addGroup(group) group.setField(fix.MDEntryType('8')) message.addGroup(group) group.setField(fix.MDEntryType('9')) message.addGroup(group) group.setField(fix.MDEntryType('A')) message.addGroup(group) group.setField(fix.MDEntryType('B')) message.addGroup(group) group.setField(fix.MDEntryType('C')) message.addGroup(group) fix.Session.sendToTarget(message, self.sessionID)
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
def createLiveTradesRequest(self): liveTradesRequest = fix44.MarketDataRequest() noRelatedSym = fix44.MarketDataRequest.NoRelatedSym() noRelatedSym.setField(fix.Symbol("BTC/CNY")) liveTradesRequest.addGroup(noRelatedSym) liveTradesRequest.setField(fix.MDReqID("123")) liveTradesRequest.setField(fix.SubscriptionRequestType('1')) liveTradesRequest.setField(fix.MarketDepth(0)) group = fix44.MarketDataRequest.NoMDEntryTypes() group.setField(fix.MDEntryType('2')) # trade liveTradesRequest.addGroup(group) return liveTradesRequest
def __add_client(self, message, sessionID): no_of_symbols = fix.NoRelatedSym() no_related_symbols = fix44.MarketDataRequest().NoRelatedSym() message.getField(no_of_symbols) symbol = fix.Symbol() for i in range(no_of_symbols.getValue()): message.getGroup(i + 1, no_related_symbols) no_related_symbols.getField(symbol) sym = symbol.getValue() self.logger.debug( f"Got request for symbol {sym} from {sessionID}.") if sym in self.clients: self.clients[sym].append(sessionID) else: self.clients[sym] = [sessionID]