def run(self, md_update, place_orders, order_first=False): self._synchronize_market_data(md_update) poller = zmq.Poller() md_socket = self.md_socket poller.register(md_socket, zmq.POLLIN) print 'ORDER SOCKETS:', self.order_sockets print 'ORDER SOCKET VALUES: ', self.order_sockets.values() for order_socket in self.order_sockets.values(): poller.register(order_socket, zmq.POLLIN) while True: if order_first == True: place_orders() ready_sockets = poller.poll() for (socket, state) in ready_sockets: # ignore errors for now if state == zmq.POLLERR: print 'POLLERR on socket', socket, 'md socket = ', \ self.md_socket, 'order sockets = ', \ self.order_sockets elif state == zmq.POLLIN: if socket == md_socket: msg = md_socket.recv() bbo = spot_fx_md_1_pb2.instrument_bbo() msg = md_socket.recv() bbo.ParseFromString(msg) md_update(bbo) else: [tag, msg] = socket.recv_multipart() tag = int_from_bytes(tag) self.order_manager.received_message_from_order_engine(tag, msg) place_orders()
def _synchronize_market_data(self, md_update, wait_time=0.5): """For a short period only receive market data without taking any actions. Every time a new piece of market data arrives, parse it and call 'md_update' with the parsed struct """ logging.debug('Synchronizing market data') poller = zmq.Poller() poller.register(self.md_socket, zmq.POLLIN) start_time = time.time() while time.time() < start_time + wait_time: ready_sockets = dict(poller.poll(1000)) if ready_sockets.get(self.md_socket) == zmq.POLLIN: bbo = spot_fx_md_1_pb2.instrument_bbo() msg = self.md_socket.recv() bbo.ParseFromString(msg) md_update(bbo) print 'Waited', wait_time, 'seconds, entering main loop'