IBPy:从reqMktData获取陈旧数据?

时间:2017-02-17 20:08:32

标签: python ibpy

您好我已经尝试过以下代码让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)

当我使用这个代码时,它开始获取我提供的股票列表的数据,但最终会被单个股票代码抓住,它会重复下几个代码的价格。这种情况偶尔发生在整个清单中,但是例如在一次运行中它将SLB的价格定为80.63(正确),然后简单地重复80.63的价格,对于列表中的其余股票,某种方式不会将变量px更新为新值对于新的代码。每次我运行这个似乎总是发生在列表中的某个地方,其中为自动收报机提取正确的数据,然后几个后续的代码具有相同的值。关于如何解决这个问题的想法或从IB中提取实时数据的不同方法可以避免股票清单出现这个问题?

1 个答案:

答案 0 :(得分:0)

您依靠的假设是数据将在.15秒内到达,并按照要求的顺序到达。你在回调中有一个tickerId,它会告诉你msg的安全性。

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

注意XOM是在count = 0的情况下请求的,所以当msg到达时它会有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