IBpy Ewrapper方法不只是EClien有效

2024-06-29 00:48:57 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我正在尝试使用IBPy,它的反应非常奇怪。调用EClientSocket类的方法返回数据,但是调用EWrapper或EWrapper方法的任何EClientSocket方法都返回None和/或有问题。我意识到IB的API在Java源代码上是异步的,但我不知道它在哪里出了问题。我在TWS中启用了DDE/Socket连接,甚至还指定了clientId(100)。在

我使用的ibtws演示来自这个链接:https://www.interactivebrokers.com/en/index.php?f=553&twsdemo=1和python3.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

在c时间连接:20150529 23:太平洋标准时间29:54

回答:是的

答复:76

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

答复:无

答复:无

回复:currentTime time=无

答复:无

答复:无

回复:contractDetails reqId=1,contractDetails=ib.外部合同.Contract对象位于0x000000000287FB70

答复:无

您可以看到,在第3个方法之后,最后一个EClientSocket调用停止工作。我看过IB和IBpy的文档,但Stackoverflow上没有提到这个问题。谢谢你的帮助!在


Tags: 方法fromimportconnsymbolreplyexthandler
2条回答

reply_handler()包装您的电话有点混乱。它注册到tws_conn对象以获得所有回复,这就是您需要做的全部工作。任何不是socket请求的东西,比如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并且每次调用后都不暂停,那么处理程序将不会返回任何内容。我在API文档中找不到这个地方。在

所以时间。睡觉(1) 因为方法的最后一行或调用方法后的下一行工作得很好。在

相关问题 更多 >