Example #1
0
 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
Example #2
0
    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
Example #3
0
    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)
Example #4
0
    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)
Example #5
0
 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
Example #6
0
 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
Example #7
0
    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)
Example #8
0
    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)
Example #9
0
 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
Example #10
0
    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))
Example #11
0
    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
Example #12
0
 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)
Example #13
0
    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