1

我对 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”对象没有属性“字段”

最后我在这里测试了这个问题的代码:

IbPy:如何将 API 响应提取到变量中

输出:

服务器版本:76

TWS 连接时间:20151031 13:53:51 PST

价格 - 字段 4:29.31

进程以退出代码 0 结束

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

4

1 回答 1

1

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

TickPrice如果它真的是一条消息,您需要只发送消息或签入您的处理程序TickPrice

在您链接到的示例中,请注意代码self.tws.register(self.tickPriceHandler, 'TickPrice')。这只是为TickPrice消息制作了一个特殊的处理程序。

于 2015-10-31T22:36:49.900 回答