def order_status_request(self,cl_ord_id=None): if cl_ord_id is None: fix_orders = pd.read_csv(f'{self.write_path}/fix_orders.csv',index_col=0) for idx in fix_orders.index: ord_status_request = fix.Message() ord_status_request.getHeader().setField(fix.BeginString(fix.BeginString_FIX42)) # ord_status_request.getHeader().setField(fix.MsgType('H')) #39=D ord_status_request.getHeader().setField(fix.SendingTime(1)) # ord_status_request.setField(fix.Symbol('EUR')) #55 # ord_status_request.setField(fix.Account('U01049')) # ord_status_request.setField(fix.SecurityReqID('1')) ord_status_request.setField(fix.ClOrdID(str(idx))) #11= # ord_status_request.setField(fix.ClOrdID(str('*'))) #11= # ord_status_request.setField(fix.ClOrdID(datetime.utcnow().strftime('%Y%m%d%H%M%S')+ 'statReq' + self.genExecID())) #11= # ord_status_request.setField(fix.OrderID(datetime.utcnow().strftime('%Y%m%d%H%M%S')+ 'statReq' + self.genExecID())) # ord_status_request.setField(fix.OrderID('*')) # ord_status_request.setField(fix.SecurityType('CASH')) #167 # ord_status_request.setField(fix.Side(fix.Side_SELL)) print(f'Order status message \n {ord_status_request}') fix.Session.sendToTarget(ord_status_request,self.sessionID) print('order status request for open orders sent!') else: ord_status_request = fix.Message() ord_status_request.getHeader().setField(fix.BeginString(fix.BeginString_FIX42)) # ord_status_request.getHeader().setField(fix.MsgType('H')) # 39=D ord_status_request.getHeader().setField(fix.SendingTime(1)) ord_status_request.setField(fix.ClOrdID(str(cl_ord_id))) # 11= print(f'ORDER STATUS MESSAGE \n {ord_status_request}') fix.Session.sendToTarget(ord_status_request, self.sessionID) print(f'ORDER STATUS REQUEST FOR {cl_ord_id} SENT!')
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 fromApp(self, message, sessionID): """Process incoming App level messages. Arguments: message {object} -- message object sessionID {object} -- Session identifier object """ self.logger.info( f'[KERNEL] Received app message: {parse_fix_message(message)}') msgType = fix.MsgType() message.getHeader().getField(msgType) msgType = msgType.getValue() timestamp = fix.SendingTime() message.getHeader().getField(timestamp) timestamp = timestamp.getString() if msgType == fix.MsgType_MassQuote: print(f'{self._server_str} MassQuote.') # NoQuoteSets_Group = fix44.MassQuote.NoQuoteSets() # message.getGroup(1, NoQuoteSets_Group) # reqID = extract_message_field_value(fix.QuoteSetID(), NoQuoteSets_Group) # NoQuoteEntries_Group = fix44.MassQuote.NoQuoteSets.NoQuoteEntries() # NoQuoteSets_Group.getGroup(1, NoQuoteEntries_Group) if message.isSetField(fix.QuoteID()): self.send_MassQuoteAcknowledgement(message)
def toAdmin(self, message, sessionID): msg = message.toString().replace(__SOH__, "|") log.info('toAdm sessionID:{}, message:{}'.format(sessionID, )) sndTime = fix.SendingTime() message.getHeader().getField(sndTime) print((sndTime.getString())) return
def newOrderSingle(self): try: LOG_EVENT("New Order Single") orderMsg = fix.Message() orderMsg.getHeader().setField(self.sessionID.getBeginString()) orderMsg.getHeader().setField( fix.MsgType(fix.MsgType_NewOrderSingle)) orderMsg.getHeader().setField(self.sessionID.getSenderCompID()) orderMsg.getHeader().setField(self.sessionID.getTargetCompID()) orderMsg.getHeader().setField(fix.MsgSeqNum(self.genOrderID())) sendingTime = fix.SendingTime() sendingTime.setString( datetime.utcnow().strftime("%Y%m%d-%H:%M:%S.%f")) orderMsg.getHeader().setField(sendingTime) orderMsg.setField(fix.Account("17018382")) orderMsg.setField(fix.ClOrdID(self.genExecID())) orderMsg.setField(fix.OrderQty(100)) orderMsg.setField(fix.OrdType(fix.TriggerOrderType_LIMIT)) orderMsg.setField(fix.Price(1.216)) orderMsg.setField(fix.Symbol("X.US.OREURUSD")) orderMsg.setField(fix.Side(fix.Side_BUY)) tranactionTime = fix.TransactTime() tranactionTime.setString( datetime.utcnow().strftime("%Y%m%d-%H:%M:%S.%f")) orderMsg.setField(tranactionTime) orderMsg.setField(fix.OpenClose(fix.OpenClose_OPEN)) LOG_PACKET(orderMsg.toString()) fix.Session.sendToTarget(orderMsg, self.sessionID) except Exception as e: print(e)
def fromApp(self, message, sessionID): if self.verbose: print(f'[fromApp] {sessionID} | {read_FIX_message(message)}') log(self.logger, f'[fromApp] {sessionID} | {read_FIX_message(message)}') # Get incoming message Type msgType = fix.MsgType() message.getHeader().getField(msgType) msgType = msgType.getValue() # Get timestamp (tag 52) sending_time = extract_message_field_value(fix.SendingTime(), message, 'datetime') # print('sending_time:', sending_time) ########## Quote messages ########## if msgType == fix.MsgType_MassQuote: self.parse_MassQuote(message, sending_time) elif msgType == fix.MsgType_MarketDataSnapshotFullRefresh: self.parse_MarketDataSnapshotFullRefresh(message, sending_time) # 3) Process MarketDataSnapshot_IncrementalRefresh message elif msgType == fix.MsgType_MarketDataIncrementalRefresh: print(self._server_str + ' {MD} INCREMENTAL REFRESH!') ########## Trade messages ########## elif msgType == fix.MsgType_ExecutionReport: self.parse_ExecutionReport(message, sending_time) elif msgType == fix.MsgType_OrderCancelReject: # An OrderCancelReject will be sent as an answer to an OrderCancelRequest, which cannot be executed. # Not much to do here as our order dict would stay the same. # If it was canceled successfully, we should get an execution report. ClOrdID = extract_message_field_value(fix.ClOrdID(), message, 'int') print( f'[fromApp] Order Cancel Request Rejected for order: {ClOrdID}' ) elif msgType == fix.MsgType_MarketDataRequestReject: text = extract_message_field_value(fix.Text(), message, 'str') print(f'[fromApp] Market Data Request Reject with message: {text}') elif self.verbose: print(f'[fromApp] {sessionID} | {read_FIX_message(message)}') print('unknown message type: ', msgType)
def test_heartbeat(self): sequence = fix.MsgSeqNum(1) requestTime = fix.SendingTime() requestTime.setString('20170606-03:52:34.924') request = fix44.Heartbeat() request.getHeader().setField(requestTime) request.getHeader().setField(sequence) responseTime = fix.SendingTime() responseTime.setString('20170606-03:52:14.824') response = fix44.Heartbeat() response.getHeader().setField(responseTime) response.getHeader().setField(sequence) currentLag = {} def receive(event): currentLag[0] = event.CurrentTimeLag self.Store.addTimeLagListener(receive) self.Store.addRequest(request) self.Store.addResponse(response) self.assertEqual(currentLag[0], 20.1)
def startFIXString(self, orderID): message = quickfix.Message() message.getHeader().setField(quickfix.BeginString(quickfix.BeginString_FIX42)) message.getHeader().setField(quickfix.MsgType(quickfix.MsgType_ExecutionReport)) message.getHeader().setField(quickfix.SendingTime()) message.getHeader().setField(quickfix.TransactTime()) message.setField(quickfix.ClOrdID(self.orders[orderID]['clOrdID'])) message.setField(quickfix.OrderQty(self.orders[orderID]['quantity'])) message.setField(quickfix.Symbol(self.orders[orderID]['symbol'])) message.setField(quickfix.Side(self.orders[orderID]['side'])) message.setField(quickfix.ExecID(str(self.getNextExecID(self.orders[orderID]['target'])))) if 'exchangeID' not in self.orders[orderID]: self.orders[orderID]['exchangeID'] = self.getNextExchangeID(self.orders[orderID]['target']) message.setField(quickfix.OrderID(str(self.orders[orderID]['exchangeID']))) return message
def order_cancel_request(self,account,symbol,side,quantity): print("Creating order_cancel_request message... ") cancel_request_message = fix.Message() cancel_request_message.getHeader().setField(fix.BeginString(fix.BeginString_FIX42)) # cancel_request_message.getHeader().setField(fix.MsgType('F')) #39=D cancel_request_message.getHeader().setField(fix.SendingTime(1)) cancel_request_message.setField(fix.Account(str(account))) #1 cancel_request_message.setField(fix.ClOrdID(str('order_cancel_request'+self.genOrderID()))) #11 cancel_request_message.setField(fix.OrigClOrdID(str(self.orders[0]))) #41 cancel_request_message.setField(fix.Symbol(str(symbol))) #55 cancel_request_message.setField(fix.Side(str(side))) #54 cancel_request_message.setField(fix.OrderQty(quantity)) #38 print('sending order_cancel_request message...') print(f'order_cancel_request message: {cancel_request_message.toString()}') fix.Session.sendToTarget(cancel_request_message, self.sessionID) print('order_cancel_request message sent!')
def __uncorkValue(message): msgType = fix.MsgType() message.getHeader().getField(msgType) val = msgType.getValue() if val == fix.MsgType_Logon or val == fix.MsgType_Logout or val == fix.MsgType_Heartbeat: sndTime = fix.SendingTime() message.getHeader().getField(sndTime) return sndTime.getString() if val == fix.MsgType_NewOrderSingle or val == fix.MsgType_ExecutionReport \ or val == fix.MsgType_OrderCancelRequest or val == fix.MsgType_OrderCancelReject: transTime = fix.TransactTime() message.getField(transTime) return transTime.getString() if val == fix.MsgType_CollateralInquiry or val == fix.MsgType_CollateralReport \ or val == fix.MsgType_RequestForPositions or val == fix.MsgType_PositionReport \ or val == fix.MsgType_RequestForPositionsAck: return datetime.now().strftime("%Y%m%d-%H:%M:%S") return None
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 order_cancel_replace(self,account,symbol,side,quantity,order_type,price): print("Creating order_cancel_replace message... ") cancel_replace_message = fix.Message() cancel_replace_message.getHeader().setField(fix.BeginString(fix.BeginString_FIX42)) # cancel_replace_message.getHeader().setField(fix.MsgType('G')) #39=D cancel_replace_message.getHeader().setField(fix.SendingTime(1)) cancel_replace_message.setField(fix.Account(str(account))) #1 cancel_replace_message.setField(fix.HandlInst(fix.HandlInst_AUTOMATED_EXECUTION_ORDER_PUBLIC_BROKER_INTERVENTION_OK)) #21=3 (Manual order), 21=2 automated execution only supported value cancel_replace_message.setField(fix.ClOrdID(str('order_cancel_replace'+self.genOrderID()))) #11 cancel_replace_message.setField(fix.OrigClOrdID(str(self.orders[0]))) #41 cancel_replace_message.setField(fix.Symbol(str(symbol))) #55 cancel_replace_message.setField(fix.Side(str(side))) #54 cancel_replace_message.setField(fix.OrderQty(quantity)) #38 cancel_replace_message.setField(fix.OrdType(str(order_type))) #40 cancel_replace_message.setField(fix.Price(price)) #44 print('sending order_cancel_replace message...') print(f'order_cancel_replace message: {cancel_replace_message.toString()}') fix.Session.sendToTarget(cancel_replace_message, self.sessionID) print('order_cancel_replace message sent!')
def checkAccountData(self): try: LOG_EVENT("Check Account Data") orderMsg = fix.Message() orderMsg.getHeader().setField(self.sessionID.getBeginString()) orderMsg.getHeader().setField(fix.MsgType("UAR")) orderMsg.getHeader().setField(self.sessionID.getSenderCompID()) orderMsg.getHeader().setField(self.sessionID.getTargetCompID()) orderMsg.getHeader().setField(fix.MsgSeqNum(self.genOrderID())) sendingTime = fix.SendingTime() sendingTime.setString( datetime.utcnow().strftime("%Y%m%d-%H:%M:%S.%f")) orderMsg.getHeader().setField(sendingTime) orderMsg.setField(fix.Account("17018382")) orderMsg.setField(20003, self.genExecID()) LOG_PACKET(orderMsg.toString()) fix.Session.sendToTarget(orderMsg, self.sessionID) except Exception as e: print(e)
dd = fix.DataDictionary(definitions.FIX50SP02) begin_string = fix.BeginString() body_length = fix.BodyLength() message_type = fix.MsgType() sender_id = fix.SenderCompID() target_id = fix.TargetCompID() msg_seq = fix.MsgSeqNum() sender_sub_id = fix.SenderSubID() target_sub_id = fix.TargetSubID() duplicate_flag = fix.PossDupFlag() user_req_type = fix.UserRequestType() gateway_id = fix.MarketID() orig_sending_time = fix.OrigSendingTime() sending_time = fix.SendingTime() on_behalf_id = fix.OnBehalfOfCompID() check_sum = fix.CheckSum() TOKEN_NO = 48 LTP = 1835 LTQ = 1843 LTT = 1844 AVG_TP = 1845 OPEN = 1861 CLOSE = 1809 HIGH = 1802 LOW = 1801 YEAR_HIGH = 1824 YEAR_LOW = 1825 VOLUME = 387
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)
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 toAdmin(self, message, sessionID): print('toAdmin') sndTime = fix.SendingTime() message.getHeader().getField(sndTime) print((sndTime.getString())) return
initiator = fix.SocketInitiator(application, storeFactory, settings, logFactory) message_flag = True initiator.start() while 1: time.sleep(1) if message_flag is True: message = fix.Message() header = message.getHeader() trailer = message.getTrailer() header.setField(fix.BeginString(fix.BeginString_FIX42)) header.setField(fix.BodyLength()) header.setField(fix.MsgType(fix.MsgType_NewOrderSingle)) header.setField(fix.SendingTime()) header.setField(fix.SenderSubID("SG1")) header.setField(fix.TargetSubID("BARCA")) header.setField(fix.MsgSeqNum()) header.setField(fix.DefaultApplVerID(fix.ApplVerID_FIX42)) message.setField(fix.ClOrdID("ClOrdID")) message.setField( fix.AccountType( fix. AccountType_ACCOUNT_IS_CARRIED_ON_CUSTOMER_SIDE_OF_BOOKS)) message.setField(fix.Symbol("APPL")) message.setField( fix.HandlInst( fix. HandlInst_AUTOMATED_EXECUTION_ORDER_PRIVATE_NO_BROKER_INTERVENTION ))
def put_order(self,security_type,symbol,currency,quantity,side,order_type,account,time_id,price=None): if quantity != 0 : trade = fix.Message() ''' STANDARD MESSAGE HEADER Required Tags: 8(BeginString) - 9(BodyLength) - 35(MsgType) - 49(SenderCompID) - 56(TargetCompID) - 34(MsgSeqNum) - 52(SendingTime) ''' trade.getHeader().setField(fix.BeginString(fix.BeginString_FIX42)) # trade.getHeader().setField(fix.MsgType(fix.MsgType_NewOrderSingle)) #39=D trade.getHeader().setField(fix.SendingTime(1)) # unique_order_id = self.genExecID() # print(f'Unique Order ID: {unique_order_id}') # trade.setField(fix.ClOrdID(unique_order_id)) #11=Unique order trade.setField(fix.HandlInst(fix.HandlInst_AUTOMATED_EXECUTION_ORDER_PUBLIC_BROKER_INTERVENTION_OK)) #21=3 (Manual order), 21=2 automated execution only supported value trade.setField(fix.Symbol(str(symbol))) #55 trade.setField(fix.Currency(str(currency))) #15 trade.setField(fix.SecurityType(str(security_type))) #167 trade.setField(fix.Side(str(side))) #54=1 Buy trade.setField(fix.OrdType(str(order_type))) #40=2 Limit order, 40=1 Market trade.setField(fix.OrderQty(quantity)) #38 if order_type != 1: #not market trade.setField(fix.Price(price)) # if market, this tag should be absent else: price = None trade.setField(fix.Account(str(account))) trade.setField(fix.ExDestination('IDEALPRO')) trade.setField(fix.CustomerOrFirm(0)) trade.setField(fix.ClOrdID(time_id+trade.getField(55)+trade.getField(15)+trade.getField(54))) #11= # trade.setField(fix.ClOrdID(datetime.datetime.utcnow().strftime('%Y%m%d%H%M%S')+trade.getField(55)+trade.getField(15)+trade.getField(54))) #11= # dnow = datetime.utcnow().strftime('%Y%m%d-%H:%M:%S') # tag = fix.TransactTime() #default = current time, SendingTime does the same thing # tag.setString(dnow.strftime('%Y%m%d-%H:%M:%S')) # trade.setField(tag) print(f'CREATING THE FOLLOWING ORDER:\n {trade.toString()}') fix.Session.sendToTarget(trade, self.sessionID) self.orders_dict[trade.getField(11)] = {#'id':trade.getField(11), #'datetime': trade.getField(11)[:12], 'account':trade.getField(1), 'symbol':trade.getField(55)+'.' + trade.getField(15), 'qty':trade.getField(38), 'ord_type':trade.getField(40), 'side':trade.getField(54), 'price':price, 'status':'sent' } else: print(f'QUANTITY IS 0!\nCHECK FOR STATUS OF LAST ORDER') if os.path.exists(f'{self.write_path}fix_orders.csv'): temp_orders = pd.read_csv(f'{self.write_path}fix_orders.csv',index_col=0) symbol_entries = temp_orders[temp_orders['symbol'] == symbol] last_symbol_entry = symbol_entries.iloc[-1] new_entry = last_symbol_entry new_id = time_id + last_symbol_entry.name[6:] new_entry.name = new_id temp_orders = temp_orders.append(last_symbol_entry,ignore_index=False) temp_orders.to_csv(f'{self.write_path}fix_orders.csv',) self.order_status_request(cl_ord_id=last_symbol_entry) # self.order_status_request(cl_ord_id=temp_orders.index[-1]) else: print(f'QUANTITY IS 0!\n FIX ORDERS FIRST RUN') time.sleep(100)