嗨,我正试着用IBPy,就像这里说的:https://github.com/blampe/IbPy,它的反应很奇怪。调用EClientSocket类的方法返回数据,但是调用EWrapper或EWrapper方法的任何EClientSocket方法都不会返回任何数据和/或有问题。我意识到IB的API在Java的源代码上是异步的,但我不知道它在哪里崩溃。我在TWS中启用了DDE/套接字连接,甚至指定了一个clientId(100)。
我正在使用来自这个链接的IB演示:https://www.interactivebrokers.com/en/index.php?f=553&twsdemo=1和Python3.4。我的IBpy版本是使用安装的。
这是我的代码:
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
连接时间:20150529 23:29:54
答复:真
答复: 76
答覆: 20150529 23:29:54
答复:无
答复:无
答复: currentTime time=None
答复:无
答复:无
回复: contractDetails reqId=1,contractDetails=ib.ext.Contract.Contract对象0x000000000287FB70
答复:无
您可以看到,在第三个方法之后,最后一个EClientSocket调用就停止了。我已经研究过IB和IBpy的文档,这个问题在Stackoverflow中也没有提到。谢谢你的帮助!
发布于 2015-05-30 14:01:07
将您的调用打包到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发布于 2015-06-25 19:52:27
好吧,所以我想通了。这是可笑的简单和愚蠢的难以置信。
显然,如果您调用IBs,并且在每次调用后不暂停,处理程序将不会返回任何内容。我在API文档中找不到这一点。
因此,time.sleep(1)作为方法中的最后一行或调用方法后的下一行工作得很好。
https://stackoverflow.com/questions/30543236
复制相似问题