mango-explorer/tests/test_orderbook.py

82 lines
2.9 KiB
Python

import random
import typing
from .context import mango
from decimal import Decimal
from .fakes import fake_order_id
def test_order_book_sides_sorted_by_price() -> None:
bids_side = _construct_order_book_side(mango.Side.BUY, 5)
asks_side = _construct_order_book_side(mango.Side.SELL, 5)
order_book = _construct_order_book(bids=bids_side, asks=asks_side)
assert sorted(bids_side, key=lambda o: o.price, reverse=True) == order_book.bids
assert sorted(asks_side, key=lambda o: o.price, reverse=False) == order_book.asks
def test_orderbook_top_bids_and_asks() -> None:
bids = _construct_order_book_side(mango.Side.BUY, 7)
asks = _construct_order_book_side(mango.Side.SELL, 7)
orderBook: mango.OrderBook = _construct_order_book(bids=bids, asks=asks)
assert _get_order(bids, -1) == orderBook.top_bid
assert _get_order(asks) == orderBook.top_ask
# update orderbook
update_bids = _construct_order_book_side(mango.Side.BUY, 5)
update_asks = _construct_order_book_side(mango.Side.SELL, 5)
orderBook.bids = update_bids
orderBook.asks = update_asks
assert _get_order(update_bids, -1) == orderBook.top_bid
assert _get_order(update_asks) == orderBook.top_ask
def test_orderbook_spread() -> None:
bids = _construct_order_book_side(mango.Side.BUY, 7)
asks = _construct_order_book_side(mango.Side.SELL, 7)
# None's in book
orderBook: mango.OrderBook = _construct_order_book(bids=bids, asks=[])
assert orderBook.spread == Decimal(0)
orderBook = _construct_order_book(bids=[], asks=[])
assert orderBook.spread == Decimal(0)
orderBook = _construct_order_book([], [])
assert orderBook.spread == Decimal(0)
# ask's spread calculated from generated data
orderBook = _construct_order_book(bids=bids, asks=asks)
assert orderBook.spread == _get_order(asks).price - _get_order(bids, -1).price
# ASK is SELL, BID is BUY
def _construct_order_book_side(
askOrBidSide: mango.Side, size: int
) -> typing.Sequence[mango.Order]:
result_orders: typing.List[mango.Order] = []
for index, price in enumerate(random.sample(range(1, 1000), size)):
constructed_id = fake_order_id(index, price)
order = mango.Order.from_ids(
id=constructed_id,
client_id=0,
side=askOrBidSide,
price=Decimal(price),
quantity=Decimal(random.randint(1, 100)),
)
result_orders.append(order)
return result_orders
def _construct_order_book(
bids: typing.Sequence[mango.Order], asks: typing.Sequence[mango.Order]
) -> mango.OrderBook:
# construct orderbook
return mango.OrderBook(
symbol="TEST",
lot_size_converter=mango.NullLotSizeConverter(),
bids=bids,
asks=asks,
)
def _get_order(orders: typing.Sequence[mango.Order], index: int = 0) -> mango.Order:
return sorted(orders, key=lambda order: order.price)[index]