2016-12-28 4 views
0

저는 10 초마다 포트폴리오 정보를 얻기 위해 ibpy를 사용합니다 (이 정보가 매우 자주 필요합니다), 특히 각 계약에 대해 실현되지 않은 PNL 정보가 필요합니다. 내가하는 방법은 다음과 같습니다.ibpy에서 포트폴리오 정보를 요청하는 중 "업데이트 중"이 없습니다

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 초마다) 수행하기 때문에. 포트폴리오 정보가 되돌려 보내지지 않고 보통 빈 포트폴리오로 이어지는 것 같습니다. 포트폴리오 정보를 업데이트하고 새로 고칠 수 있는지 확인하려면 어떻게해야합니까? (즉, 요청할 때마다 전체 포트폴리오 정보를 얻어야 함) 고맙습니다.

답변

0

계속 전화하지 마십시오. True은 필요에 따라 계속 업데이트를 보냅니다. 위치가 바뀌면 업데이트가 제공됩니다. 개인 정보 보호를 위해 계좌를 비워 뒀다 고 가정하고 있지만이를 지정해야합니다.

pnl이 지속적으로 필요한 경우 시장 데이터를 구독하고 계약 가격과 입장 가격을 기반으로 계산해야합니다. 너는 execDetails 메시지에 너의 입장료를받을 것이다;

귀하의 PNL에 대한 실시간 업데이트를 원한다고 가정합니다. 귀하의 답변은 여전히 ​​업데이트 포트폴리오 콜백을 사용하고있는 것 같습니다. 당신이 필요로하는 것은 당신 스스로 그것을 추적하는 것이고, 가격이 바뀔 때마다 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) 

이러한를 등록 손익을 볼 수있는 모든 가격 틱에 실행 가격 그리고

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 

을 저장

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가 동의하지 않으면 무엇이 잘못되었는지를 파악합니다. 보다 실시간으로 모니터링 할 수 있습니다.

+0

을 위치에서 내가 가지고, <위치 계정 0x11d93a4d0에서 = ME, 계약 = , POS = 1, avgCost = 130777.46>, 미래의 계약서, 어떻게하면 reqcontractdetails가 할 수없는 것처럼 보이는 계약의 현재 시장 가치를 요청/계산합니까? –

+0

'reqMktData (tickerId, contract, ", isSnapshot)'https : // www.interactivebrokers.com/en/software/api/apiguide/java/reqmktdata.htm. 데이터는'message.tickPrice'에 반환 될 것입니다. 선물을위한 배율도 필요합니다. – brian

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