def scrip_msg(scrip_element: Scrip): scrip_subscription = fix.Message() # 8, BeginString scrip_subscription.getHeader().setField(fix.BeginString(fix.BeginString_FIXT11)) # 35, Message Type scrip_subscription.getHeader().setField(fix.MsgType(fix.MsgType_MarketDataRequest)) # 49, SenderCompId scrip_subscription.getHeader().setField(fix.SenderCompID(sender_id)) # 56, TargetCompId scrip_subscription.getHeader().setField(fix.TargetCompID(target_id)) # 34, Message SeqNumber scrip_subscription.setField(fix.MsgSeqNum(1)) # 50, SenderSubID scrip_subscription.setField(fix.SenderSubID(scrip_element.exchange)) # 924, UserRequestType scrip_subscription.setField(fix.UserRequestType(1)) # 115 ,doubtful, but may be gateway id according to examples # NSECM = 2, NSEFO = 1 scrip_subscription.setField(115, "%s" % scrip_element.gatewayID) # 55, Symbol scrip_subscription.setField(fix.Symbol(scrip_element.symbol)) # 1775, price divisor scrip_subscription.setField(1775, "0") # 167, Instrument scrip_subscription.setField(167, scrip_element.instrument) # 48, Token No. scrip_subscription.setField(48, "%s" % scrip_element.token_no) # 263, Broadcast type scrip_subscription.setField(263, "0") scrip_subscription = bytes(scrip_subscription.toString(), encoding="UTF-8") return scrip_subscription
def fromAdmin(self, message, sessionID): if SKIP_AUTHENTICATION: print("Received the following admin message: %s" % message.toString()) return beginString = fix.BeginString() msgType = fix.MsgType() msgSeqNum = fix.MsgSeqNum() message.getHeader().getField(beginString) message.getHeader().getField(msgType) message.getHeader().getField(msgSeqNum) if msgType.getString() == fix.MsgType_Logon: try: rawData = fix.RawData() message.getField(rawData) jsonStr = json.loads(rawData.getValue()) self.accessKey = jsonStr['AccessKey'] self.secretKey = jsonStr['SecretKey'] response = authenticateMe(self.accessKey, self.secretKey) jResponse = json.loads(response) if 'error' in jResponse and jResponse['error']: raise fix.RejectLogon("wrong signature") except KeyboardInterrupt: return except Exception as e: print(e) raise fix.RejectLogon( "failed to authenticate on server. Please contact istox IT!" ) print("Received the following admin message: %s" % message.toString()) 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): print("Received the following message: %s" % message.toString()) beginString = fix.BeginString() msgType = fix.MsgType() msgSeqNum = fix.MsgSeqNum() message.getHeader().getField(beginString) message.getHeader().getField(msgType) message.getHeader().getField(msgSeqNum) print("Message type = %s" % msgType.getString()) if msgType.getString() == fix.MsgType_NewOrderSingle: print("New Order received") if SKIP_AUTHENTICATION: executionReport = self.getExecutionReportForNewOrder(message) else: executionReport = self.getExecutionReportForNewOrder2(message) print("Execution report to send: %s" % executionReport.toString()) self.sendReport(executionReport, sessionID) elif msgType.getString() == fix.MsgType_OrderCancelRequest: print("Cancel Order received") if SKIP_AUTHENTICATION: executionReport = self.getExecutionReportForCancelOrder( message) # use below 3 lines and comment out above 3 if you want to send order cancel reject message # orderCancelReject = self.getOrderCancelReject(message) # print("Order cancel reject to send: %s" % orderCancelReject.toString()) # self.sendReport(orderCancelReject, sessionID) else: executionReport = self.getExecutionReportForCancelOrder2( message) print("Execution report to send: %s" % executionReport.toString()) self.sendReport(executionReport, sessionID) elif msgType.getString() == fix.MsgType_OrderStatusRequest: print("Order status request received") if SKIP_AUTHENTICATION: executionReport = self.getExecutionReportForStatusRequest( message) else: executionReport = self.getExecutionReportForStatusRequest2( message) print("Execution report to send: %s" % executionReport.toString()) self.sendReport(executionReport, sessionID) else: print("Unsupported MsgType") reject = fix.Message() reject.getHeader().setField(beginString) reject.getHeader().setField(fix.MsgType(fix.MsgType_Reject)) reject.setField(fix.RefMsgType(msgType.getString())) reject.setField(fix.RefSeqNum( msgSeqNum.getValue())) #45 = RefSeqNum reject.setField( fix.SessionRejectReason(fix.SessionRejectReason_INVALID_MSGTYPE )) #373 = 11 INVALID_MSGTYPE reject.setField( fix.Text("iSTOX FIX API does not support this message type")) self.sendReport(reject, sessionID)
def logout_msg(sender_comp_id, target_comp_id, username_client, ): global ntwk_id logout_req = fix.Message() logout_req.getHeader().setField(fix.BeginString(fix.BeginString_FIXT11)) logout_req.getHeader().setField(fix.MsgType(fix.MsgType_Logout)) logout_req.setField(fix.SenderCompID(sender_comp_id)) logout_req.setField(fix.TargetCompID(target_comp_id)) logout_req.setField(fix.MsgSeqNum(5)) logout_req.setField(fix.Username(username_client)) logout_req.setField(fix.NetworkResponseID("%s" % ntwk_id)) logout_req = bytes(logout_req.toString(), encoding="UTF-8") return logout_req
def __uncorkKey(message): """ Return a value that can be used as a key based on a message type :param message: FIX message :return: key """ msgType = fix.MsgType() message.getHeader().getField(msgType) if msgType.getValue() == fix.MsgType_Logon: sequence = fix.MsgSeqNum() message.getHeader().getField(sequence) return '%s_%s' % (fix.MsgType_Logon, sequence.getValue()) if msgType.getValue() == fix.MsgType_Logout: sequence = fix.MsgSeqNum() message.getHeader().getField(sequence) return '%s_%s' % (fix.MsgType_Logout, sequence.getValue()) if msgType.getValue() == fix.MsgType_Heartbeat: sequence = fix.MsgSeqNum() message.getHeader().getField(sequence) return '%s_%s' % (fix.MsgType_Heartbeat, sequence.getValue()) if msgType.getValue() == fix.MsgType_NewOrderSingle or msgType.getValue() == fix.MsgType_ExecutionReport \ or msgType.getValue() == fix.MsgType_OrderCancelRequest \ or msgType.getValue() == fix.MsgType_OrderCancelReject: cId = fix.ClOrdID() message.getField(cId) return cId.getValue() if msgType.getValue( ) == fix.MsgType_CollateralInquiry or msgType.getValue( ) == fix.MsgType_CollateralReport: colId = fix.CollInquiryID() message.getField(colId) return colId.getValue() if msgType.getValue() == fix.MsgType_RequestForPositions or msgType.getValue() == fix.MsgType_PositionReport \ or msgType.getValue() == fix.MsgType_RequestForPositionsAck: posId = fix.PosReqID() message.getField(posId) return posId.getValue() return None
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 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)
def logon_msg(sender_comp_id, target_comp_id, username_client, response_id_network): if response_id_network is None: response_id_network = int((numpy.random.random()) * 100000) global ntwk_id ntwk_id = response_id_network _message_logger.info("Logon with response id: %s" % response_id_network) _message_logger.debug("Building logon message") logon_req = fix.Message() logon_req.getHeader().setField(fix.BeginString(fix.BeginString_FIXT11)) logon_req.getHeader().setField(fix.MsgType(fix.MsgType_Logon)) logon_req.setField(fix.SenderCompID(sender_comp_id)) logon_req.setField(fix.TargetCompID(target_comp_id)) logon_req.setField(fix.MsgSeqNum(1)) logon_req.setField(fix.UserRequestType(1)) logon_req.setField(fix.HeartBtInt(1)) logon_req.setField(fix.Username(username_client)) logon_req.setField(fix.NetworkResponseID("%s" % response_id_network)) logon_req.setField(fix.DefaultApplVerID(fix.ApplVerID_FIX50SP2)) logon_req.setField(1701, "1") logon_req.getTrailer().setField(fix.MarketID("2")) logon_req.setField(fix.DefaultApplVerID("FIX.5.0SP2")) logon_req = bytes(logon_req.toString(), encoding="UTF-8") _message_logger.debug("Logon message built") return logon_req
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 )) message.setField(fix.ReceivedDeptID("I")) message.setField(fix.Side(fix.Side_BUY))
backupCount=50) fmt = logging.Formatter("%(asctime)s.%(msecs)03d %(message)s") parser_handler.setFormatter(fmt) parser_handler.setLevel(logging.DEBUG) _parser_logger = logging.getLogger("mega_trader.mt_data_parser") _parser_logger.propagate = False _parser_logger.addHandler(parser_handler) 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
def update_seq_num(self, message: fix.Message): """""" seq_num: int = get_field_value(message.getHeader(), fix.MsgSeqNum()) session: fix.Session = fix.Session.lookupSession(self.session_id) session.setNextSenderMsgSeqNum(seq_num + 1)
def getExecutionReportForNewOrder2(self, message): beginString = fix.BeginString() message.getHeader().getField(beginString) msgSeqNum = fix.MsgSeqNum() message.getHeader().getField(msgSeqNum) symbol = fix.Symbol() side = fix.Side() ordType = fix.OrdType() orderQty = fix.OrderQty() price = fix.Price() clOrdID = fix.ClOrdID() message.getField(ordType) # todo handle market order if ordType.getValue() != fix.OrdType_LIMIT: raise fix.IncorrectTagValue(ordType.getField()) message.getField(symbol) message.getField(side) message.getField(orderQty) message.getField(price) message.getField(clOrdID) data = {} data['market'] = symbol.getValue() data['price'] = price.getValue() data['side'] = 'buy' if side.getValue() == fix.Side_BUY else 'sell' data['volume'] = orderQty.getValue() response = createOrder(self.accessKey, self.secretKey, data) jResponse = json.loads(response) executionReport = fix.Message() executionReport.getHeader().setField(beginString) executionReport.getHeader().setField( fix.MsgType(fix.MsgType_ExecutionReport)) # todo exec id? executionReport.setField(fix.ExecID(self.genExecID())) executionReport.setField(symbol) executionReport.setField(side) executionReport.setField(fix.CumQty(orderQty.getValue())) executionReport.setField(fix.AvgPx(price.getValue())) executionReport.setField(fix.LastShares(orderQty.getValue())) executionReport.setField(fix.LastPx(price.getValue())) # todo save Client order id to DB? executionReport.setField(clOrdID) executionReport.setField(orderQty) if 'error' in jResponse and jResponse['error']: executionReport.setField(fix.OrderID("nil")) executionReport.setField(fix.OrdStatus(fix.OrdStatus_REJECTED)) executionReport.setField(fix.Text(jResponse['error']['message'])) # todo Reject reason for each case executionReport.setField( fix.OrdRejReason(fix.OrdRejReason_UNKNOWN_SYMBOL)) else: executionReport.setField(fix.OrderID(str(jResponse['id']))) # todo check trades_count from json response and set FILL status? executionReport.setField(fix.OrdStatus(fix.OrdStatus_NEW)) executionReport.setField(fix.Text('New order accpeted!')) # Since FIX 4.3, ExecTransType is killed and the values are moved to ExecType if beginString.getValue( ) == fix.BeginString_FIX40 or beginString.getValue( ) == fix.BeginString_FIX41 or beginString.getValue( ) == fix.BeginString_FIX42: executionReport.setField(fix.ExecTransType(fix.ExecTransType_NEW)) # todo check trades_count from json response and set FILL status? # ExecType and LeavesQty fields only existsince FIX 4.1 if beginString.getValue() >= fix.BeginString_FIX41: if beginString.getValue() <= fix.BeginString_FIX42: executionReport.setField(fix.ExecType( fix.ExecType_FILL)) #150=2 FILL (or 1 PARTIAL_FILL) else: # FILL and PARTIAL_FILL are removed and replaced by TRADE (F) since FIX 4.3 as these info can be retrieved from OrdStatus field executionReport.setField(fix.ExecType( fix.ExecType_TRADE)) #150=F TRADE executionReport.setField(fix.LeavesQty(0)) """if 'error' in jResponse and jResponse['error']: reject = fix.Message() reject.getHeader().setField(beginString) reject.getHeader().setField(fix.MsgType(fix.MsgType_Reject)) reject.setField(fix.RefMsgType(fix.MsgType_NewOrderSingle)) reject.setField(fix.RefSeqNum(msgSeqNum.getValue())) #45 = RefSeqNum reject.setField(fix.SessionRejectReason(fix.SessionRejectReason_OTHER)) #373 = 99 OTHER reject.setField(fix.Text(jResponse['message'])) return reject """ return executionReport