@@ -36,38 +36,39 @@ def on_open(self):
3636 def on_close (self ):
3737 print ("\n -- OrderBook Socket Closed! --" )
3838
39+ def reset_book (self ):
40+ self ._asks = RBTree ()
41+ self ._bids = RBTree ()
42+ res = self ._client .get_product_order_book (product_id = self .product_id , level = 3 )
43+ for bid in res ['bids' ]:
44+ self .add ({
45+ 'id' : bid [2 ],
46+ 'side' : 'buy' ,
47+ 'price' : Decimal (bid [0 ]),
48+ 'size' : Decimal (bid [1 ])
49+ })
50+ for ask in res ['asks' ]:
51+ self .add ({
52+ 'id' : ask [2 ],
53+ 'side' : 'sell' ,
54+ 'price' : Decimal (ask [0 ]),
55+ 'size' : Decimal (ask [1 ])
56+ })
57+ self ._sequence = res ['sequence' ]
58+
3959 def on_message (self , message ):
4060 if self ._log_to :
4161 pickle .dump (message , self ._log_to )
4262
4363 sequence = message ['sequence' ]
4464 if self ._sequence == - 1 :
45- self ._asks = RBTree ()
46- self ._bids = RBTree ()
47- res = self ._client .get_product_order_book (product_id = self .product_id , level = 3 )
48- for bid in res ['bids' ]:
49- self .add ({
50- 'id' : bid [2 ],
51- 'side' : 'buy' ,
52- 'price' : Decimal (bid [0 ]),
53- 'size' : Decimal (bid [1 ])
54- })
55- for ask in res ['asks' ]:
56- self .add ({
57- 'id' : ask [2 ],
58- 'side' : 'sell' ,
59- 'price' : Decimal (ask [0 ]),
60- 'size' : Decimal (ask [1 ])
61- })
62- self ._sequence = res ['sequence' ]
63-
65+ self .reset_book ()
66+ return
6467 if sequence <= self ._sequence :
6568 # ignore older messages (e.g. before order book initialization from getProductOrderBook)
6669 return
6770 elif sequence > self ._sequence + 1 :
68- print ('Error: messages missing ({} - {}). Re-initializing websocket.' .format (sequence , self ._sequence ))
69- self .close ()
70- self .start ()
71+ self .on_sequence_gap (self ._sequence , sequence )
7172 return
7273
7374 msg_type = message ['type' ]
@@ -83,18 +84,11 @@ def on_message(self, message):
8384
8485 self ._sequence = sequence
8586
86- # bid = self.get_bid()
87- # bids = self.get_bids(bid)
88- # bid_depth = sum([b['size'] for b in bids])
89- # ask = self.get_ask()
90- # asks = self.get_asks(ask)
91- # ask_depth = sum([a['size'] for a in asks])
92- # print('bid: %f @ %f - ask: %f @ %f' % (bid_depth, bid, ask_depth, ask))
87+ def on_sequence_gap (self , gap_start , gap_end ):
88+ self .reset_book ()
89+ print ('Error: messages missing ({} - {}). Re-initializing book at sequence.' .format (
90+ gap_start , gap_end , self ._sequence ))
9391
94- def on_error (self , e ):
95- self ._sequence = - 1
96- self .close ()
97- self .start ()
9892
9993 def add (self , order ):
10094 order = {
@@ -250,6 +244,7 @@ def set_bids(self, price, bids):
250244
251245
252246if __name__ == '__main__' :
247+ import sys
253248 import time
254249 import datetime as dt
255250
@@ -286,10 +281,18 @@ def on_message(self, message):
286281 self ._ask = ask
287282 self ._bid_depth = bid_depth
288283 self ._ask_depth = ask_depth
289- print ('{}\t bid : {:.3f} @ {:.2f}\t ask: {:.3f} @ {:.2f}' .format (dt . datetime . now (), bid_depth , bid ,
290- ask_depth , ask ))
284+ print ('{} {} bid : {:.3f} @ {:.2f}\t ask: {:.3f} @ {:.2f}' .format (
285+ dt . datetime . now (), self . product_id , bid_depth , bid , ask_depth , ask ))
291286
292287 order_book = OrderBookConsole ()
293288 order_book .start ()
294- time .sleep (10 )
295- order_book .close ()
289+ try :
290+ while True :
291+ time .sleep (10 )
292+ except KeyboardInterrupt :
293+ order_book .close ()
294+
295+ if order_book .error :
296+ sys .exit (1 )
297+ else :
298+ sys .exit (0 )
0 commit comments