예제 #1
0
 def test_encode_no_8(self):
     """Test encoding without BeginString(8) field"""
     msg = FixMessage()
     msg.append_pair(35, "D")
     with self.assertRaises(ValueError):
         msg.encode()
     return
예제 #2
0
def logon(n):
    message = FixMessage()

    message.append_pair(8, "FIX.4.4")
    message.append_pair(35, "A")
    message.append_pair(34, n)
    message.append_pair(49, price_auth.SenderCompID)
    message.append_utc_timestamp(52)
    message.append_pair(56, price_auth.TargetCompID)
    message.append_pair(98, "0")
    message.append_pair(141, "Y")
    message.append_pair(108, "30")
    message.append_pair(553, price_auth.Username)
    message.append_pair(554, price_auth.Password)

    parser.append_buffer(message.encode())
    sent = parser.get_message()
    print("logon2 request ", sent)

    s.sendall(message.encode())
    response = s.recv(5201)

    parser.append_buffer(response)
    out = parser.get_message()
    print("logon response2", out)
예제 #3
0
 def test_encode_no_35(self):
     """Test encoding without MessageType(35) field"""
     msg = FixMessage()
     msg.append_pair(8, "FIX.4.2")
     with self.assertRaises(ValueError):
         msg.encode()
     return
예제 #4
0
    def test_empty_message(self):
        """Test encoding of empty message"""
        if VERSION == 26:
            return

        msg = FixMessage()
        with self.assertRaises(ValueError):
            msg.encode()
예제 #5
0
def heartbeat_msg(n):
    heartbeat = FixMessage()

    heartbeat.append_pair(8, "FIX.4.4")
    heartbeat.append_pair(35, "0")
    heartbeat.append_pair(34, n)
    heartbeat.append_pair(49, trade_auth.SenderCompID)
    heartbeat.append_utc_timestamp(52)
    heartbeat.append_pair(56, trade_auth.TargetCompID)
    heartbeat.append_pair(57, "TRADES")

    parser.append_buffer(heartbeat.encode())
    s.sendall(heartbeat.encode())
예제 #6
0
 def test_empty_message(self):
     try:
         msg = FixMessage()
         buf = msg.encode()
     except Exception as e:
         self.assertEqual(ValueError, type(e))
     return
예제 #7
0
    def full_refresh(self, message, price, volume, side):

        parser = Parser()
        parser.append_buffer(message)
        message_recv = parser.get_message()

        msg = Message()
        msg.append_pair(8, self.header)
        msg.append_pair(34, int(message_recv.get(34)) + 1)  # sequence no
        msg.append_pair(35, 'W')  # msgType = logon
        msg.append_pair(49, message_recv.get(56))
        msg.append_time(52)  # timestamp
        msg.append_pair(56, message_recv.get(49))
        msg.append_pair(55, message_recv.get(55))  # subscribed ticker
        msg.append_pair(268, 1)

        # side
        if str.lower(side) == 'bid':
            msg.append_pair(269, '0')  # order side
        elif str.lower(side) == 'ask':
            msg.append_pair(269, '1')
        else:
            print('[FIXMESSAGE]Unknown side..')
            return

        msg.append_pair(271, volume)  #volume
        msg.append_pair(270, price)  #price

        return msg.encode()
예제 #8
0
    def test_raw_data_tags(self):
        """Test functions to add and remove raw data tags."""
        raw = b"raw\x015000=1"

        pkt = FixMessage()
        pkt.append_pair(8, "FIX.4.2")
        pkt.append_pair(35, "D")
        pkt.append_data(5001, 5002, raw)
        buf = pkt.encode()

        parser = FixParser()
        parser.add_raw(5001, 5002)
        parser.append_buffer(buf)
        msg = parser.get_message()

        self.assertIsNotNone(msg)
        self.assertEqual(b"FIX.4.2", msg.get(8))
        self.assertEqual(b"D", msg.get(35))
        self.assertEqual(len(raw), int(msg.get(5001)))
        self.assertEqual(raw, msg.get(5002))

        parser.reset()
        parser.remove_raw(5001, 5002)
        parser.append_buffer(buf)
        msg = parser.get_message()

        self.assertIsNotNone(msg)
        self.assertEqual(b"FIX.4.2", msg.get(8))
        self.assertEqual(b"D", msg.get(35))
        self.assertEqual(len(raw), int(msg.get(5001)))
        self.assertEqual(b"raw", msg.get(5002))
        self.assertEqual(b"1", msg.get(5000))
        return
