Fixed some linting issues.

This commit is contained in:
Geoff Taylor 2021-12-20 18:09:51 +00:00
parent 322b02429a
commit e644d08f47
3 changed files with 36 additions and 38 deletions

View File

@ -222,34 +222,32 @@ class OrderBook:
def __init__(self, symbol: str, lot_size_converter: LotSizeConverter, bids: typing.Sequence[Order], asks: typing.Sequence[Order]) -> None: def __init__(self, symbol: str, lot_size_converter: LotSizeConverter, bids: typing.Sequence[Order], asks: typing.Sequence[Order]) -> None:
self.symbol: str = symbol self.symbol: str = symbol
self.__lot_size_converter: LotSizeConverter = lot_size_converter self.__lot_size_converter: LotSizeConverter = lot_size_converter
self.bids: typing.Sequence[Order] = bids self.__bids: typing.Sequence[Order] = []
self.asks: typing.Sequence[Order] = asks self.__asks: typing.Sequence[Order] = []
self.bids = bids
self.asks = asks
@property @property
def bids(self) -> typing.Sequence[Order]: def bids(self) -> typing.Sequence[Order]:
return self._bids return self.__bids
@bids.setter @bids.setter
def bids(self, bids: typing.Sequence[Order]): def bids(self, bids: typing.Sequence[Order]) -> None:
""" Sort bids high to low, so best bid is at index 0 """ """ Sort bids high to low, so best bid is at index 0 """
bids_list: typing.List[Order] = list(bids) bids_list: typing.List[Order] = list(bids)
print(f'list of bids: {bids_list}')
bids_list.sort(key=lambda order: order.id, reverse=True) bids_list.sort(key=lambda order: order.id, reverse=True)
print(f'list of sorted bids: {bids_list}') self.__bids = bids_list
# bids_list.sort(key=lambda order: order.price, reverse=True)
self._bids = bids_list
@property @property
def asks(self) -> typing.Sequence[Order]: def asks(self) -> typing.Sequence[Order]:
return self._asks return self.__asks
@asks.setter @asks.setter
def asks(self, asks: typing.Sequence[Order]): def asks(self, asks: typing.Sequence[Order]) -> None:
""" Sets asks low to high, so best ask is at index 0""" """ Sets asks low to high, so best ask is at index 0"""
asks_list: typing.List[Order] = list(asks) asks_list: typing.List[Order] = list(asks)
asks_list.sort(key=lambda order: order.id) asks_list.sort(key=lambda order: order.id)
# asks_list.sort(key=lambda order: order.price) self.__asks = asks_list
self._asks = asks_list
# The top bid is the highest price someone is willing to pay to BUY # The top bid is the highest price someone is willing to pay to BUY
@property @property

View File

@ -133,10 +133,11 @@ def fake_wallet() -> mango.Wallet:
def fake_order(price: Decimal = Decimal(1), quantity: Decimal = Decimal(1), side: mango.Side = mango.Side.BUY, order_type: mango.OrderType = mango.OrderType.LIMIT) -> mango.Order: def fake_order(price: Decimal = Decimal(1), quantity: Decimal = Decimal(1), side: mango.Side = mango.Side.BUY, order_type: mango.OrderType = mango.OrderType.LIMIT) -> mango.Order:
return mango.Order.from_basic_info(side=side, price=price, quantity=quantity, order_type=order_type) return mango.Order.from_basic_info(side=side, price=price, quantity=quantity, order_type=order_type)
# serum ID structure - 16-byte 'int': low 8 bytes is a sequence number, high 8 bytes is price # serum ID structure - 16-byte 'int': low 8 bytes is a sequence number, high 8 bytes is price
def fake_order_id(index: int, price: int) -> int: def fake_order_id(index: int, price: int) -> int:
# price needs to be max of 64bit/8bytes, considering signed int is not permitted # price needs to be max of 64bit/8bytes, considering signed int is not permitted
if index > 2**64-1 or price > 2**64-1: if index > (2 ** 64) - 1 or price > (2 ** 64) - 1:
raise ValueError(f"Provided index '{index}' or price '{price}' is bigger than 8 bytes int") raise ValueError(f"Provided index '{index}' or price '{price}' is bigger than 8 bytes int")
index_bytes = index.to_bytes(8, byteorder='big', signed=False) index_bytes = index.to_bytes(8, byteorder='big', signed=False)
price_bytes = price.to_bytes(8, byteorder='big', signed=False) price_bytes = price.to_bytes(8, byteorder='big', signed=False)

