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
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)
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
def test_empty_message(self): """Test encoding of empty message""" if VERSION == 26: return msg = FixMessage() with self.assertRaises(ValueError): msg.encode()
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())
def test_empty_message(self): try: msg = FixMessage() buf = msg.encode() except Exception as e: self.assertEqual(ValueError, type(e)) return
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()
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
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()
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()
def test_encode_no_8(self): msg = FixMessage() msg.append_pair(35, "D") try: buf = msg.encode() except ValueError: pass
def test_encode_no_35(self): msg = FixMessage() msg.append_pair(8, "FIX.4.2") try: buf = msg.encode() except ValueError: pass
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
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())
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())
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()
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))
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()
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())
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()
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()
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()
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))
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))
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()
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)
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
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)
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)
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()