IB / IbPy-了解如何从API响应中访问和存储变量

时间:2015-10-31 21:05:15

标签: python api interactive-brokers ibpy

我对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

我正确地得到了价格字段。但据我所知,我的实现类似。为什么我没有收到回复?谢谢!

1 个答案:

答案 0 :(得分:1)

您正在尝试解析回复处理程序中的所有邮件,并错误地假设它们都有一个名为field的字段。如果您查看之前的回复,TickString没有field

您需要发送TickPrice条消息,或者检查您的处理程序是否真的是TickPrice消息。

在您关联的示例中,请注意代码self.tws.register(self.tickPriceHandler, 'TickPrice')。这只是TickPrice消息的特殊处理程序。