View File

@ -1,12 +1,12 @@
import random import random
import typing
from mango.orders import Order
from .context import mango from .context import mango
from decimal import Decimal
from .fakes import fake_order_id from .fakes import fake_order_id
from typing import Sequence
from decimal import Decimal
def test_order_book_sides_sorted_by_price() -> None: def test_order_book_sides_sorted_by_price() -> None:
bids_side = _construct_order_book_side(mango.Side.BUY, 5) bids_side = _construct_order_book_side(mango.Side.BUY, 5)
@ -15,6 +15,7 @@ def test_order_book_sides_sorted_by_price() -> None:
assert sorted(bids_side, key=lambda o: o.price, reverse=True) == order_book.bids 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 assert sorted(asks_side, key=lambda o: o.price, reverse=False) == order_book.asks
def test_orderbook_top_bids_and_asks() -> None: def test_orderbook_top_bids_and_asks() -> None:
bids = _construct_order_book_side(mango.Side.BUY, 7) bids = _construct_order_book_side(mango.Side.BUY, 7)
asks = _construct_order_book_side(mango.Side.SELL, 7) asks = _construct_order_book_side(mango.Side.SELL, 7)
@ -45,37 +46,35 @@ def test_orderbook_spread() -> None:
orderBook = _construct_order_book(bids=bids, asks=asks) orderBook = _construct_order_book(bids=bids, asks=asks)
assert orderBook.spread == _get_order(asks).price - _get_order(bids, -1).price assert orderBook.spread == _get_order(asks).price - _get_order(bids, -1).price
# ASK is SELL, BID is BUY # ASK is SELL, BID is BUY
def _construct_order_book_side(askOrBidSide: mango.Side, size: int) -> Sequence[mango.Order]: def _construct_order_book_side(askOrBidSide: mango.Side, size: int) -> typing.Sequence[mango.Order]:
random_prices: list[(int,int)] = list(map( result_orders: typing.List[mango.Order] = []
lambda x, y: (x, y), for index, price in enumerate(random.sample(range(1, 1000), size)):
range (1, size+1),
random.sample(range(1, 1000), size)
))
result_orders: Sequence[mango.Order] = []
for index, price in random_prices:
constructed_id = fake_order_id(index, price) constructed_id = fake_order_id(index, price)
order = Order.from_ids( order = mango.Order.from_ids(
id=constructed_id, id=constructed_id,
client_id=0, client_id=0,
side=askOrBidSide, side=askOrBidSide,
price=price, price=Decimal(price),
quantity=random.randint(1, 100), quantity=Decimal(random.randint(1, 100)),
) )
result_orders.append(order) result_orders.append(order)
return result_orders return result_orders
def _construct_order_book( def _construct_order_book(
bids: Sequence[mango.Order], bids: typing.Sequence[mango.Order],
asks: Sequence[mango.Order] asks: typing.Sequence[mango.Order]
) -> mango.OrderBook: ) -> mango.OrderBook:
# construct orderbook # construct orderbook
return mango.OrderBook( return mango.OrderBook(
symbol='TEST', symbol='TEST',
lot_size_converter=None, lot_size_converter=mango.NullLotSizeConverter(),
bids=bids, bids=bids,
asks=asks asks=asks
) )
def _get_order(orders: Sequence[mango.Order], index: int = 0) -> Order:
def _get_order(orders: typing.Sequence[mango.Order], index: int = 0) -> mango.Order:
return sorted(orders, key=lambda order: order.price)[index] return sorted(orders, key=lambda order: order.price)[index]