mirror of
https://github.com/aljazceru/bitfinex-api-py.git
synced 2025-12-19 23:04:21 +01:00
91 lines
2.2 KiB
Python
91 lines
2.2 KiB
Python
import zlib
|
|
|
|
def preparePrice(price):
|
|
# convert to 4 significant figures
|
|
prepPrice = '{0:.4f}'.format(price)
|
|
# remove decimal place if zero float
|
|
return '{0:g}'.format(float(prepPrice))
|
|
|
|
class OrderBook:
|
|
|
|
def __init__(self):
|
|
self.asks = []
|
|
self.bids = []
|
|
|
|
def get_bids(self):
|
|
return self.bids
|
|
|
|
def get_asks(self):
|
|
return self.asks
|
|
|
|
def updateFromSnapshot(self, data):
|
|
# [[4642.3, 1, 4.192], [4641.5, 1, 1]]
|
|
for order in data:
|
|
if len(order) is 4:
|
|
if order[3] < 0:
|
|
self.bids += [order]
|
|
else:
|
|
self.asks += [order]
|
|
else:
|
|
if order[2] < 0:
|
|
self.asks += [order]
|
|
else:
|
|
self.bids += [order]
|
|
|
|
def updateWith(self, order):
|
|
if len(order) is 4:
|
|
amount = order[3]
|
|
count = order[2]
|
|
side = self.bids if amount < 0 else self.asks
|
|
else:
|
|
amount = order[2]
|
|
side = self.asks if amount < 0 else self.bids
|
|
count = order[1]
|
|
price = order[0]
|
|
|
|
# if first item in ordebook
|
|
if len(side) is 0:
|
|
side += [order]
|
|
return
|
|
|
|
# match price level
|
|
for index, sOrder in enumerate(side):
|
|
sPrice = sOrder[0]
|
|
if sPrice == price:
|
|
if count is 0:
|
|
del side[index]
|
|
return
|
|
else:
|
|
# remove but add as new below
|
|
del side[index]
|
|
|
|
# if ob is initialised w/o all price levels
|
|
if count is 0:
|
|
return
|
|
|
|
# add to book and sort lowest to highest
|
|
side += [order]
|
|
side.sort(key=lambda x: x[0], reverse=not amount < 0)
|
|
return
|
|
|
|
def checksum(self):
|
|
data = []
|
|
# take set of top 25 bids/asks
|
|
for index in range(0, 25):
|
|
if index < len(self.bids):
|
|
bid = self.bids[index]
|
|
price = bid[0]
|
|
amount = bid[3] if len(bid) is 4 else bid[2]
|
|
data += [preparePrice(price)]
|
|
data += [str(amount)]
|
|
if index < len(self.asks):
|
|
ask = self.asks[index]
|
|
price = ask[0]
|
|
amount = ask[3] if len(ask) is 4 else ask[2]
|
|
data += [preparePrice(price)]
|
|
data += [str(amount)]
|
|
checksumStr = ':'.join(data)
|
|
# calculate checksum and force signed integer
|
|
checksum = zlib.crc32(checksumStr.encode('utf8')) & 0xffffffff
|
|
return checksum
|