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 process_security_list(self, security_list): no_related_sym = quickfix.NoRelatedSym() symbol_field = quickfix.Symbol() security_list.getField(no_related_sym) number_of_instruments = int(no_related_sym.getValue()) for i in range(number_of_instruments): group = quickfix.Group(no_related_sym.getField(), symbol_field.getField()) security_list.getGroup(i + 1, group) group.getField(symbol_field) security_exchange = quickfix.SecurityExchange() group.getField(security_exchange) exchange = security_exchange.getValue() symbol = symbol_field.getValue() instrument = self.reference_data.ins_instrument(exchange, symbol) print("New Instrument : " + str(instrument)) text_field = quickfix.Text() if group.isSetField(text_field): group.getField(text_field) text = str(text_field.getValue()) ref_data = json.loads(text) self.reference_data.ins_reference_data(instrument, ref_data)
def onMessage(self, message, sessionID): msg_type = get_header_value(message, fix.MsgType()) if msg_type == fix.MsgType_MarketDataRequest: group = fix44.MarketDataRequest.NoRelatedSym() group_count = get_field_value(message, fix.NoRelatedSym()) for group_idx in range(1, group_count + 1): message.getGroup(group_idx, group) symbol = get_field_value(group, fix.Symbol()) if not sessionID.getTargetCompID().getString() in self.marketSubscribers[symbol]: self.marketSubscribers[symbol].append(sessionID.getTargetCompID().getString())
def __remove_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): message.getGroup(i + 1, no_related_symbols) no_related_symbols.getField(symbol) sym = symbol.getValue() if sym in self.clients: self.clients[sym].remove(sessionID)
def onMessage_SecurityList(self) -> dict: group = fix50.SecurityList().NoRelatedSym() # print(group) mktSegmentID = self.getValue(fix.MarketSegmentID()) noRelatedSym = self.getValue(fix.NoRelatedSym()) mktSegment = {} tickerData = {} #allSecurities = {} for tickers in range(1, noRelatedSym + 1): self.message.getGroup(tickers, group) aux = { 'symbol': self.getValueGroup(group, fix.Symbol()), 'factor': self.getValueGroup(group, fix.Factor()), 'securityDesc': self.getValueGroup(group, fix.SecurityDesc()), 'cfiCode': self.getValueGroup(group, fix.CFICode()), 'contractMultiplier': self.getValueGroup(group, fix.ContractMultiplier()), 'minPriceIncrement': self.getValueGroup(group, fix.MinPriceIncrement()), 'tickSize': group.getField(5023), 'instrumentPricePrecision': group.getField(5514), 'instrumentSizePrecision': group.getField(7117), 'currency': self.getValueGroup(group, fix.Currency()), 'maxTradeVol': self.getValueGroup(group, fix.MaxTradeVol()), 'minTradeVol': self.getValueGroup(group, fix.MinTradeVol()), 'lowLimitPrice': self.getValueGroup(group, fix.LowLimitPrice()), 'highLimitPrice': self.getValueGroup(group, fix.HighLimitPrice()) } tickerData[self.getValueGroup(group, fix.Symbol())] = aux mktSegment[mktSegmentID] = tickerData # para unir todos los diccionarios en 1 #allSecurities[mktSegmentID] = mktSegment return mktSegment
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]
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): # pag 63 msg = fix50.MarketDataRequest() header = msg.getHeader() # header.setField(fix.BeginString(fix.BeginString_FIXT11)) # header.setField(fix.MsgType(msgType)) header.setField(fix.SenderCompID("pjseoane232")) header.setField(fix.TargetCompID("ROFX")) # msg = self.buildMsgHeader("V") msg.setField(fix.MDReqID("ListaMktData2")) msg.setField(fix.SubscriptionRequestType('2')) msg.setField(fix.MarketDepth(1)) msg.setField(fix.MDUpdateType(0)) msg.setField(fix.AggregatedBook(True)) # msg.setField(fix.NoMDEntryTypes(2)) # ---- define Group group = fix50.MarketDataRequest().NoMDEntryTypes() group.setField(fix.MDEntryType('0')) msg.addGroup(group) # group = fix50.MarketDataRequest().NoMDEntryTypes() group.setField(fix.MDEntryType('1')) msg.addGroup(group) # group3 = fix50.MarketDataRequest().NoMDEntryTypes() # group3.setField(fix.MDEntryType('2')) # msg.addGroup(group3) # ----------------------------------------- msg.setField(fix.NoRelatedSym(1)) group = fix50.MarketDataRequest().NoRelatedSym() group.setField(fix.Symbol("RFX20Sep19")) msg.addGroup(group) fix.Session.sendToTarget(msg)