IBpy Ewrapper 方法不仅仅适用于 EClientSocket

IBpy Ewrapper methods don't work only EClientSocket

您好,我正在尝试按照此处使用 IBPy:https://github.com/blampe/IbPy,它的反应非常奇怪。调用 EClientSocket class returns 数据的方法,但调用 EWrapper 或 EWrapper 方法 returns None and/or 的任何 EClientSocket 方法都有问题。我意识到 IB 的 API 在其源代码 Java 中是异步的,但我无法弄清楚它在哪里中断。我在 TWS 中启用了 DDE/Socket 个连接,甚至指定了一个 clientId(100)。

我正在使用此 link 中的 IB TWS 演示:https://www.interactivebrokers.com/en/index.php?f=553&twsdemo=1 和 Python 3.4。我的 IBpy 版本是使用 pip install ib-api.

安装的

这是我的代码:

from ib.opt import ibConnection, Connection, message
from ib.ext.Contract import Contract
from ib.ext.EWrapper import EWrapper
from ib.ext.EClientSocket import EClientSocket
from ib.ext.ExecutionFilter import ExecutionFilter
from ib.ext.Order import Order
import time
from time import sleep

def reply_handler(msg):
print("Reply:", msg)

def create_contract(symbol, sec_type, exch, prim_exch, curr):
contract = Contract()
contract.m_symbol = symbol
contract.m_sec_type = sec_type
contract.m_exch = exch
contract.m_prim_exch = prim_exch
contract.m_curr = curr
return contract

if __name__ == "__main__":
tws_conn = ibConnection(host='localhost', port=7496, clientId=100)
tws_conn.connect()

tws_conn.registerAll(reply_handler)

contract = Contract()
contract.m_symbol = 'GE'
contract.m_exchange = 'SMART'
contract.m_localSymbol = 'GE'
contract.m_primaryExch = 'SMART'
contract.m_currency = 'USD'
contract.m_secType = 'STK'

#EClientSocket only methods
reply_handler(tws_conn.isConnected())
reply_handler(tws_conn.serverVersion())
reply_handler(tws_conn.TwsConnectionTime())

#EWrapper methods or calls to EWrapper methods
reply_handler(tws_conn.reqCurrentTime())
reply_handler(tws_conn.reqAccountUpdates(1, ''))
reply_handler(tws_conn.currentTime())
reply_handler(tws_conn.reqMktData(1, contract, '', False))
reply_handler(tws_conn.contractDetails(1, contract))

这是脚本为 运行:

时的控制台输出

服务器版本:76

TWS 时间 connection:20150529 23:29:54 PST

回复:正确

回复:76

回复:2015052923:29:54太平洋标准时间

回复:None

回复:None

回复:currentTime时间=None

回复:None

回复:None

回复:contractDetails reqId=1,contractDetails=ib.ext.Contract.Contract object at 0x000000000287FB70

回复:None

您可以看到,在第三个方法之后,最后一个 EClientSocket 调用停止工作。我查看了 IB 和 IBpy 的文档,在 Whosebug 上也没有提到这个特定问题。感谢您的帮助!

将您的电话包装在 reply_handler() 中会让您感到有点困惑。它已在 tws_conn 对象中注册以获取所有回复,这就是您需要做的全部。任何不是像 tws_conn.isConnected() 这样的套接字请求的东西只需要在 print() 中,这就是 reply_handler does,但它看起来像是来自 EReader 的回复 - 它不是。

同样在 tws_conn.contractDetails... 你忘记了 req.

from ib.opt import ibConnection, Connection, message
from ib.ext.Contract import Contract
from ib.ext.EWrapper import EWrapper
from ib.ext.EClientSocket import EClientSocket

def reply_handler(msg):
    print("Reply:", msg)

tws_conn = ibConnection(host='localhost', port=7496, clientId=1)
tws_conn.registerAll(reply_handler)
tws_conn.connect()


contract = Contract()
contract.m_symbol = 'GE'
contract.m_exchange = 'SMART'
contract.m_currency = 'USD'
contract.m_secType = 'STK'

#EClientSocket only methods
reply_handler(tws_conn.isConnected())
reply_handler(tws_conn.serverVersion())
reply_handler(tws_conn.TwsConnectionTime())

#EWrapper methods or calls to EWrapper methods
tws_conn.reqCurrentTime()
tws_conn.reqContractDetails(1, contract)
#tws_conn.disconnect()#don't forget at some point

好的,我明白了。它简单得可笑,令人难以置信。

显然,如果您调用 IBs API 并且在每次调用后都没有暂停,那么处理程序什么都不会 returns。这不是我在 API 文档中找到的任何地方。

所以 time.sleep(1) 作为方法中的最后一行或调用方法后的下一行是完美的。