def setUp(self, annotate=True): yield super(TestDatabase, self).setUp(annotate=annotate) path = os.path.join(self.getStateDir(), 'sqlite') if not os.path.exists(path): os.makedirs(path) self.database = MarketDB(self.getStateDir()) self.order_id1 = OrderId(TraderId('3'), OrderNumber(4)) self.order_id2 = OrderId(TraderId('4'), OrderNumber(5)) self.order1 = Order(self.order_id1, Price(5, 'EUR'), Quantity(6, 'BTC'), Timeout(3600), Timestamp.now(), True) self.order2 = Order(self.order_id2, Price(5, 'EUR'), Quantity(6, 'BTC'), Timeout(3600), Timestamp.now(), False) self.transaction_id1 = TransactionId(TraderId("0"), TransactionNumber(4)) self.transaction1 = Transaction(self.transaction_id1, Price(100, 'BTC'), Quantity(30, 'MC'), OrderId(TraderId("0"), OrderNumber(1)), OrderId(TraderId("1"), OrderNumber(2)), Timestamp(20.0)) self.payment1 = Payment(MessageId(TraderId("0"), MessageNumber("4")), self.transaction_id1, Quantity(5, 'MC'), Price(6, 'BTC'), WalletAddress('abc'), WalletAddress('def'), PaymentId("abc"), Timestamp(20.0), False) self.transaction1.add_payment(self.payment1)
def test_from_network(self): # Test for from network now = Timestamp.now() data = Bid.from_network( type( 'Data', (object, ), { "trader_id": TraderId('0'), "order_number": OrderNumber(2), "message_number": MessageNumber('message_number'), "price": Price(63400, 'BTC'), "quantity": Quantity(40, 'MC'), "timeout": Timeout(30), "timestamp": now, "public_key": 'a', "signature": 'b' })) self.assertEquals( MessageId(TraderId('0'), MessageNumber('message_number')), data.message_id) self.assertEquals(Price(63400, 'BTC'), data.price) self.assertEquals(Quantity(40, 'MC'), data.quantity) self.assertEquals(float(Timeout(30)), float(data.timeout)) self.assertEquals(now, data.timestamp) self.assertEquals('a', data._public_key) self.assertEquals('b', data._signature)
def test_proposed_trade_cache_timeout(self): """ Test the timeout method of a proposed trade request in the cache """ ask = Ask( OrderId(TraderId(self.market_community.mid), OrderNumber(24)), Price(63400, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600), Timestamp.now()) order = Order(OrderId(TraderId("0"), OrderNumber(23)), Price(20, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600.0), Timestamp.now(), False) self.market_community.order_book.insert_ask(ask) self.assertEqual(len(self.market_community.order_book.asks), 1) self.market_community.order_manager.order_repository.add(order) order.reserve_quantity_for_tick(self.proposed_trade.recipient_order_id, Quantity(30, 'DUM2')) self.market_community.order_manager.order_repository.update(order) mocked_match_message = MockObject() mocked_match_message.payload = MockObject() mocked_match_message.payload.matchmaker_trader_id = 'a' self.market_community.incoming_match_messages[ 'a'] = mocked_match_message def mocked_send_decline(*_): mocked_send_decline.called = True mocked_send_decline.called = False self.market_community.send_decline_match_message = mocked_send_decline cache = ProposedTradeRequestCache(self.market_community, self.proposed_trade, 'a') cache.on_timeout() self.assertTrue(mocked_send_decline.called)
def test_bid_side_depth(self): # Test for bid side depth self.order_book.insert_bid(self.bid) self.order_book.insert_bid(self.bid2) self.assertEquals(Quantity(30, 'MC'), self.order_book.bid_side_depth(Price(300, 'BTC'))) self.assertEquals([(Price(200, 'BTC'), Quantity(30, 'MC')), (Price(300, 'BTC'), Quantity(30, 'MC'))], self.order_book.get_bid_side_depth_profile('BTC', 'MC'))
def test_from_network(self): # Test for from network data = ProposedTrade.from_network( type( 'Data', (object, ), { "trader_id": TraderId('0'), "message_id": MessageId(TraderId('0'), MessageNumber(1)), "order_number": OrderNumber(1), "recipient_order_id": OrderId(TraderId('1'), OrderNumber(2)), "proposal_id": 1234, "timestamp": Timestamp(1462224447.117), "price": Price(63400, 'BTC'), "quantity": Quantity(30, 'MC') })) self.assertEquals(MessageId(TraderId('0'), MessageNumber(1)), data.message_id) self.assertEquals(OrderId(TraderId('0'), OrderNumber(1)), data.order_id) self.assertEquals(OrderId(TraderId('1'), OrderNumber(2)), data.recipient_order_id) self.assertEquals(1234, data.proposal_id) self.assertEquals(Price(63400, 'BTC'), data.price) self.assertEquals(Quantity(30, 'MC'), data.quantity) self.assertEquals(Timestamp(1462224447.117), data.timestamp)
def test_ask_side_depth(self): # Test for ask side depth self.order_book.insert_ask(self.ask) self.order_book.insert_ask(self.ask2) self.assertEquals(Quantity(30, 'MC'), self.order_book.ask_side_depth(Price(100, 'BTC'))) self.assertEquals([(Price(100, 'BTC'), Quantity(30, 'MC')), (Price(400, 'BTC'), Quantity(30, 'MC'))], self.order_book.get_ask_side_depth_profile('BTC', 'MC'))
def from_database(cls, data, payments): """ Create a Transaction object based on information in the database. """ trader_id, transaction_number, order_trader_id, order_number, partner_trader_id, partner_order_number, price,\ price_type, transferred_price, quantity, quantity_type, transferred_quantity, transaction_timestamp,\ sent_wallet_info, received_wallet_info, incoming_address, outgoing_address, partner_incoming_address,\ partner_outgoing_address, match_id = data transaction_id = TransactionId(TraderId(str(trader_id)), TransactionNumber(transaction_number)) transaction = cls( transaction_id, Price(price, str(price_type)), Quantity(quantity, str(quantity_type)), OrderId(TraderId(str(order_trader_id)), OrderNumber(order_number)), OrderId(TraderId(str(partner_trader_id)), OrderNumber(partner_order_number)), Timestamp(float(transaction_timestamp))) transaction._transferred_price = Price(transferred_price, str(price_type)) transaction._transferred_quantity = Quantity(transferred_quantity, str(quantity_type)) transaction.sent_wallet_info = sent_wallet_info transaction.received_wallet_info = received_wallet_info transaction.incoming_address = WalletAddress(str(incoming_address)) transaction.outgoing_address = WalletAddress(str(outgoing_address)) transaction.partner_incoming_address = WalletAddress( str(partner_incoming_address)) transaction.partner_outgoing_address = WalletAddress( str(partner_outgoing_address)) transaction.match_id = str(match_id) transaction._payments = payments return transaction
def test_from_network(self): # Test for from network data = Payment.from_network( type( 'Data', (object, ), { "message_id": MessageId(TraderId("0"), MessageNumber(1)), "transaction_id": TransactionId(TraderId('2'), TransactionNumber(2)), "transferee_quantity": Quantity(3, 'MC'), "transferee_price": Price(2, 'BTC'), "address_from": WalletAddress('a'), "address_to": WalletAddress('b'), "payment_id": PaymentId('aaa'), "timestamp": Timestamp(4.0), "success": True })) self.assertEquals(MessageId(TraderId("0"), MessageNumber(1)), data.message_id) self.assertEquals(TransactionId(TraderId('2'), TransactionNumber(2)), data.transaction_id) self.assertEquals(Quantity(3, 'MC'), data.transferee_quantity) self.assertEquals(Price(2, 'BTC'), data.transferee_price) self.assertEquals(Timestamp(4.0), data.timestamp) self.assertTrue(data.success)
def test_tick_price(self): # Test for tick price self.order_book.insert_ask(self.ask2) self.order_book.insert_bid(self.bid2) self.assertEquals(Price(300, 'BTC'), self.order_book.relative_tick_price(self.ask)) self.assertEquals(Price(100, 'BTC'), self.order_book.relative_tick_price(self.bid))
def test_properties(self): # Test for properties self.order_book.insert_ask(self.ask2) self.order_book.insert_bid(self.bid2) self.assertEquals(Price(0.0875, 'MB', 'BTC'), self.order_book.get_mid_price('MB', 'BTC')) self.assertEquals(Price(-0.025, 'MB', 'BTC'), self.order_book.get_bid_ask_spread('MB', 'BTC'))
def test_init(self): """ Test the initialization of a price """ with self.assertRaises(ValueError): Price('1', 'MC') with self.assertRaises(ValueError): Price(1, 2)
def test_properties(self): # Test for properties self.order_book.insert_ask(self.ask2) self.order_book.insert_bid(self.bid2) self.assertEquals(Price(350, 'BTC'), self.order_book.get_mid_price('BTC', 'MC')) self.assertEquals(Price(100, 'BTC'), self.order_book.get_bid_ask_spread('BTC', 'MC'))
def test_pagerank_2(self): """ Test isolated nodes during a Temporal Pagerank computation """ self.insert_transaction('a', 'b', Quantity(1, 'BTC'), Price(1, 'MC')) self.insert_transaction('c', 'd', Quantity(1, 'BTC'), Price(1, 'MC')) rep_dict = self.compute_reputations() self.assertTrue('c' in rep_dict) self.assertTrue('d' in rep_dict)
def setUp(self): # Object creation self.tick = Tick(OrderId(TraderId('0'), OrderNumber(1)), Price(400, 'BTC'), Quantity(30, 'MC'), Timeout(float("inf")), Timestamp(float("inf")), True) self.tick2 = Tick(OrderId(TraderId('1'), OrderNumber(2)), Price(800, 'BTC'), Quantity(30, 'MC'), Timeout(float("inf")), Timestamp(float("inf")), True) self.side = Side()
def test_bid_side_depth(self): # Test for bid side depth self.order_book.insert_bid(self.bid) self.order_book.insert_bid(self.bid2) self.assertEquals( 300, self.order_book.bid_side_depth(Price(0.1, 'MB', 'BTC'))) self.assertEquals([(Price(0.1, 'MB', 'BTC'), 300), (Price(0.15, 'MB', 'BTC'), 200)], self.order_book.get_bid_side_depth_profile( 'MB', 'BTC'))
def test_match_order_divided(self): # Test for match order divided over two ticks self.order_book.insert_ask(self.ask) self.order_book.insert_ask(self.ask2) proposed_trades = self.price_time_strategy.match_order(self.bid_order2) self.assertEquals(2, len(proposed_trades)) self.assertEquals(Price(100, 'BTC'), proposed_trades[0].price) self.assertEquals(Quantity(30, 'MC'), proposed_trades[0].quantity) self.assertEquals(Price(100, 'BTC'), proposed_trades[1].price) self.assertEquals(Quantity(30, 'MC'), proposed_trades[1].quantity)
def test_ask_side_depth(self): # Test for ask side depth self.order_book.insert_ask(self.ask) self.order_book.insert_ask(self.ask2) self.assertEquals( 100, self.order_book.ask_side_depth(Price(0.3, 'MB', 'BTC'))) self.assertEquals([(Price(0.075, 'MB', 'BTC'), 400), (Price(0.3, 'MB', 'BTC'), 100)], self.order_book.get_ask_side_depth_profile( 'MB', 'BTC'))
def setUp(self): # Object creation self.memory_order_repository = MemoryOrderRepository("0") self.order_id = OrderId(TraderId("0"), OrderNumber(1)) self.order = Order(self.order_id, Price(100, 'BTC'), Quantity(30, 'MC'), Timeout(0.0), Timestamp(10.0), False) self.order2 = Order(self.order_id, Price(1000, 'BTC'), Quantity(30, 'MC'), Timeout(0.0), Timestamp(10.0), False)
def test_create_bid_order(self): # Test for create bid order bid_order = self.order_manager.create_bid_order( Price(100, 'BTC'), Quantity(10, 'MC'), Timeout(0.0)) self.assertFalse(bid_order.is_ask()) self.assertEquals(OrderId(TraderId("0"), OrderNumber(1)), bid_order.order_id) self.assertEquals(Price(100, 'BTC'), bid_order.price) self.assertEquals(Quantity(10, 'MC'), bid_order.total_quantity) self.assertEquals(0.0, float(bid_order.timeout))
def update_ticks(self, ask_order_dict, bid_order_dict, traded_quantity, unreserve=True): """ Update ticks according to a TradeChain block containing the status of the ask/bid orders. :type ask_order_dict: dict :type bid_order_dict: dict :type traded_quantity: Quantity :type unreserve: bool """ assert isinstance(ask_order_dict, dict), type(ask_order_dict) assert isinstance(bid_order_dict, dict), type(bid_order_dict) assert isinstance(traded_quantity, Quantity), type(traded_quantity) assert isinstance(unreserve, bool), type(unreserve) ask_order_id = OrderId(TraderId(ask_order_dict["trader_id"]), OrderNumber(ask_order_dict["order_number"])) bid_order_id = OrderId(TraderId(bid_order_dict["trader_id"]), OrderNumber(bid_order_dict["order_number"])) self._logger.debug("Updating ticks in order book: %s and %s (traded quantity: %s)", str(ask_order_id), str(bid_order_id), str(traded_quantity)) # Update ask tick new_ask_quantity = Quantity(ask_order_dict["quantity"] - ask_order_dict["traded_quantity"], ask_order_dict["quantity_type"]) if self.tick_exists(ask_order_id) and new_ask_quantity <= self.get_tick(ask_order_id).quantity: tick = self.get_tick(ask_order_id) tick.quantity = new_ask_quantity if unreserve: tick.release_for_matching(traded_quantity) if tick.quantity <= Quantity(0, ask_order_dict["quantity_type"]): self.remove_tick(tick.order_id) self.completed_orders.append(tick.order_id) elif not self.tick_exists(ask_order_id) and new_ask_quantity > Quantity(0, ask_order_dict["quantity_type"]): ask = Ask(ask_order_id, Price(ask_order_dict["price"], ask_order_dict["price_type"]), new_ask_quantity, Timeout(ask_order_dict["timeout"]), Timestamp(ask_order_dict["timestamp"])) self.insert_ask(ask) # Update bid tick new_bid_quantity = Quantity(bid_order_dict["quantity"] - bid_order_dict["traded_quantity"], bid_order_dict["quantity_type"]) if self.tick_exists(bid_order_id) and new_bid_quantity <= self.get_tick(bid_order_id).quantity: tick = self.get_tick(bid_order_id) tick.quantity = new_bid_quantity if unreserve: tick.release_for_matching(traded_quantity) if tick.quantity <= Quantity(0, bid_order_dict["quantity_type"]): self.remove_tick(tick.order_id) self.completed_orders.append(tick.order_id) elif not self.tick_exists(bid_order_id) and new_bid_quantity > Quantity(0, bid_order_dict["quantity_type"]): bid = Bid(bid_order_id, Price(bid_order_dict["price"], bid_order_dict["price_type"]), new_bid_quantity, Timeout(bid_order_dict["timeout"]), Timestamp(bid_order_dict["timestamp"])) self.insert_bid(bid)
def setUp(self, annotate=True): yield super(TickEntryTestSuite, self).setUp(annotate=annotate) # Object creation tick = Tick(OrderId(TraderId('0'), OrderNumber(1)), Price(63400, 'BTC'), Quantity(30, 'MC'), Timeout(0.0), Timestamp(0.0), True) tick2 = Tick(OrderId(TraderId('0'), OrderNumber(2)), Price(63400, 'BTC'), Quantity(30, 'MC'), Timeout(100), Timestamp.now(), True) self.price_level = PriceLevel('MC') self.tick_entry = TickEntry(tick, self.price_level) self.tick_entry2 = TickEntry(tick2, self.price_level)
def setUp(self): # Object creation tick = Tick(MessageId(TraderId('0'), MessageNumber('message_number')), OrderId(TraderId('0'), OrderNumber(1)), Price(63400, 'BTC'), Quantity(30, 'MC'), Timeout(0.0), Timestamp(0.0), True) tick2 = Tick(MessageId(TraderId('0'), MessageNumber('message_number')), OrderId(TraderId('0'), OrderNumber(2)), Price(63400, 'BTC'), Quantity(30, 'MC'), Timeout(100), Timestamp.now(), True) self.price_level = PriceLevel('MC') self.tick_entry = TickEntry(tick, self.price_level) self.tick_entry2 = TickEntry(tick2, self.price_level)
def setUp(self, annotate=True): yield super(CommunityTestSuite, self).setUp(annotate=annotate) dummy1_wallet = DummyWallet1() dummy2_wallet = DummyWallet2() self.market_community = MarketCommunity(self.dispersy, self.master_member, self.member) self.market_community.initialize(wallets={ dummy1_wallet.get_identifier(): dummy1_wallet, dummy2_wallet.get_identifier(): dummy2_wallet }, use_database=False) self.market_community.use_local_address = True self.dispersy._lan_address = ("127.0.0.1", 1234) self.dispersy._endpoint.open(self.dispersy) self.dispersy.attach_community(self.market_community) eccrypto = ECCrypto() ec = eccrypto.generate_key(u"curve25519") member = Member(self.dispersy, ec, 1) trader_id = hashlib.sha1(member.public_key).digest().encode('hex') self.ask = Ask( MessageId(TraderId('0'), MessageNumber('message_number')), OrderId(TraderId(trader_id), OrderNumber(1234)), Price(63400, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600), Timestamp.now()) self.ask.sign(member) self.bid = Bid( MessageId(TraderId('1'), MessageNumber('message_number')), OrderId(TraderId(trader_id), OrderNumber(1235)), Price(343, 'DUM1'), Quantity(22, 'DUM2'), Timeout(3600), Timestamp.now()) self.bid.sign(member) self.order = Order( OrderId(TraderId(self.market_community.mid), OrderNumber(24)), Price(20, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600.0), Timestamp.now(), False) self.proposed_trade = Trade.propose( MessageId(TraderId('0'), MessageNumber('message_number')), OrderId(TraderId('0'), OrderNumber(23)), OrderId(TraderId(self.market_community.mid), OrderNumber(24)), Price(20, 'DUM1'), Quantity(30, 'DUM2'), Timestamp.now())
def test_pagerank_3(self): """ Test a more involved example of a Temporal Pagerank computation """ self.insert_transaction('a', 'b', Quantity(1, 'BTC'), Price(1, 'MC')) self.insert_transaction('b', 'c', Quantity(100, 'BTC'), Price(100, 'MC')) self.insert_transaction('b', 'd', Quantity(100, 'BTC'), Price(100, 'MC')) self.insert_transaction('b', 'e', Quantity(100, 'BTC'), Price(100, 'MC')) rep_dict = self.compute_reputations() self.assertEqual(len(rep_dict.keys()), 5) for _, rep in rep_dict.iteritems(): self.assertGreater(rep, 0)
def setUp(self): # Object creation self.timestamp_now = Timestamp.now() self.tick = Tick(OrderId(TraderId('0'), OrderNumber(1)), Price(63400, 'BTC'), Quantity(30, 'MC'), Timeout(30), self.timestamp_now, True) self.tick2 = Tick(OrderId(TraderId('0'), OrderNumber(2)), Price(63400, 'BTC'), Quantity(30, 'MC'), Timeout(0.0), Timestamp(0.0), False) self.order_ask = Order(OrderId(TraderId('0'), OrderNumber(2)), Price(63400, 'BTC'), Quantity(30, 'MC'), Timeout(0.0), Timestamp(0.0), True) self.order_bid = Order(OrderId(TraderId('0'), OrderNumber(2)), Price(63400, 'BTC'), Quantity(30, 'MC'), Timeout(0.0), Timestamp(0.0), False)
def setUp(self): # Object creation tick = Tick(OrderId(TraderId('0'), OrderNumber(1)), Price(63400, 'BTC'), Quantity(30, 'MC'), Timeout(float("inf")), Timestamp(float("inf")), True) tick2 = Tick(OrderId(TraderId('0'), OrderNumber(2)), Price(30, 'MC'), Quantity(30, 'BTC'), Timeout(float("inf")), Timestamp(float("inf")), True) self.price_level = PriceLevel('MC') self.tick_entry1 = TickEntry(tick, self.price_level) self.tick_entry2 = TickEntry(tick, self.price_level) self.tick_entry3 = TickEntry(tick, self.price_level) self.tick_entry4 = TickEntry(tick, self.price_level) self.tick_entry5 = TickEntry(tick2, self.price_level)
def setUp(self): # Object creation self.proposed_trade_payload = TradePayload.Implementation( MetaObject(), TraderId('0'), MessageNumber('message_number'), OrderNumber(1), TraderId('1'), OrderNumber(2), 1235, Price(63400, 'BTC'), Quantity(30, 'MC'), Timestamp(1462224447.117), '192.168.1.1', 1234)
def setUp(self): # Object creation self.payment_payload = PaymentPayload.Implementation( MetaObject(), TraderId('0'), MessageNumber('1'), TraderId('2'), TransactionNumber(2), Quantity(20, 'MC'), Price(10, 'BTC'), WalletAddress('a'), WalletAddress('b'), PaymentId('3'), Timestamp(0.0), True)
def test_properties(self): """ Test the start transaction payload """ self.assertEquals(MessageNumber('1'), self.start_transaction_payload.message_number) self.assertEquals(TransactionNumber(2), self.start_transaction_payload.transaction_number) self.assertEquals(Timestamp(0.0), self.start_transaction_payload.timestamp) self.assertEquals(TraderId('2'), self.start_transaction_payload.transaction_trader_id) self.assertEquals(TraderId('2'), self.start_transaction_payload.order_trader_id) self.assertEquals(OrderNumber(3), self.start_transaction_payload.order_number) self.assertEquals(TraderId('0'), self.start_transaction_payload.recipient_trader_id) self.assertEquals( OrderNumber(4), self.start_transaction_payload.recipient_order_number) self.assertEquals(1236, self.start_transaction_payload.proposal_id) self.assertEquals(Price(2, 'BTC'), self.start_transaction_payload.price) self.assertEquals(Quantity(3, 'MC'), self.start_transaction_payload.quantity)
def setUp(self): # Object creation self.start_transaction_payload = StartTransactionPayload.Implementation( MetaObject(), TraderId('0'), MessageNumber('1'), TraderId('2'), TransactionNumber(2), TraderId('2'), OrderNumber(3), TraderId('0'), OrderNumber(4), 1236, Price(2, 'BTC'), Quantity(3, 'MC'), Timestamp(0.0))