IBPy:从reqMktData获取陈旧的数据?

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