2016-12-28 4 views
0

私はporfolio情報を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) 

のためにこれらを登録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 

を保存

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

を位置iから持って、<位置アカウント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 
関連する問題