2017-02-17 4 views
1

私は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) 

にこれらの価格を保存し、私はこのコードを使用する場合、それはリストのためのデータを取得開始します私が提供した株式は、最終的に次のいくつかのティッカーのために価格を繰り返す単一のティッカーで捕らえられます。これはリスト全体で散発的に起こりますが、たとえば1回の実行で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はMSGが到着したときに、それはあなたにも、インデックスのためにそれを使用している。この場合、tickerId = 0を、持っているだろう、カウント= 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

関連する問題