在 API 的 Python 脚本中合并键盘中断

问题描述 投票:0回答:2

我有一个 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()

任何人都可以阐明如何实现这一目标吗?

python python-3.x exception keyboard-events
2个回答
2
投票

根据文档,EWrapper::error 是一个错误处理程序,可以接收错误代码 -1,这意味着没有错误,如果出现实际错误,则可以接收正错误代码。我认为这个想法是你实际上并没有通过断开连接来终止连接。相反,你应该:

  • 按照文档的建议创建一个线程
  • 定期检查此错误代码以了解请求的执行情况。如果它指示错误(未找到合约?),则终止线程,但不终止整个连接。

如果我自己不写一些东西,我真的无法做更多的事情 - 这实际上可能是一个好主意。

Ant告诉我,如果你不终止这件事会发生什么?是永远等待还是超时?


0
投票

查看EClient的源码: c:\TWS API\source\pythonclient\ibap

© www.soinside.com 2019 - 2024. All rights reserved.