Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #4
0
    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
Beispiel #5
0
    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
Beispiel #6
0
 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
Beispiel #7
0
    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
Beispiel #8
0
    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
Beispiel #9
0
    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
Beispiel #10
0
 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
Beispiel #11
0
 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
Beispiel #12
0
 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
Beispiel #14
0
 def _safe_symbol_lookup(symbol):
     try:
         return symbol_lookup(symbol)
     except SymbolNotFound:
         return None
Beispiel #15
0
 def _safe_symbol_lookup(symbol):
     try:
         return symbol_lookup(symbol)
     except SymbolNotFound:
         return None