jupyter/orderbook.py (43 lines of code) (raw):
from sortedcollections import SortedDict
from typing import Iterable, List
def add_key(t: tuple):
t[1]['key'] = t[1]['symbol'] + t[1]['side'] + str(t[0])
return t[1]
def to_dict(symbol, msg):
d = {}
d['symbol'] = symbol
d['price'] = msg.price
d['size'] = msg.size
d['numberOfOrders'] = msg.numberOfOrders
d['side'] = msg.side
d['_level'] = msg.level
d['key'] = None
return d
class Book:
def __init__(self, symbol: str):
self.asks = SortedDict()
self.bids = SortedDict()
def update(self, *entries: Iterable[dict]) -> None:
for entry in entries:
if entry['side'] == 'BID':
self.bids[entry['price']] = entry
else:
self.asks[entry['price']] = entry
def remove(self, side: str, price: float) -> None:
if side == 'BID':
self.bids.pop(price, None)
else:
self.asks.pop(price, None)
def get_bids(self, size=-1) -> List[dict]:
if size == -1 or size >= len(self.bids):
return list(map(add_key, enumerate(reversed(self.bids.values()))))
result = list(self.bids.values())[len(self.bids) - size:]
result.reverse()
return list(map(add_key, enumerate(result)))
def get_asks(self, size=-1) -> List[dict]:
if size == -1 or size >= len(self.asks):
return list(map(add_key, enumerate(self.asks.values())))
return list(map(add_key, enumerate(self.asks.values()[:size])))
def clear(self) -> None:
self.asks.clear()
self.bids.clear()