我对Interactive Brokers API的理解是异步性的,如果我在连接后调用reqMktData(),它会在其他方法中调用tickPrice(),将参数发送到tickPrice(),然后tickPrice()将它自己的结果传递给消息对象。要读取传入的消息对象,我需要从EWrapper实现一个消息处理程序。
我正在尝试在消息对象中提取price变量,但是我没有成功提取tickPrice()价格字段或从直接调用tickPrice()或从msg之类的东西中提取消息对象中的价格。价。
这是我的代码:
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,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)输出到屏幕:
31-Oct-15 13:56:33 ERROR消息发送中的异常。
处理程序'my_callback_handler'代表'tickString'
追踪(最近一次通话): 文件“C:\ Python34 \ lib \ site-packages \ ib \ opt \ dispatcher.py”,第44行,调用 results.append(监听器(消息)) my_callback_handler中的文件“C:/Users/Admin/PycharmProjects/TestStrat/4.py”,第11行 if msg.field == 4:
AttributeError:'TickString'对象没有属性'field'
最后我在这里测试了这个问题的代码:
IbPy: How to extract API response into a variable
输出:
服务器版本:76
TWS连接时间:20151031 13:53:51 PST
价格 - 字段4:29.31
处理完成,退出代码为0
我正确地得到了价格字段。但据我所知,我的实现类似。为什么我没有收到回复?谢谢!
答案 0 :(得分:1)
您正在尝试解析回复处理程序中的所有邮件,并错误地假设它们都有一个名为field
的字段。如果您查看之前的回复,TickString
没有field
。
您需要发送TickPrice
条消息,或者检查您的处理程序是否真的是TickPrice
消息。
在您关联的示例中,请注意代码self.tws.register(self.tickPriceHandler, 'TickPrice')
。这只是TickPrice
消息的特殊处理程序。