请求关于ibpy的投资组合信息而不是“更新它”

时间:2016-12-28 22:14:02

标签: ibpy

我使用ibpy每10秒获取一次我的个人信息(我非常需要这些信息),特别是每个合同的未实现的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秒钟)。似乎投资组合信息不会被发回,而且通常会导致投资组合空白。我如何确保我可以请求和刷新投资组合信息而不是更新(意味着每次我要求我都应该获得完整的投资组合信息)?谢谢。

2 个答案:

答案 0 :(得分:0)

你没有继续打电话。 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不同意,那你就弄明白了什么是错的。这是一种更实时的监控方式。

答案 1 :(得分:0)

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

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