【问题标题】:requesting portfolio information on ibpy not "updating it"请求有关 ibpy 的投资组合信息而不是“更新它”
【发布时间】:2016-12-28 22:14:01
【问题描述】:

我每 10 秒使用 ibpy 获取我的投资组合信息(我经常需要此信息),特别是每份合约的未实现 pnl 信息。我的做法是:

def updatePortfolio(self):
    self._portfolio=[]
    if self._updated_accounts==False:
        print("requesting account updates")
        self._tws.reqAccountUpdates(True,'')
        sleep(3)
        print("requesting account value updates")
        self._tws.updateAccountValue()
        sleep(3)
        print("requesting portfolio updates")
        self._tws.updatePortfolio()
        sleep(3)

但是,因为我经常这样做(每 10 秒一次)。似乎投资组合信息没有被发回,它通常会导致空投资组合。我如何确保我可以请求和刷新投资组合信息而不是更新(这意味着我每次请求时都应该获得完整的投资组合信息)?谢谢。

【问题讨论】:

    标签: ibpy


    【解决方案1】:

    你不要一直叫它。 True 表示根据需要继续发送更新。当职位发生变化时,您将获得更新。我假设您出于隐私考虑将帐户留空,但您需要指定它。

    如果您持续需要 pnl,您应该订阅市场数据并根据合约价格和您的入场价格进行计算。您将在execDetails 消息中收到您的入场价格;

    我假设您想要实时更新您的 pnl。您的回答似乎仍在使用更新投资组合回调。您需要自己跟踪它,然后在价格变化时您可以看到 pnl。

    先保存执行价格

    def execDetails(msg):
        global posn_val
        print('My entry price',msg.execution.m_price)
        #keep track of what your buying, I just did -1 ES
        posn_val = msg.execution.m_avgPrice * msg.execution.m_cumQty * 50
    

    然后在每个价格变动上您都可以看到 pnl

    def price(msg):
        global posn_val, prof #you'll need these accesible
        prof = msg.price * 1 * 50 - posn_val #assuming 1 ES with mult = 50
    

    注册这些消息

    tws = Connection.create(port = 7497, clientId=123)
    tws.register(execDetails, message.execDetails)
    tws.register(price, message.tickPrice)
    

    请求数据

    es = Contract()
    es.m_secType = "FUT" 
    es.m_symbol = "ES"
    es.m_expiry = "201703"
    es.m_currency = "USD"
    es.m_exchange = "GLOBEX"
    tws.reqMktData(1,es,"",False)
    

    这不是一个完整的程序,只是一个关于如何完成的想法。我认识的大多数人都不会使用帐户信息,除非作为检查以确保没有出错。您应该跟踪您的头寸,如果 IB 不同意,那么您会找出问题所在。这是一种更实时的监控方式。

    【讨论】:

    • 从我的头寸,, pos=1, avgCost=130777.46>,未来的合约,我该怎么做请求/计算该合约的当前市场价值 reqcontractdetails 似乎无法做到......
    • 使用 reqMktData(tickerId, contract, "", isSnapshot) interactivebrokers.com/en/software/api/apiguide/java/… 。数据将在 message.tickPrice 中返回。您还需要期货的乘数。
    【解决方案2】:

    我已经做了类似的事情来解决它:

    IB_FUTURE_INFO_TABLE = {
        'AUD': [100000],
        'GBP': [62500],
        'CAD': [100000],
        'CHF': [125000],
        'EUR': [125000],
        'JPY': [12500000],
        'NZD': [100000]
    }
    
    
    def request_unrlzd_pnl_report(self):
        self.request_positions()
        unrlzd_pnl_report=[]
        for position_msg in self._positions:
            position_contract_now = position_msg.contract
            symbol=position_contract_now.m_symbol
            if symbol in settings.IB_FUTURE_INFO_TABLE.keys():
                position_pos_now = position_msg.pos
                position_avgCost = position_msg.avgCost
                self.printContract(position_contract_now)
                self.requestData(position_contract_now)
                total_initial_market_value = position_avgCost * (position_pos_now)
                if position_pos_now>0:
                   total_final_market_value = self._bid_price * position_pos_now * settings.IB_FUTURE_INFO_TABLE[symbol][0]
                elif position_pos_now<0:
                   total_final_market_value = self._ask_price * position_pos_now * settings.IB_FUTURE_INFO_TABLE[symbol][0]
    
                # total_final_market_value = self._mid_price * position_pos_now * settings.IB_FUTURE_INFO_TABLE[symbol][0]
                total_unrlzd_pnl = total_final_market_value - total_initial_market_value
                total_unrlzd_pnl_ratio = total_unrlzd_pnl / abs(total_initial_market_value)
                unrlzd_pnl_report.append((symbol,position_contract_now,position_pos_now,position_avgCost,total_unrlzd_pnl,total_unrlzd_pnl_ratio))
        # print(unrlzd_pnl_report)
        return  unrlzd_pnl_report
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 2012-12-28
      • 2011-11-16
      • 2023-02-04
      • 2022-12-30
      • 2020-09-29
      相关资源
      最近更新 更多