def quote_response(self,quote_req_id,quote_id,quote_resp_type,symbol,product,side,dealer_id,price=None,currency = None,quantity = None): #HEADER quote_resp = fix50sp2.QuoteRequest() quote_resp.getHeader().setField(fix.StringField(8,'FIXT.1.1')) #BeginMessage quote_resp.getHeader().setField(fix.StringField(35,'AJ'))#MessageType quote_resp.getHeader().setField(fix.StringField(1128,'9')) #ApplVerID - FIX50SP2 quote_resp.getHeader().setField(fix.StringField(49,'ORP_RESZ_B')) quote_resp.getHeader().setField(fix.StringField(56,'BLPORPBETA')) quote_resp.getHeader().setField(fix.StringField(128,'DOR')) quote_resp.getHeader().setField(fix.SendingTime(1))#52 quote_resp.getHeader().setField(fix.StringField(1156,'208'))#ApplExtID quote_resp.getHeader().setField(fix.StringField(1129,'1.5'))#CstmApplVerID quote_resp.getHeader().setField(fix.SendingTime(1)) #BODY quote_resp.setField(fix.QuoteRespID(quote_req_id[:-4] + 'RESP' + self.genOrderID()))#693 quote_resp.setField(fix.QuoteReqID(quote_req_id)) #131 quote_resp.setField(fix.QuoteRespType(quote_resp_type))#694 quote_resp.setField(fix.Symbol(symbol))#55 quote_resp.setField(fix.Product(int(product)))#460 quote_resp.setField(fix.Side(side))#54 quote_resp.setField(fix.StringField(167,'FXSPOT')) print(datetime.datetime.utcnow().strftime('%Y%m%d-%H:%M:%S')) quote_resp.setField(fix.StringField(60,datetime.datetime.utcnow().strftime('%Y%m%d-%H:%M:%S')))#60 # quote_resp.setField(fix.TransactTime(1))#60 quote_resp.setField(fix.SettlType('0'))#63 settl_date = datetime.datetime.utcnow()+BDay(n=2) quote_resp.setField(fix.SettlDate(settl_date.strftime('%Y%m%d')))#64 if quote_resp_type == 1: # quote_resp.setField(fix.Price(float(price))) quote_resp.setField(fix.OfferPx(float(price))) quote_resp.setField(fix.OfferSpotRate(float(price))) quote_resp.setField(fix.StringField(15, str(currency))) # Currency # quote_resp.setField(fix.BidPx(float(price))) quote_resp.setField(fix.QuoteID(quote_id)) # 117 quote_resp.setField(fix.OrderQty(quantity)) #38 quote_resp.setField(fix.ClOrdID(quote_resp.getField(693)+self.genOrderID())) # 11 group_453 = fix50sp2.QuoteRequest().NoRelatedSym().NoPartyIDs() group_453.setField(fix.StringField(448,'7613723'))#PartyID group_453.setField(fix.StringField(447,'D'))#PartyIDSource group_453.setField(fix.PartyRole(11))#452 - PartyRole quote_resp.addGroup(group_453) group_453.setField(fix.StringField(448,dealer_id))#PartyID group_453.setField(fix.StringField(447,'D'))#PartyIDSource group_453.setField(fix.PartyRole(1))#452 - PartyRole. quote_resp.addGroup(group_453) quote_resp.setField(fix.StringField(1300,'XOFF'))#market segment id print(f'SENDING QUOTE RESPONSE MESSAGE:\n ') # print(f'SENDING QUOTE RESPONSE MESSAGE:\n {quote_resp.toString()}') fix.Session.sendToTarget(quote_resp, self.sessionID)
def onNewOrderSingle(self, message, beginString, sessionID): symbol = quickfix.Symbol() side = quickfix.Side() ordType = quickfix.OrdType() orderQty = quickfix.OrderQty() price = quickfix.Price() clOrdID = quickfix.ClOrdID() quoteID = quickfix.QuoteID() currency = quickfix.Currency() message.getField(ordType) if ordType.getValue() != quickfix.OrdType_PREVIOUSLY_QUOTED: raise quickfix.IncorrectTagValue(ordType.getField()) message.getField(symbol) message.getField(side) message.getField(orderQty) message.getField(price) message.getField(clOrdID) message.getField(quoteID) message.getField(currency) executionReport = quickfix.Message() executionReport.getHeader().setField(beginString) executionReport.getHeader().setField( quickfix.MsgType(quickfix.MsgType_ExecutionReport)) executionReport.setField(quickfix.OrderID(self.idGen.orderID())) executionReport.setField(quickfix.ExecID(self.idGen.execID())) try: reject_chance = random.choice(range(1, 101)) if self.rejectRate > reject_chance: raise FixSimError("Rejected by cruel destiny %s" % str( (reject_chance, self.rejectRate))) subscription = self.subscriptions.get(symbol.getValue()) quote = subscription.orderbook.get(quoteID.getValue()) execPrice = price.getValue() execSize = orderQty.getValue() if execSize > quote.size: raise FixSimError("size to large for quote") if abs(execPrice - quote.price) > 0.0000001: raise FixSimError("Trade price not equal to quote") executionReport.setField( quickfix.SettlDate(self.getSettlementDate())) executionReport.setField(quickfix.Currency(subscription.currency)) executionReport.setField( quickfix.OrdStatus(quickfix.OrdStatus_FILLED)) executionReport.setField(symbol) executionReport.setField(side) executionReport.setField(clOrdID) executionReport.setField(quickfix.Price(price.getValue())) executionReport.setField(quickfix.AvgPx(execPrice)) executionReport.setField(quickfix.LastPx(execPrice)) executionReport.setField(quickfix.LastShares(execSize)) executionReport.setField(quickfix.CumQty(execSize)) executionReport.setField(quickfix.OrderQty(execSize)) executionReport.setField(quickfix.ExecType(quickfix.ExecType_FILL)) executionReport.setField(quickfix.LeavesQty(0)) except Exception as e: self.logger.exception("FixServer:Close order error") executionReport.setField(quickfix.SettlDate('')) executionReport.setField(currency) executionReport.setField( quickfix.OrdStatus(quickfix.OrdStatus_REJECTED)) executionReport.setField(symbol) executionReport.setField(side) executionReport.setField(clOrdID) executionReport.setField(quickfix.Price(0)) executionReport.setField(quickfix.AvgPx(0)) executionReport.setField(quickfix.LastPx(0)) executionReport.setField(quickfix.LastShares(0)) executionReport.setField(quickfix.CumQty(0)) executionReport.setField(quickfix.OrderQty(0)) executionReport.setField( quickfix.ExecType(quickfix.ExecType_REJECTED)) executionReport.setField(quickfix.LeavesQty(0)) self.sendToTarget(executionReport, sessionID)
def quote_request(self,symbol,currency,quantity,side,order_type,price=None): #HEADER trade = fix50sp2.QuoteRequest() trade.getHeader().setField(fix.StringField(8,'FIXT.1.1')) #BeginMessage trade.getHeader().setField(fix.StringField(35,'R'))#MessageType trade.getHeader().setField(fix.StringField(1128,'9')) #ApplVerID - FIX50SP2 trade.getHeader().setField(fix.StringField(49,'ORP_RESZ_B')) trade.getHeader().setField(fix.StringField(56,'BLPORPBETA')) trade.getHeader().setField(fix.StringField(128,'DOR')) trade.getHeader().setField(fix.SendingTime(1))#52 trade.getHeader().setField(fix.StringField(1156,'208'))#ApplExtID trade.getHeader().setField(fix.StringField(1129,'1.5'))#CstmApplVerID #BODY trade.setField(fix.QuoteReqID(datetime.datetime.utcnow().strftime('%Y%m%d%H%M%S') + symbol + 'RFQ' + str(side))) # 131 group_146 = fix50sp2.QuoteRequest().NoRelatedSym() # group_146 = fix.Group(146,1) if '/' not in symbol: group_146.setField(fix.StringField(55,str(symbol[:3]+'/'+symbol[3:]))) else: group_146.setField(fix.StringField(55, str(symbol))) group_146.setField(fix.StringField(167,'FXSPOT')) group_146.setField(fix.IntField(460,4)) group_146.setField(fix.SettlType('0'))#SettlType # group_146.setField(fix.StringField(63,'0'))#SettlType settl_date = datetime.datetime.utcnow()+BDay(n=2) group_146.setField(fix.SettlDate(settl_date.strftime('%Y%m%d')))#SettlDate group_146.setField(fix.OrderQty(quantity))#38 - Qty group_146.setField(fix.StringField(15,str(currency)))#Currency group_146.setField(fix.StringField(54,str(side))) # trade.setField(fix.NoPartyIDs(4))#453 - NumberOfParties group_453 = fix50sp2.QuoteRequest().NoRelatedSym().NoPartyIDs() # group_453 = fix.Group(453,1) group_453.setField(fix.StringField(448,'7613723'))#PartyID group_453.setField(fix.StringField(447,'D'))#PartyIDSource group_453.setField(fix.PartyRole(11))#452 - PartyRole group_146.addGroup(group_453) group_453.setField(fix.StringField(448,'BGD1'))#PartyID group_453.setField(fix.StringField(447,'D'))#PartyIDSource group_453.setField(fix.PartyRole(1))#452 - PartyRole. group_146.addGroup(group_453) group_453.setField(fix.StringField(448,'DOR1'))#PartyID group_453.setField(fix.StringField(447,'D'))#PartyIDSource group_453.setField(fix.PartyRole(1))#452 - PartyRole. group_146.addGroup(group_453) group_453.setField(fix.StringField(448,'DOR2'))#PartyID group_453.setField(fix.StringField(447,'D'))#PartyIDSource group_453.setField(fix.PartyRole(1))#452 - PartyRole. group_146.addGroup(group_453) trade.addGroup(group_146) trade.setField(fix.StringField(1300,'XOFF'))#market segment id # trade.setField(fix.StringField(21,'z'))#HandlInst if order_type == '2': # limit trade.setField(fix.Price(float(price))) # if market, this tag should be absent else: price = None print(f'CREATING THE FOLLOWING ORDER:\n ') # print(f'CREATING THE FOLLOWING ORDER:\n {trade.toString()}') fix.Session.sendToTarget(trade, self.sessionID)
def quote_request(self,symbol,currency,quantity,side,order_type,dealers_dict): ''' send QuoteRequest message to Liquidity Providers build the message according to ORP_v1.5_QuickFIX ''' #HEADER trade = fix50sp2.QuoteRequest() trade.getHeader().setField(fix.StringField(8,'FIXT.1.1')) #BeginMessage trade.getHeader().setField(fix.StringField(35,'R'))#MessageType trade.getHeader().setField(fix.StringField(1128,'9')) #ApplVerID - FIX50SP2 trade.getHeader().setField(fix.StringField(49,'ORP_RESZ_B')) trade.getHeader().setField(fix.StringField(56,'BLPORPBETA')) trade.getHeader().setField(fix.StringField(128,'DOR')) trade.getHeader().setField(fix.SendingTime(1))#52 trade.getHeader().setField(fix.StringField(1156,'208'))#ApplExtID trade.getHeader().setField(fix.StringField(1129,'1.5'))#CstmApplVerID #BODY #QuoteReqID (131) --> RFQ+datetime+symbol+side quote_request_id = 'RFQ' + datetime.datetime.utcnow().strftime('%Y%m%d%H%M%S') + symbol + str(side) trade.setField(fix.QuoteReqID(quote_request_id)) # 131 group_146 = fix50sp2.QuoteRequest().NoRelatedSym() if '/' not in symbol: group_146.setField(fix.StringField(55,str(symbol[:3]+'/'+symbol[3:6]))) else: group_146.setField(fix.StringField(55, str(symbol))) group_146.setField(fix.StringField(167,'FXSPOT')) group_146.setField(fix.IntField(460,4)) group_146.setField(fix.SettlType('0'))#SettlType # settl_date = datetime.datetime.utcnow()+BDay(n=2) if ((datetime.datetime.utcnow() - datetime.timedelta(hours = 4)).hour < 17) or ((datetime.datetime.utcnow() - datetime.timedelta(hours = 4)).weekday() == 6): settl_date = datetime.datetime.utcnow()+BDay(n=2) else: settl_date = datetime.datetime.utcnow() + BDay(n=3) while (settl_date.strftime('%Y%m%d') in HOLIDAYS_DICT[symbol[:3]]) or (settl_date.strftime('%Y%m%d') in HOLIDAYS_DICT[symbol[-3:]]): settl_date += BDay(n=1) group_146.setField(fix.SettlDate(settl_date.strftime('%Y%m%d')))#SettlDate group_146.setField(fix.OrderQty(quantity))#38 - Qty group_146.setField(fix.StringField(15,str(currency)))#Currency #if side == 0, get two way quotes (omit tag 54) if side != 0: group_146.setField(fix.StringField(54,str(side))) group_453 = fix50sp2.QuoteRequest().NoRelatedSym().NoPartyIDs() for dealer, party_role in dealers_dict.items(): group_453.setField(fix.StringField(448,dealer))#PartyID group_453.setField(fix.StringField(447,'D'))#PartyIDSource group_453.setField(fix.PartyRole(party_role))#452 - PartyRole. group_146.addGroup(group_453) trade.addGroup(group_146) trade.setField(fix.StringField(1300,'XOFF'))#market segment id # trade.setField(fix.StringField(21,'z'))#HandlInst if order_type == '2': # limit trade.setField(fix.Price(float(self.limit_price))) # if market, this tag should be absent print(f'CREATING THE FOLLOWING ORDER:\n {trade.toString()}') fix.Session.sendToTarget(trade, self.sessionID)