0

嗨,我正在尝试按照此处使用 IBPy:https ://github.com/blampe/IbPy ,它的反应非常奇怪。调用 EClientSocket 类的方法返回数据,但任何调用 EWrapper 或 EWrapper 方法的 EClientSocket 方法都返回 None 和/或有问题。我意识到 IB 的 API 在其 Java 源中是异步的,但我不知道它在哪里中断。我在 TWS 中启用了 DDE/Socket 连接,甚至指定了 clientId(100)。

我正在使用来自此链接的 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 连接时间:20150529 23:29:54 PST

回复:真

回复:76

回复:20150529 23:29:54 PST

回复:无

回复:无

回复:currentTime time=None

回复:无

回复:无

回复:contractDetails reqId=1,contractDetails=ib.ext.Contract.Contract 对象在 0x000000000287FB70

回复:无

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

4

2 回答 2

0

将电话包装在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-05-30T14:01:07.210 回答
0

好的,所以我想通了。这是荒谬的简单和愚蠢的难以置信。

显然,如果您调用 IBs API 并且在每次调用后不暂停,则处理程序不会返回任何内容。这不是我在 API 文档中可以找到的任何地方。

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

于 2015-06-25T19:52:27.310 回答