class PortfolioHandler(object): def __init__(self, events_queue, cash, quote_data, order_sizer, risk_manager): self.events_queue = events_queue self.cash = cash self.quote_data = quote_data self.order_sizer = order_sizer self.risk_manager = risk_manager self.portfolio = Portfolio(quote_data, cash) def update_signal(self): pass def generate_simple_order(self, signal): order = None symbol = signal.symbol direction = signal.signal_type strength = signal.strength # mkt_quantity = floor(100 * strength) # cur_quantity = self.current_positions[symbol] # order_type = 'MKT' # if direction == 'LONG' and cur_quantity == 0: # order = Order(symbol, order_type, mkt_quantity, 'BUY') # if direction == 'SHORT' and cur_quantity == 0: # order = Order(symbol, order_type, mkt_quantity, 'SELL') # if direction == 'EXIT' and cur_quantity > 0: # order = Order(symbol, order_type, abs(cur_quantity), 'SELL') # if direction == 'EXIT' and cur_quantity < 0: # order = Order(symbol, order_type, abs(cur_quantity), 'BUY') return order def _prelim_order_from_signal(self, signal_event): return PrelimOrder(signal_event.instrument, signal_event.side, signal_event.order) def _put_orders_on_queue(self, order_events): for order in order_events: # order.time_stamp = dt.datetime.utcnow() self.events_queue.put(order) def handle_signal(self, signal_event): prelim_order = self._prelim_order_from_signal(signal_event) prelim_order_sized = self.order_sizer.size_order(prelim_order) order_events = self.risk_manager.check_orders(self.portfolio, prelim_order_sized) self._put_orders_on_queue(order_events) def handle_fill(self, fill_event): self.update_portfolio(fill_event) def update_portfolio(self, fill_event): side = fill_event.side instrument = fill_event.instrument size = fill_event.size price = fill_event.price commission = fill_event.commission # Create or modify the position from the fill info self.portfolio.transact_position(side, instrument, size, price, commission) def update_portfolio_value(self): self.portfolio._update_portfolio()