1

こんにちは、以下のコードを試して、IBPy に証券リストの最終価格を教えてもらい、これらの価格を csv に保存しました。

from ib.opt import Connection
from ib.ext.Contract import Contract
import time
import csv

Equity = Contract()
Equity.m_secType = 'Stk'
Equity.m_exchange = 'Smart'
Equity.m_currency = 'USD'

EquityList = ['XOM', 'JNJ', 'BRK B', 'JPM','GE','T','WFC','BAC','PG','CVX','VZ','PFE','MRK','HD','C','KO','DIS','V','UNH','PEP','PM','IBM','MO','SLB','ORCL','MMM','MDT','MA','WMT','MCD','ABBV','BMY','BA','HON','CVS','SPY']
PriceList = []
PriceData = csv.writer(open('price.csv','wb'))

def savepx(msg):
   global px
   if msg.field == 4:
     px = msg.price

def main():
   conn = Connection.create(port=7496,clientId=100)
   conn.connect()
   count = 0

   for ticker in EquityList:
      Equity.m_symbol = ticker
      conn.register(savepx,'TickPrice')
      conn.reqMktData(count,Equity,225,False)
      time.sleep(.15)
      conn.cancelMktData(count)
      PriceList.insert(count,px)
      count = count + 1

conn.disconnect()
PriceData.writerow(EquityList)
PriceData.writerow(PriceList)

このコードを使用すると、提供した株式のリストのデータを取得し始めますが、最終的には 1 つのティッカーに引っ掛かり、次のいくつかのティッカーの価格を繰り返します。これはリスト全体で散発的に発生しますが、たとえば、1 回の実行で SLB の価格が 80.63 (正しい) になり、リスト内の残りの株式について 80.63 の価格が単純に繰り返され、変数 px が新しい値に更新されませんでした。新しいティッカー用。これを実行するたびに、ティッカーの正しいデータが取得され、その後のいくつかのティッカーが同じ値を持つリストのどこかで常に発生するようです。これを修正する方法、または株式のリストでこの問題を回避する IB からリアルタイム データを取得する別の方法についてのアイデアはありますか?

4

1 に答える 1

0

データが要求されたのと同じ順序で 0.15 秒以内に到着することを前提としています。コールバックに tickerId があり、メッセージがどのセキュリティ用であるかを教えてくれます。

def savepx(msg):
   #global px don't use this
   if msg.field == 4:
     PriceList.insert(msg.tickerId,msg.price)

XOM は count = 0 で要求されているため、メッセージが到着すると tickerId = 0 になることに注意してください。この場合、インデックスにも使用しています。

ループから一部のコードを削除できます

for ticker in EquityList:
      Equity.m_symbol = ticker
      conn.register(savepx,'TickPrice')# move this out of loop, just do it once
      conn.reqMktData(count,Equity,225,True)#true snapshot
      #time.sleep(.15) #not needed unless over 50 messages per second
      #conn.cancelMktData(count) don't do this, use snapshot 
      #PriceList.insert(count,px) do in callback
      count = count + 1

次に、すべてのデータが受信されるか、タイムアウトが設定されるまで切断しないでください。

より完全な例については、こちらを ご覧ください https://stackoverflow.com/a/30157553/2855515

于 2017-02-20T17:53:32.170 に答える