def positions(self): z_positions = zp.Positions() positions = self._api.list_positions() position_map = {} symbols = [] for pos in positions: symbol = pos.symbol try: z_position = zp.Position(symbol_lookup(symbol)) except SymbolNotFound: continue z_position.amount = pos.qty z_position.cost_basis = float(pos.cost_basis) z_position.last_sale_price = None z_position.last_sale_date = None z_positions[symbol_lookup(symbol)] = z_position symbols.append(symbol) position_map[symbol] = z_position quotes = self._api.list_quotes(symbols) for quote in quotes: price = quote.last dt = quote.last_timestamp z_position = position_map[quote.symbol] z_position.last_sale_price = float(price) z_position.last_sale_date = dt return z_positions
def positions(self): z_positions = zp.Positions() positions = self.api_client.Position.Position_get().result()[0][0] position_map = {} symbols = [] for pos in positions: symbol = pos['symbol'] try: z_position = zp.Position(symbol_lookup(symbol)) except SymbolNotFound: continue z_position.amount = pos['currentQty'] z_position.cost_basis = float(pos['currentCost']) z_position.last_sale_price = None z_position.last_sale_date = None z_positions[symbol_lookup(symbol)] = z_position symbols.append(symbol) position_map[symbol] = z_position quotes = self.ws_client.recent_trades() for quote in quotes: if quote['symbol'] != 'XBTUSD': continue price = quote['price'] dt = quote['timestamp'] z_position = position_map[quote['symbol']] z_position.last_sale_price = float(price) z_position.last_sale_date = dt return z_positions
def positions(self): curr_pos = self.get_latest_positions() z_positions = zp.Positions() # TODO: check/test this for loop for index, symbol in curr_pos['holding_name'].iteritems(): vb_position = curr_pos[curr_pos['holding_name'] == symbol] try: z_position = zp.Position(symbol_lookup(symbol)) except SymbolNotFound: # The symbol might not have been ingested to the db therefore # it needs to be skipped. continue # Amount = quantity z_position.amount = int(vb_position.quantity) z_position.cost_basis = float(vb_position.buy_price) # Check if symbol exists in bars df if symbol in self._tws.bars: z_position.last_sale_price = \ float(self._tws.bars[symbol].last_trade_price.iloc[-1]) z_position.last_sale_date = \ self._tws.bars[symbol].index.values[-1] else: z_position.last_sale_price = None z_position.last_sale_date = None z_positions[symbol_lookup(symbol)] = z_position return z_positions
def positions(self): z_positions = zp.Positions() for symbol in self._tws.positions: ib_position = self._tws.positions[symbol] try: z_position = zp.Position(symbol_lookup(symbol)) except SymbolNotFound: log.warn("Symbol {} not found in the data base.", symbol) continue z_position.amount = int(ib_position.position) z_position.cost_basis = float(ib_position.market_price) z_position.last_sale_price = None # TODO(tibor): Fill from state z_position.last_sale_date = None # TODO(tibor): Fill from state z_positions[symbol_lookup(symbol)] = z_position return z_positions
def positions(self): z_positions = zp.Positions() for symbol in self._tws.positions: ib_position = self._tws.positions[symbol] try: z_position = zp.Position(symbol_lookup(symbol)) except SymbolNotFound: # The symbol might not have been ingested to the db therefore # it needs to be skipped. continue z_position.amount = int(ib_position.position) z_position.cost_basis = float(ib_position.market_price) z_position.last_sale_price = None # TODO(tibor): Fill from state z_position.last_sale_date = None # TODO(tibor): Fill from state z_positions[symbol_lookup(symbol)] = z_position return z_positions
def transactions(self): orders = self._api.list_orders(status='closed') results = {} for order in orders: if order.filled_at is None: continue tx = Transaction(asset=symbol_lookup(order.symbol), amount=int(order.filled_qty), dt=order.filled_at, price=float(order.filled_avg_price), order_id=order.client_order_id) results[order.client_order_id] = tx return results
def _get_positions_from_broker(self): """ get the positions from the broker and update zipline objects ( the ledger ) should be used once at startup and once every time we want to refresh the positions array """ cur_pos_in_tracker = self.metrics_tracker.positions positions = self._api.list_positions() for ap_position in positions: # ap_position = positions[symbol] try: z_position = zp.Position( zp.InnerPosition(symbol_lookup(ap_position.symbol))) editable_position = zp.MutableView(z_position) except SymbolNotFound: # The symbol might not have been ingested to the db therefore # it needs to be skipped. log.warning( 'Wanted to subscribe to %s, but this asset is probably not ingested' % ap_position.symbol) continue if int(ap_position.qty) == 0: continue editable_position._underlying_position.amount = int( ap_position.qty) editable_position._underlying_position.cost_basis = float( ap_position.avg_entry_price) editable_position._underlying_position.last_sale_price = float( ap_position.current_price) editable_position._underlying_position.last_sale_date = self._api.get_last_trade( ap_position.symbol).timestamp self.metrics_tracker.update_position( z_position.asset, amount=z_position.amount, last_sale_price=z_position.last_sale_price, last_sale_date=z_position.last_sale_date, cost_basis=z_position.cost_basis) # now let's sync the positions in the internal zipline objects position_names = [p.symbol for p in positions] assets_to_update = [ ] # separate list to not change list while iterating for asset in cur_pos_in_tracker: if asset.symbol not in position_names: assets_to_update.append(asset) for asset in assets_to_update: # deleting object from the metrics_tracker as its not in the portfolio self.metrics_tracker.update_position(asset, amount=0) # for some reason, the metrics tracker has self.positions AND self.portfolio.positions. let's make sure # these objects are consistent self.metrics_tracker._ledger._portfolio.positions = self.metrics_tracker.positions
def positions(self): z_positions = zp.Positions() for symbol in self._tws.positions: ib_position = self._tws.positions[symbol] try: z_position = zp.Position(symbol_lookup(symbol)) except SymbolNotFound: # The symbol might not have been ingested to the db therefore # it needs to be skipped. continue z_position.amount = int(ib_position.position) z_position.cost_basis = float(ib_position.average_cost) # Check if symbol exists in bars df if symbol in self._tws.bars: z_position.last_sale_price = \ float(self._tws.bars[symbol].last_trade_price.iloc[-1]) z_position.last_sale_date = \ self._tws.bars[symbol].index.values[-1] else: z_position.last_sale_price = None z_position.last_sale_date = None z_positions[symbol_lookup(symbol)] = z_position return z_positions
def _get_positions_from_broker(self): """ get the positions from the broker and update zipline objects ( the ledger ) should be used once at startup and once every time we want to refresh the positions array """ cur_pos_in_tracker = self.metrics_tracker.positions for symbol in self._tws.positions: ib_position = self._tws.positions[symbol] try: z_position = zp.Position( zp.InnerPosition(symbol_lookup(symbol))) editable_position = MutableView(z_position) except SymbolNotFound: # The symbol might not have been ingested to the db therefore # it needs to be skipped. log.warning( 'Wanted to subscribe to %s, but this asset is probably not ingested' % symbol) continue editable_position._underlying_position.amount = int( ib_position.position) editable_position._underlying_position.cost_basis = float( ib_position.average_cost) # Check if symbol exists in bars df if symbol in self._tws.bars: editable_position._underlying_position.last_sale_price = \ float(self._tws.bars[symbol].last_trade_price.iloc[-1]) editable_position._underlying_position.last_sale_date = \ self._tws.bars[symbol].index.values[-1] else: # editable_position._underlying_position.last_sale_price = None # this cannot be set to None. only numbers. editable_position._underlying_position.last_sale_date = None self.metrics_tracker.update_position( z_position.asset, amount=z_position.amount, last_sale_price=z_position.last_sale_price, last_sale_date=z_position.last_sale_date, cost_basis=z_position.cost_basis) for asset in cur_pos_in_tracker: if asset.symbol not in self._tws.positions: # deleting object from the metrcs_tracker as its not in the portfolio self.metrics_tracker.update_position(asset, amount=0) # for some reason, the metrics tracker has self.positions AND self.portfolio.positions. let's make sure # these objects are consistent # (self.portfolio.positions is self.metrics_tracker._ledger._portfolio.positions) # (self.metrics_tracker.positions is self.metrics_tracker._ledger.position_tracker.positions) self.metrics_tracker._ledger._portfolio.positions = self.metrics_tracker.positions
def transactions(self): # todo : make it work orders = self.api_client.Order.Order_get('closed') results = {} for order in orders: if order.filled_at is None: continue tx = Transaction( asset=symbol_lookup(order.symbol), amount=int(order.filled_qty), dt=order.filled_at, price=float(order.filled_avg_price), order_id=order.client_order_id, commission=0.0, ) results[order.client_order_id] = tx return results
def _order2zp(self, order): zp_order = ZPOrder( id=order.client_order_id, asset=symbol_lookup(order.symbol), amount=int(order.qty) if order.side == 'buy' else -int(order.qty), stop=float(order.stop_price) if order.stop_price else None, limit=float(order.limit_price) if order.limit_price else None, dt=order.submitted_at, commission=0, ) zp_order.status = ZP_ORDER_STATUS.OPEN if order.canceled_at: zp_order.status = ZP_ORDER_STATUS.CANCELLED if order.failed_at: zp_order.status = ZP_ORDER_STATUS.REJECTED if order.filled_at: zp_order.status = ZP_ORDER_STATUS.FILLED zp_order.filled = int(order.filled_qty) return zp_order
def _safe_symbol_lookup(ib_symbol): try: symbol = ib_symbol.replace(' ', '.') return symbol_lookup(symbol) except SymbolNotFound: return None
def _safe_symbol_lookup(symbol): try: return symbol_lookup(symbol) except SymbolNotFound: return None