IBPy:从reqMktData获取陈旧的数据?
问题描述:
您好我曾尝试下面的代码来获得IBPy给我的最后价格证券的名单,然后这些价格保存为CSVIBPy:从reqMktData获取陈旧的数据?
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获取实时数据的不同方法,以避免此问题出现在股票列表中?
答
你要指望数据将在0.15秒内到达,并且按照要求的顺序进行。你在回调中有一个tickerId,它会告诉你msg的安全性。
def savepx(msg):
#global px don't use this
if msg.field == 4:
PriceList.insert(msg.tickerId,msg.price)
XOM通知就要求用数= 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://*.com/a/30157553/2855515