예제 #9
0
    def new_order(self, ticker, price, volume, order_type, side, sender,
                  target, seq_no):

        msg = Message()
        msg.append_pair(8, self.header)
        msg.append_pair(34, seq_no)  # sequence no
        msg.append_pair(35, 'D')  # msgType = logon
        msg.append_pair(49, sender)
        msg.append_time(52)  # timestamp
        msg.append_pair(56, target)
        msg.append_pair(55, ticker)  # subscribed ticker
        msg.append_pair(38, volume)
        msg.append_pair(21, '3')
        msg.append_pair(44, price)

        # side
        if str.lower(side) == 'bid':
            msg.append_pair(54, '0')  # order side
        else:
            msg.append_pair(54, '1')

        # order type
        if str.lower(order_type) == 'market':
            msg.append_pair(40, '1')
        elif str.lower(order_type) == 'limit':
            msg.append_pair(40, '2')

        return msg.encode()
예제 #10
0
    def execution_report(self, message, filled_qty, trasaction_type, order_id,
                         symbol):

        parser = Parser()
        parser.append_buffer(message)
        message_recv = parser.get_message()

        msg = Message()
        msg.append_pair(8, self.header)
        msg.append_pair(34, int(message_recv.get(34)) + 1)  # sequence no
        msg.append_pair(35, '8')  # msgType = logon
        msg.append_pair(49, message_recv.get(56))
        msg.append_time(52)  # timestamp
        msg.append_pair(56, message_recv.get(49))
        msg.append_pair(14, filled_qty)
        msg.append_pair(31, message_recv.get(44))
        msg.append_pair(32, message_recv.get(38))
        msg.append_pair(54, message_recv.get(54))
        msg.append_pair(37, order_id)  # orderID
        msg.append_pair(39, '0')  # order status, now it's all filled
        msg.append_pair(55, symbol)  # subscribed ticker

        if str.lower(trasaction_type) == 'new':
            msg.append_pair(279, '0')
        elif str.lower(trasaction_type) == 'cancel':
            msg.append_pair(279, '2')
        elif str.lower(trasaction_type) == 'amend':
            msg.append_pair(279, '1')

        return msg.encode()
예제 #11
0
 def test_encode_no_8(self):
     msg = FixMessage()
     msg.append_pair(35, "D")
     try:
         buf = msg.encode()
     except ValueError:
         pass
예제 #12
0
 def test_encode_no_35(self):
     msg = FixMessage()
     msg.append_pair(8, "FIX.4.2")
     try:
         buf = msg.encode()
     except ValueError:
         pass
예제 #13
0
파일: client.py 프로젝트: wpla/ftx
    def send(self, values: dict) -> None:
        with self._send_lock:
            msg = FixMessage()
            msg.append_pair(simplefix.TAG_BEGINSTRING, 'FIX.4.2')
            msg.append_pair(simplefix.TAG_SENDER_COMPID, self._sender_id)
            msg.append_pair(simplefix.TAG_TARGET_COMPID, self._target_id)
            msg.append_pair(simplefix.TAG_MSGSEQNUM, self._next_send_seq_num)
            for key, value in values.items():
                if isinstance(value, datetime):
                    msg.append_utc_timestamp(key, value)
                else:
                    msg.append_pair(key, value)
            if not msg.get(simplefix.TAG_SENDING_TIME):
                msg.append_utc_timestamp(simplefix.TAG_SENDING_TIME)
            encoded = msg.encode()
            self._last_send_time = time.time()
            self._next_send_seq_num += 1

            try:
                print('send', encoded.replace(b'\x01', b'|'))
                self._sock.sendall(encoded)
            except OSError:
                self.close(clean=False)
                return

            if msg.message_type == simplefix.MSGTYPE_LOGON:
                self._has_session = True
예제 #14
0
 def test_strings(self):
     """Test adding fields from a sequence of tag=value strings"""
     msg = FixMessage()
     msg.append_strings(["8=FIX.4.4", "35=0"])
     self.assertEqual(fix_str("8=FIX.4.4\x01"
                              "9=5\x01"
                              "35=0\x01"
                              "10=163\x01"),
                      msg.encode())
예제 #15
0
 def test_set_session_version(self):
     """Test minimal message"""
     pkt = FixMessage()
     pkt.append_pair(8, "FIX.4.4")
     pkt.append_pair(35, "0")
     self.assertEqual(fix_str("8=FIX.4.4\x01"
                              "9=5\x01"
                              "35=0\x01"
                              "10=163\x01"),
                      pkt.encode())
