The following code, saved as ticker.py
, when run from the command line
prints a running ticker for the product ID supplied as an argument to the
script.
#!/usr/bin/env python3
import asyncio
from datetime import datetime
import sys
from copra.websocket import Channel, Client
class Tick:
def __init__(self, tick_dict):
self.product_id = tick_dict['product_id']
self.best_bid = float(tick_dict['best_bid'])
self.best_ask = float(tick_dict['best_ask'])
self.price = float(tick_dict['price'])
self.side = tick_dict['side']
self.size = float(tick_dict['last_size'])
self.time = datetime.strptime(tick_dict['time'], '%Y-%m-%dT%H:%M:%S.%fZ')
@property
def spread(self):
return self.best_ask - self.best_bid
def __repr__(self):
rep = "{}\t\t\t\t {}\n".format(self.product_id, self.time)
rep += "=============================================================\n"
rep += " Price: ${:.2f}\t Size: {:.8f}\t Side: {: >5}\n".format(self.price, self.size, self.side)
rep += "Best ask: ${:.2f}\tBest bid: ${:.2f}\tSpread: ${:.2f}\n".format(self.best_ask, self.best_bid, self.spread)
rep += "=============================================================\n"
return rep
class Ticker(Client):
def on_message(self, message):
if message['type'] == 'ticker' and 'time' in message:
tick = Tick(message)
print(tick, "\n\n")
product_id = sys.argv[1]
loop = asyncio.get_event_loop()
channel = Channel('ticker', product_id)
ticker = Ticker(loop, channel)
try:
loop.run_forever()
except KeyboardInterrupt:
loop.run_until_complete(ticker.close())
loop.close()
Streaming a ticker for LTC-USD:
$ ./ticker.py LTC-USD
LTC-USD 2018-07-12 21:40:38.501000
=============================================================
Price: $75.73 Size: 0.22134981 Side: buy
Best ask: $75.73 Best bid: $75.67 Spread: $0.06
=============================================================
LTC-USD 2018-07-12 21:40:38.501000
=============================================================
Price: $75.74 Size: 0.29362708 Side: buy
Best ask: $75.74 Best bid: $75.67 Spread: $0.07
=============================================================
LTC-USD 2018-07-12 21:40:41.202000
=============================================================
Price: $75.68 Size: 0.19211000 Side: sell
Best ask: $75.74 Best bid: $75.68 Spread: $0.06
=============================================================
LTC-USD 2018-07-12 21:41:09.452000
=============================================================
Price: $75.71 Size: 0.63097536 Side: buy
Best ask: $75.71 Best bid: $75.68 Spread: $0.03
=============================================================
^C
$