我對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
我得到正確的價格領域完成。但據我所知,我的實現類似。爲什麼我沒有得到迴應?謝謝!
我會發布Yahoo TWS API組和Google討論IBPY組。特別是一個名叫Merlinson的人似乎已經發布了一些可能有用的例子。 – alex314159