예제 #16
0
    def goodbye(self, sender, target, seq_no):

        msg = Message()
        msg.append_pair(8, self.header)
        msg.append_pair(34, seq_no)  # sequence no
        msg.append_pair(35, '5')  # msgType = logout
        msg.append_pair(49, sender)
        msg.append_time(52)  # timestamp
        msg.append_pair(56, target)
        return msg.encode()
예제 #17
0
 def test_header_field(self):
     """Test use of header flag"""
     msg = FixMessage()
     msg.append_pair(20000, "third")
     msg.append_pair(20001, "first", header=True)
     msg.append_pair(20002, "second", header=True)
     self.assertEqual(fix_str("20001=first\x01"
                              "20002=second\x01"
                              "20000=third\x01"),
                      msg.encode(True))
예제 #18
0
 async def _write_message(self, message: simplefix.FixMessage):
     """Sends a message to the server"""
     await self.lock.acquire()
     # This lock is needed for `logout` method, which writes synchronously rather than through write_queue
     try:
         self._append_sequence_number(message)
         self.writer.write(message.encode())
         logging.info(f"client sending message {fprint(message.encode())}")
         await self.writer.drain()
         self.last_msg_sent = datetime.now()
     finally:
         self.lock.release()
예제 #19
0
def heartbeat_msg(n):
    heartbeat = FixMessage()

    heartbeat.append_pair(8, "FIX.4.4")
    heartbeat.append_pair(35, "0")
    heartbeat.append_pair(34, n)
    heartbeat.append_pair(49, price_auth.SenderCompID)
    heartbeat.append_utc_timestamp(52)
    heartbeat.append_pair(56, price_auth.TargetCompID)
    heartbeat.append_pair(57, "QUOTE")

    s.sendall(heartbeat.encode())
예제 #20
0
    def aloha(self, sender, target, seq_no=1):

        msg = Message()
        msg.append_pair(8, self.header)
        msg.append_pair(34, seq_no)  # sequence no
        msg.append_pair(35, 'A')  # msgType = logon
        msg.append_pair(49, sender)
        msg.append_time(52)  # timestamp
        msg.append_pair(56, target)
        msg.append_pair(98, 0)  # encrypt type
        msg.append_pair(108, 30)  # heart beat
        msg.append_pair(141, 'N')  # reset sequence number
        return msg.encode()
예제 #21
0
    def cancel_order(self, order_id, sender, target, sequence_no):

        msg = Message()
        msg.append_pair(8, self.header)
        msg.append_pair(34, sequence_no)  # sequence no
        msg.append_pair(35, 'F')  # msgType = logon
        msg.append_pair(49, sender)
        msg.append_time(52)  # timestamp
        msg.append_pair(56, target)
        # cancel order by order_id
        msg.append_pair(37, order_id)  # orderID

        return msg.encode()
예제 #22
0
    def goodbye_back(self, message):

        parser = Parser()
        parser.append_buffer(message)
        message_recv = parser.get_message()

        msg = Message()
        msg.append_pair(8, self.header)
        msg.append_pair(34, int(message_recv.get(34)) + 1)  # sequence no
        msg.append_pair(35, '5')  # msgType = logout
        msg.append_pair(49, message_recv.get(56))
        msg.append_time(52)  # timestamp
        msg.append_pair(56, message_recv.get(49))
        return msg.encode()
예제 #23
0
def data_subscribe(n):
    data = FixMessage()

    data.append_pair(8, "FIX.4.4")
    data.append_pair(35, "V")
    data.append_pair(49, price_auth.SenderCompID)
    data.append_pair(56, price_auth.TargetCompID)
    data.append_pair(34, n)
    data.append_utc_timestamp(52)
    data.append_pair(262, "2")
    data.append_pair(263, "1")
    data.append_pair(264, "1")
    data.append_pair(265, "0")  #1
    data.append_pair(146, "1")
    data.append_pair(55, "EURUSD.spa")
    data.append_pair(267, "2")
    data.append_pair(269, "0")
    data.append_pair(269, "1")

    sent = data.encode()
    print("data request ", sent)

    s.sendall(data.encode())
    print(s.recv(price_auth.SocketConnectPort))
예제 #24
0
    def test_basic_fix_message(self):
        """Test parsing basic FIX message."""
        pkt = FixMessage()
        pkt.append_pair(8, "FIX.4.2")
        pkt.append_pair(35, "D")
        pkt.append_pair(29, "A")
        buf = pkt.encode()

        p = FixParser()
        p.append_buffer(buf)
        m = p.get_message()

        self.assertIsNotNone(m)
        self.assertEqual(b"FIX.4.2", m.get(8))
        self.assertEqual(b"D", m.get(35))
        self.assertEqual(b"A", m.get(29))
