我对 Interactive Brokers API 的理解是异步的,如果我在连接后调用 reqMktData(),它会在其他方法中调用 tickPrice(),将参数发送到 tickPrice(),然后 tickPrice() 将它自己的结果传递给消息对象。要读取传入的消息对象,我需要从 EWrapper 实现一个消息处理程序。
我试图在消息对象中提取价格变量,但我在提取tickPrice() 价格字段或通过直接调用tickPrice() 或从msg.price 之类的东西中提取消息对象中的价格时均未成功。
这是我的代码:
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 的响应,例如:Reply: tickString tickerId=1, tickType=45, value=1446324128
回复:tickPrice tickerId=1, field=4, price=29.15, canAutoExecute=0
回复:tickSize tickerId=1, field=5, size=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) 输出到屏幕:
2015 年 10 月 31 日 13:56:33 错误消息发送异常。
'tickString' 的处理程序'my_callback_handler'
Traceback(最近一次调用最后一次):文件“C:\Python34\lib\site-packages\ib\opt\dispatcher.py”,第 44 行,调用 结果.append(listener(message)) 文件“C:/Users /Admin/PycharmProjects/TestStrat/4.py",第 11 行,在 my_callback_handler 如果 msg.field == 4:
AttributeError:“TickString”对象没有属性“字段”
最后我在这里测试了这个问题的代码:
输出:
服务器版本:76
TWS 连接时间:20151031 13:53:51 PST
价格 - 字段 4:29.31
进程以退出代码 0 结束
我得到了正确的价格字段。但据我所知,我的实现是相似的。为什么我没有得到回应?谢谢!