我有一个 python 脚本,它连接到 Interactive Brokers API 并检索安全合约信息,如下所示:
from ibapi.client import *
from ibapi.wrapper import *
import time
class TestApp(EClient, EWrapper):
def __init__(self):
EClient.__init__(self, self)
def contractDetails(self, reqId: int, contractDetails: ContractDetails):
print(f"contract details: {contractDetails}")
def contractDetailsEnd(self, reqId: int):
print("End of contractDetails")
self.disconnect()
def main():
try:
app = TestApp()
app.connect("127.0.0.1", 7496, 1000)
myContract = Contract()
# myContract.conId = "503837634"
myContract.symbol = "/ES"
myContract.exchange = "CME"
myContract.secType = "FUT"
myContract.currency = "USD"
myContract.localSymbol = 'ESZ3'
#myContract.primaryExchange = "ISLAND"
time.sleep(3)
app.reqContractDetails(1, myContract)
app.run()
except KeyboardInterrupt:
print('Session completed')
app.disconnect()
if __name__ == "__main__":
main()
在我需要中断进程的情况下(例如,由于未找到具有指定详细信息的合同,程序不会自然结束),我已使用 try/catch 和
KeyboardInterrupt
异常进行设置。 这似乎没有被捕获,因此终止进程也会终止已建立的连接,我被迫再次手动登录。
我考虑过使用
signal
模块,但似乎没有一种自然的方式来应用 代码片段 我发现允许我在退出之前关闭连接 (app.disconnect()
)。
例如,我可以实现链接到答案的版本,如下所示,但无法在退出之前传递我的应用程序实例以由处理程序断开连接。
def handler(sig, frame):
print('Exception detected...session completed')
sys.exit(0)
def main():
app = TestApp()
app.connect("127.0.0.1", 7496, 1000)
myContract = Contract()
# myContract.conId = "503837634"
myContract.symbol = '/ES'
myContract.exchange = 'CME'
myContract.secType = "FUT"
myContract.currency = "USD"
myContract.localSymbol = 'ESZ3'
#myContract.primaryExchange = "ISLAND"
time.sleep(3)
app.reqContractDetails(1, myContract)
app.run()
signal.signal(signal.SIGINT, handler)
signal.pause()
app.disconnect()
if __name__ == "__main__":
main()
任何人都可以阐明如何实现这一目标吗?
根据文档,EWrapper::error 是一个错误处理程序,可以接收错误代码 -1,这意味着没有错误,如果出现实际错误,则可以接收正错误代码。我认为这个想法是你实际上并没有通过断开连接来终止连接。相反,你应该:
如果我自己不写一些东西,我真的无法做更多的事情 - 这实际上可能是一个好主意。
Ant告诉我,如果你不终止这件事会发生什么?是永远等待还是超时?
查看EClient的源码: c:\TWS API\source\pythonclient\ibap