def test_order_book_not_storing_transactions(self): order_book = OrderBook(store_transactions=False) order_book.add(Order((1, "Limit", "Buy", 100, 100, 0))) self.assertEqual(order_book.last_transactions, []) order_book.add(Order((2, "Limit", "Sell", 100, 100, 0))) self.assertEqual(order_book.last_transactions, []) self.assertEqual(order_book.get_state(), '{"buyOrders": [], "sellOrders": []}')
def test_order_book_cancel_order(self): order_book = OrderBook() order = Order((1, "Limit", "Buy", 100, 100, 0)) order_book.add(order) order_book.cancel(order) self.assertEqual(order_book.get_state(), '{"buyOrders": [], "sellOrders": []}')
def test_order_book_add_order(self): order_book = OrderBook() order = Order((1, "Limit", "Buy", 100, 100, 0)) order_book.add(order) self.assertEqual( order_book.get_state(), '{"buyOrders": [{"id": 1, "price": 100, "quantity": 100}], "sellOrders": []}' )
def test_order_book_limit_transactions(self): order_book = OrderBook(store_transactions=True) order_book.add(Order((1, "Limit", "Buy", 100, 100, 0))) self.assertEqual(order_book.last_transactions, []) order_book.add(Order((2, "Limit", "Sell", 80, 50, 0))) self.assertEqual(order_book.last_transactions, [ '{"buyOrderId": 1, "sellOrderId": 2, "price": 100, "quantity": 50}' ]) order_book.add(Order((3, "Limit", "Sell", 120, 40, 0))) self.assertEqual(order_book.last_transactions, []) self.assertEqual( order_book.get_state(), '{"buyOrders": [{"id": 1, "price": 100, "quantity": 50}],' ' "sellOrders": [{"id": 3, "price": 120, "quantity": 40}]}')
def test_correct_iceberg_tuple(self): order = Order((1, "Iceberg", "Buy", 100, 100, 10)) self.assertEqual(order.id, 1) self.assertEqual(order.type, "Iceberg") self.assertEqual(order.direction, "Buy") self.assertEqual(order.quantity, 10) self.assertEqual(order.hidden_quantity, 90) self.assertEqual(order.price, 100) self.assertEqual(order.peak, 10)
def test_correct_limit_json(self): order = Order( '{"type": "Limit", "order":' '{"direction": "Buy", "id": 1, "price": 100, "quantity": 100}}') self.assertEqual(order.id, 1) self.assertEqual(order.type, "Limit") self.assertEqual(order.direction, "Buy") self.assertEqual(order.quantity, 100) self.assertEqual(order.hidden_quantity, 0) self.assertEqual(order.price, 100)
def generate_random_orders( number_of_orders: int, iceberg_probability: float = default_iceberg_probability, price_mean: int = default_price_mean, price_deviation: int = default_price_deviation, quantity_mean: int = default_quantity_mean, quantity_deviation: int = default_quantity_deviation, peak_min: int = default_peak_min, peak_max: int = default_peak_max, output_file: str = default_data_file): """ :param number_of_orders: the total number of orders :param iceberg_probability: the expected relative amount of iceberg type orders :param price_mean: normal distribution mean for 'price' field :param price_deviation: standard deviation for 'price' field :param quantity_mean: normal distribution mean for 'quantity' field :param quantity_deviation: standard deviation for 'quantity' field :param peak_min: minimum value of 'peak' field :param peak_max: maximum value of 'peak' field :param output_file: output file name Generates a series of random transactions to a JSON file. """ orders = [] print("Generating data...") for i in range(number_of_orders): order_type = "Limit" direction = "Buy" if random.random() < 0.5 else "Sell" peak = 0 quantity = _generate(quantity_mean, quantity_deviation, random.normalvariate) if random.random() < iceberg_probability: order_type = "Iceberg" peak = min(_generate(peak_min, peak_max, random.uniform), quantity // 2) price = _generate(price_mean, price_deviation, random.normalvariate) orders.append( Order((i + 1, order_type, direction, price, quantity, peak)).__dict__(simple=False)) print("Generated data. Saving to " + output_file + " file...") with open(output_file, 'w') as file: json.dump(orders, file, indent=4)
def create_order_list(output_file: str = default_data_file) -> list[Order]: """ :param output_file: JSON file containing serialized orders :return: list of order objects Creates a list of orders from a given file. """ orders = [] try: with open(output_file) as json_file: orders_data = json.load(json_file) for order_data in orders_data: order = Order(json.dumps(order_data)) orders.append(order) except json.JSONDecodeError as error: print("JSON decoder error: " + str(error)) return orders
def test_order_book_iceberg_transactions(self): order_book = OrderBook(store_transactions=True) orders = [ '{"type": "Iceberg", "order": {"direction": "Sell", "id": 1, "price": 100, "quantity": 200, "peak": 100}}', '{"type": "Iceberg", "order": {"direction": "Sell", "id": 2, "price": 100, "quantity": 300, "peak": 100}}', '{"type": "Iceberg", "order": {"direction": "Sell", "id": 3, "price": 100, "quantity": 200, "peak": 100}}', '{"type": "Iceberg", "order": {"direction": "Buy", "id": 4, "price": 100, "quantity": 500, "peak": 100}}' ] expected_states = [ '{"buyOrders": [], "sellOrders": [{"id": 1, "price": 100, "quantity": 100}]}', '{"buyOrders": [], "sellOrders":' ' [{"id": 1, "price": 100, "quantity": 100}, {"id": 2, "price": 100, "quantity": 100}]}', '{"buyOrders": [], "sellOrders":' ' [{"id": 1, "price": 100, "quantity": 100}, {"id": 2, "price": 100, "quantity": 100},' ' {"id": 3, "price": 100, "quantity": 100}]}', '{"buyOrders": [], "sellOrders":' ' [{"id": 3, "price": 100, "quantity": 100}, {"id": 2, "price": 100, "quantity": 100}]}' ] expected_transactions = [ [], [], [], [ '{"buyOrderId": 4, "sellOrderId": 1, "price": 100, "quantity": 100}', '{"buyOrderId": 4, "sellOrderId": 2, "price": 100, "quantity": 100}', '{"buyOrderId": 4, "sellOrderId": 3, "price": 100, "quantity": 100}', '{"buyOrderId": 4, "sellOrderId": 1, "price": 100, "quantity": 100}', '{"buyOrderId": 4, "sellOrderId": 2, "price": 100, "quantity": 100}' ] ] for i in range(4): order_book.add(Order(orders[i])) self.assertEqual(order_book.get_state(), expected_states[i]) self.assertEqual(order_book.last_transactions, expected_transactions[i])
def test_order_book_cancel_not_present_order(self): order_book = OrderBook() order = Order((1, "Limit", "Buy", 100, 100, 0)) order_book.add(order) order_book.cancel(order) self.assertRaises(ValueError, order_book.cancel, order)