2015-10-31 19 views
0

我對Interactive Brokers API的理解具有異步性質,如果在連接後調用reqMktData(),則會在其他方法中調用tickPrice(),發送參數tickPrice(),然後tickPrice()將它自己的結果傳遞給消息對象。要閱讀傳入的消息對象,我需要從EWrapper實現消息處理程序。IB/IbPy-瞭解如何從API響應中訪問和存儲變量

我試圖提取消息對象內的價格變量,但我一直沒有提取tickPrice()價格字段或提取消息對象內部的價格,無論是直接調用tickPrice()還是從諸如消息。價錢。

這是我的代碼:

from ib.opt import ibConnection, Connection, message 
import time 
import ib_data_types as datatype 
from ib.ext.Contract import Contract 


#price_field = '' 

def reply_handler(msg): 
print("Reply:", msg) 

#def my_callback_handler(msg): 
#if msg.field == 4: 
    #price_field = msg.price 

def request_streaming_data(ib_conn): 
    # Stream market data 
    ib_conn.reqMktData(1, 
        contract, 
        datatype.GENERIC_TICKS_NONE, 
        datatype.SNAPSHOT_NONE) 
    time.sleep(1) 


if __name__ == "__main__": 
tws_conn = ibConnection(host='localhost', port=7497, clientId=100) 
tws_conn.connect() 

tws_conn.registerAll(reply_handler) 
#tws_conn.register(my_callback_handler, "TickPrice") 

contract = Contract() 
contract.m_symbol = 'GE' 
contract.m_exchange = 'SMART' 
contract.m_currency = 'USD' 
contract.m_secType = 'STK' 

request_streaming_data(tws_conn) 
#print(price_field) 

上面的代碼工作完全正常打印篩選的形式從API響應,例如: 答覆:tickString tickerId = 1,滾動類型= 45,值= 1446324128

答覆:tickPrice tickerId = 1,字段= 4,價格= 29.15,canAutoExecute = 0

答覆:tickSize tickerId = 1,字段= 5,大小= 23

但是當我嘗試使用下面這個修改後的代碼的價格區域隔離開來,我沒有得到以下的響應或錯誤:

from ib.opt import ibConnection, Connection, message 
import time 
import ib_data_types as datatype 
from ib.ext.Contract import Contract 

price_field = '' 
def reply_handler(msg): 
print("Reply:", msg) 

def my_callback_handler(msg): 
if msg.field == 4: 
    price_field = msg.price 
else: 
    print(msg) 

def request_streaming_data(ib_conn): 
    # Stream market data 
    ib_conn.reqMktData(1, 
        contract, 
        datatype.GENERIC_TICKS_NONE, 
        datatype.SNAPSHOT_NONE) 
    time.sleep(1) 


if __name__ == "__main__": 
tws_conn = ibConnection(host='localhost', port=7497, clientId=100) 
tws_conn.connect() 

#tws_conn.registerAll(reply_handler) 
tws_conn.register(my_callback_handler) 

contract = Contract() 
contract.m_symbol = 'GE' 
contract.m_exchange = 'SMART' 
contract.m_currency = 'USD' 
contract.m_secType = 'STK' 

request_streaming_data(tws_conn) 
print(price_field) 

輸出到屏幕如果tws_conn.register(my_callback_handler):

服務器版本:76

TWS時間在連接:20151031 13時50分06秒PST

過程,退出代碼完成0

輸出到屏幕如果tws_conn.registerAll(my_callback_handler):

31-Oct-15 13:56:33錯誤消息分派中的異常。

處理程序 'my_callback_handler' 爲 'tickString'

回溯(最近通話最後一個): 文件 「C:\ Python34 \ LIB \站點包\ IB \選擇\ dispatcher.py」,第44行,在中調用 results.append(listener(message)) 文件「C:/Users/Admin/PycharmProjects/TestStrat/4.py」,第11行,在my_callback_handler中 if msg。字段== 4:

AttributeError的: 'TickString' 對象沒有屬性 '字段'

最後我已經測試這個問題在這裏的代碼:

IbPy: How to extract API response into a variable

輸出:

服務器版本:76

TWS連接時間:2 0151031 13時53分51秒的PST

價格 - 場4:29.31

進程退出代碼爲0

我得到正確的價格領域完成。但據我所知,我的實現類似。爲什麼我沒有得到迴應?謝謝!

+0

我會發布Yahoo TWS API組和Google討論IBPY組。特別是一個名叫Merlinson的人似乎已經發布了一些可能有用的例子。 – alex314159

回答

0

您試圖解析回覆處理程序中的所有消息,並假設它們都有一個名爲field的字段。如果你看看你之前的回覆,TickString沒有field

您只需發送TickPrice消息或檢查您的處理程序是否確實是TickPrice消息。

在您鏈接到的示例中,請注意代碼self.tws.register(self.tickPriceHandler, 'TickPrice')。這是爲TickPrice消息創建一個特殊處理程序。

+0

Brian,我理解你的觀點,但是我沒有在我鏈接到的示例中看到,在該代碼中指定作者指定其處理程序僅處理tickPrice消息。我把這一行:tws_conn.register(my_callback_handler,「TickPrice」),我仍然得到相同的錯誤。我的處理程序是相同的,除非我沒有在類中聲明它,我不認爲它是問題。 – user2880845

+0

在那個筆記上,如何檢查消息對象是否被傳回某個字段?我會認爲作者代碼:def tickPriceHandler(self,msg): 如果msg.field == 4: self.field4price = msg.price確實檢查IF .register的格式爲conn.register(handler ,「消息規範」) – user2880845

+0

這聽起來像你仍然發送所有消息到tick價格處理程序。您只能發送勾號價格消息。 – brian

相關問題