在 ibpy 上请求投资组合信息而不是 "updating it"
requesting portfolio information on ibpy not "updating it"
我正在使用 ibpy 每 10 秒获取一次我的投资组合信息(我非常频繁地需要此信息),特别是每份合约的未实现盈亏信息。我这样做的方式是:
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 秒一次)。投资组合信息似乎没有发回,通常会导致投资组合为空。我如何确保我可以请求和刷新投资组合信息而不是它的更新(意味着我应该在每次请求时获得完整的投资组合信息)?谢谢。
你别一直叫它。 True
表示根据需要不断发送更新。当职位发生变化时,您会收到更新。我假设您出于隐私原因将帐户留空,但您需要指定它。
如果您持续需要盈亏,您应该订阅市场数据并根据合约价格和您的入场价格进行计算。您将在 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 不同意,那么你要找出问题所在。这是一种更实时的监控方式。
我已经做了类似的事情来解决它:
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
我正在使用 ibpy 每 10 秒获取一次我的投资组合信息(我非常频繁地需要此信息),特别是每份合约的未实现盈亏信息。我这样做的方式是:
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 秒一次)。投资组合信息似乎没有发回,通常会导致投资组合为空。我如何确保我可以请求和刷新投资组合信息而不是它的更新(意味着我应该在每次请求时获得完整的投资组合信息)?谢谢。
你别一直叫它。 True
表示根据需要不断发送更新。当职位发生变化时,您会收到更新。我假设您出于隐私原因将帐户留空,但您需要指定它。
如果您持续需要盈亏,您应该订阅市场数据并根据合约价格和您的入场价格进行计算。您将在 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 不同意,那么你要找出问题所在。这是一种更实时的监控方式。
我已经做了类似的事情来解决它:
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