2016-12-28 3 views
0

Я использую ibpy для получения информации о моем портфолио каждые 10 секунд (мне нужна эта информация очень часто), в частности нереализованная информация 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 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 не согласен, тогда вы выясните, что случилось. Это более реальный способ мониторинга.

+0

из положения я есть, <позиция счета = ME, контракт = , пос = 1, avgCost = 130777.46>, будущий контракт, как я могу запросить/вычислить текущую рыночную стоимость этого контракта, кажется, что reqcontractdetails не может этого сделать ... –

+0

use 'reqMktData (tickerId, contract," "is isnnnth)' 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