def _fill(self, order, price): '''Fill the order at this price and delete the order from the pending list.''' del self._orders[order.id] pos = self._positions.pop(order.asset, None) if pos is None: pos = zp.Position(order.asset) pos.amount = 0 pos.cost_basis = 0 new_amount = pos.amount + order.amount if new_amount < 0: log.warn('not enough shares') return volume = price * order.amount self._portfolio.cash -= volume self._account.cash = self._portfolio.cash self._account.buying_power -= volume if new_amount == 0: return new_volume = price * order.amount + pos.cost_basis * pos.amount pos.cost_basis = new_volume / new_amount pos.amount = new_amount pos.last_sale_date = self.now self._positions[order.asset] = pos
def positions(self): ''' pos = self._api.list_positions() return pos ''' 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 = int(pos.qty) z_position.cost_basis = float(pos.cost_basis) / float(pos.qty) z_position.last_sale_price = None z_position.last_sale_date = None z_positions[symbol_lookup(symbol)] = z_position z_position.last_sale_price = np.nan z_position.last_sale_date = pd.NaT symbols.append(symbol) position_map[symbol] = z_position return z_positions
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 = int(pos.qty) z_position.cost_basis = float(pos.cost_basis) / float(pos.qty) 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 trades = self._symbol_trades(symbols) for symbol, trade in trades.items(): z_position = position_map[symbol] if trade is None: z_position.last_sale_price = np.nan z_position.last_sale_date = pd.NaT else: z_position.last_sale_price = float(trade.price) z_position.last_sale_date = trade.timestamp return z_positions
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 = int(pos.qty) z_position.cost_basis = float(pos.cost_basis) / float(pos.qty) 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 set_position(self, symbol, amount, cost_basis, last_sale_price=None, last_sale_date=None): asset = api.symbol(symbol) if isinstance(symbol, str) else symbol pos = zp.Position(asset) pos.amount = amount pos.cost_basis = cost_basis pos.last_sale_price = last_sale_price pos.last_sale_date = last_sale_date self._positions[asset] = pos