【问题标题】:MATLAB Trading Toolbox: Why the IB code gets stuck in a for-loop?MATLAB Trading Toolbox:为什么 IB 代码卡在 for 循环中?
【发布时间】:2016-05-11 09:33:12
【问题描述】:

我正在使用交易工具箱建立与 IB TWS 的连接。一般来说,API 工作正常,我的代码执行我的意图,例如检索实时数据和执行订单。

我现在想做的是在 for-循环中执行我的代码块(以运行多种策略),但是一旦我尝试在 @ 中执行代码987654323@ 循环,代码似乎陷入了无限循环,我只能通过关闭 MATLAB 来打破它(即使是 CTRL + c ,在这种情况下不会成功)。

然后我的命令窗口会快速显示IB 错误消息,例如

Cannot unregister 'xxx'
其中xxx是各种IB函数,如tickPricetickData

奇怪的是,当我手动突出显示代码并运行它(使用 F9 )时,一切都像魅力一样。

根据我的研究,这似乎与处理 ib 连接的方式有关。我在for 循环的开头(在它内部)打开ib 连接,然后关闭它并在循环结束时(也在循环内部)。

我已经尝试在“关闭”命令后暂停执行 1-2 秒,以确保有足够的时间正确关闭连接,但没有任何效果。

任何人都可以在这里帮助我或者对如何解决这个问题有想法吗?

【问题讨论】:

  • 您可能已经注意到,StackOverflow 鼓励使用基于 MCVE 的问题。您的问题需要重现代码,以确认问题的根本原因。如果没有 MCVE,很难从空中“找到”任何答案,但反之亦然,问题隔离和回归代码单元测试只会导致结果。希望您能很快找到针对您观察到的问题的良好建议。 MCVE 在这两个方面都有很大帮助。 无论如何,享受成为这个伟大知识社区的积极贡献者吧!
  • 事实上,盈透证券的条款和条件可能会对阻止“密集”重新连接构成政策限制。通常,代理端连接通信网关看门人不喜欢频繁建立/关闭/重新建立连接,因为这可能会在通信网关上引入高处理开销,并且还可能表明客户端软件组件的某些错误行为。 简单地说,“不要光脚拍蛇”(为什么会“走进狮子窝”,不是吗?)

标签: matlab for-loop algorithmic-trading


【解决方案1】:

交易工具箱的大部分问题是 Matlab 内置事件处理程序的产物。要解决您的问题,您需要为每个检索数据的函数定义一个自定义事件处理程序。如上面评论中所述,还要避免最小化打开和关闭 ib。如果您正在运行各种 GUI、类或脚本,则最多可以有 10 个连接。

ib=ibtws('1',7496), ib2=ibtws('2',7496)...等

我建议将您的 ibtws 控件包装到类中,这似乎比将它们存储在基本工作区中更好。

在关闭 GUI 或包装器之前取消所有相关的数据请求 ib.Handle.cancelMktData(ReqID); ib.Handle.cancelMktDepth(ReqID); ...等

不幸的是,Mathworks 构建了一个随机数生成器 (1:10000) 来为其大部分函数设置 reqID。这通常会导致向 IB 发送重复的请求 ID,并可能导致致命错误。 (这可能是他们希望你经常打开和关闭控件的原因)除非你想重写他们的一些代码,否则你无能为力。

【讨论】:

  • 非常感谢您的想法!拥有多个连接(即多个 ActiveX ibtws 对象)与仅拥有一个连接有什么优势?我刚刚开始使用 OOP 和 Matlab,但从我的研究表明,这绝对是要走的路——你是否将所有自定义编写的函数句柄存储在一个类中,或者你更喜欢如何组织数据请求的处理?非常感谢!
  • 使用多个连接的最佳理由是确保您在发送包含错误并导致断开连接的数据请求、订单等时不会被 IB 完全断开连接。我建议至少在单独的连接上运行您的实时数据、II 级数据、订单和历史数据请求。这将简化您的事件处理程序。我为每个策略和相关的功能组使用单独的类。我经常将事件处理程序编写为与它们相关联的类中的静态函数,或者有时根据应用程序将它们编写为单独的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
相关资源
最近更新 更多