예제 #1
0
    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": []}')
예제 #2
0
 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": []}')
예제 #3
0
 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": []}'
     )
예제 #4
0
    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}]}')
예제 #5
0
 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)
예제 #6
0
 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)
예제 #7
0
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)
예제 #8
0
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
예제 #9
0
    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])
예제 #10
0
 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)