예제 #25
0
    def subscribe(self, ticker, sender, target, seq_no=1, rep_seq=1):

        msg = Message()
        msg.append_pair(8, self.header)
        msg.append_pair(34, seq_no)  # sequence no
        msg.append_pair(35, 'V')  # msgType = logon
        msg.append_pair(49, sender)
        msg.append_time(52)  # timestamp
        msg.append_pair(56, target)
        msg.append_pair(146, rep_seq)  # repeating sequence
        msg.append_pair(55, ticker)  # subscribed ticker
        msg.append_pair(262, 1)
        msg.append_pair(263, 1)
        msg.append_pair(264, 1)
        msg.append_pair(265, 1)
        msg.append_pair(267, 2)
        msg.append_pair(269, 0)

        return msg.encode()
예제 #26
0
 def send_message(self, message: simplefix.FixMessage):
     try:
         print("send:    ", message)
         self.socket_lock.acquire()
         self.socket_client.send(message.encode())
         self.socket_lock.release()
     # except socket.error as e:
     #     # A socket error
     #     pass
     #     print(e)
     # except IOError as e:
     #     print(e)
     #     if e.errno == errno.EPIPE:
     #         # EPIPE error
     #         pass
     #     else:
     #         pass
     # Other error
     except Exception as e:
         print(e)
예제 #27
0
    def test_raw_data(self):
        """Test parsing of raw data fields."""
        raw = b"raw\x01data"

        pkt = FixMessage()
        pkt.append_pair(8, "FIX.4.2")
        pkt.append_pair(35, "D")
        pkt.append_data(95, 96, raw)
        buf = pkt.encode()

        parser = FixParser()
        parser.append_buffer(buf)
        msg = parser.get_message()

        self.assertIsNotNone(msg)
        self.assertEqual(b"FIX.4.2", msg.get(8))
        self.assertEqual(b"D", msg.get(35))
        self.assertEqual(len(raw), int(msg.get(95)))
        self.assertEqual(raw, msg.get(96))
        return
예제 #28
0
    def test_stop_tag(self):
        """Test termination using alternative tag number."""
        pkt = FixMessage()
        pkt.append_pair(8, "FIX.4.2")
        pkt.append_pair(35, "D")
        pkt.append_pair(29, "A")
        pkt.append_pair(20000, "xxx")
        pkt.append_pair(10, "000")
        buf = pkt.encode()

        p = FixParser(stop_tag=20000)
        p.append_buffer(buf)
        m = p.get_message()

        self.assertIsNotNone(m)
        self.assertEqual(b"FIX.4.2", m.get(8))
        self.assertEqual(b"D", m.get(35))
        self.assertEqual(b"A", m.get(29))
        self.assertEqual(b"xxx", m.get(20000))
        self.assertEqual(False, 10 in m)
예제 #29
0
    def test_stop_tag_deprecated(self):
        """Test deprecated setting of stop tag."""
        pkt = FixMessage()
        pkt.append_pair(8, "FIX.4.2")
        pkt.append_pair(35, "D")
        pkt.append_pair(29, "A")
        pkt.append_pair(20000, "xxx")
        pkt.append_pair(10, "000")
        buf = pkt.encode()

        p = FixParser()
        p.set_message_terminator(tag=20000)
        p.append_buffer(buf)
        m = p.get_message()

        self.assertIsNotNone(m)
        self.assertEqual(b"FIX.4.2", m.get(8))
        self.assertEqual(b"D", m.get(35))
        self.assertEqual(b"A", m.get(29))
        self.assertEqual(b"xxx", m.get(20000))
        self.assertEqual(False, 10 in m)
예제 #30
0
    def amend_order(self, order_id, price, volume, order_type, sender, target,
                    sequence_no):

        msg = Message()
        msg.append_pair(8, self.header)
        msg.append_pair(34, sequence_no)  # sequence no
        msg.append_pair(35, 'G')  # msgType = logon
        msg.append_pair(49, sender)
        msg.append_time(52)  # timestamp
        msg.append_pair(56, target)
        # cancel order by order_id
        msg.append_pair(37, order_id)  # orderID
        msg.append_pair(44, price)
        msg.append_pair(38, volume)

        # side
        if str.lower(order_type) == 'market':
            msg.append_pair(40, '1')  # order side
        else:
            msg.append_pair(40, '2')

        return msg.encode()