当前位置: 首页 > 知识库问答 >
问题:

Ibpy:如何捕获从reqAccountSummary返回的数据

澹台聪
2023-03-14

我使用的是交互式代理的ibapi,我通常被困在如何捕获返回的数据上。例如,根据api文档,当我请求reqAccountSummary()时,该方法通过accountSummary()传递数据。但他们的例子只打印数据。我曾尝试捕获数据或将其分配给变量,但他们的文档中没有任何地方显示如何执行此操作。我也在谷歌搜索,只找到register()和registerAll(),但这是来自ib.opt的,它不在最新的工作ibapi包中。

这是我的密码。您能告诉我如何修改accountSummary()以捕获数据吗?

from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.common import *
class TestApp(EWrapper,EClient):
    def __init__(self):
        EClient.__init__(self,self)

    # request account data:
    def my_reqAccountSummary1(self, reqId:int, groupName:str, tags:str):
        self.reqAccountSummary(reqId, "All", "TotalCashValue")


    # The received data is passed to accountSummary()
    def accountSummary(self, reqId: int, account: str, tag: str, value: str, currency: str):
        super().accountSummary(reqId, account, tag, value, currency)
        print("Acct# Summary. ReqId>:", reqId, "Acct:", account, "Tag: ", tag, "Value:", value, "Currency:", currency)
        return value  #This is my attempt which doesn't work


def main():
    app = TestApp()
    app.connect("127.0.0.1",7497,clientId=0)

    app.my_reqAccountSummary1(8003, "All", "TotalCashValue")  #"This works, but the data is print to screen. I don't know how to assign the received TotalCashValue to a variable"

    # myTotalCashValue=app.my_reqAccountSummary1(8003, "All", "TotalCashValue")  #"My attempt doesn't work"
    # more code to stop trading if myTotalCashValue is low

    app.run()

if __name__=="__main__":
    main()

共有1个答案

农鸿德
2023-03-14

您不能在主功能中执行此操作,因为app。run监听TWS的响应。一旦你正确设置了所有回调,主功能将在应用程序中永远循环。运行

您必须将代码直接放入帐户摘要函数中。这就是这类程序的工作方式,您可以将逻辑直接放入回调函数中。您可以始终分配self.myTotalCashValue=value以使其可用于类的其他部分,甚至可用于另一个线程。

--或者--

在线程中运行app.run并等待值返回,例如:

添加self_myTotalCashValue=value到accountSummary,导入线程时间,然后在main中添加如下内容:

t = threading.Thread(target=app.run)
t.daemon = True
t.start()
while not hasattr(app,"_myTotalCashValue"):
    time.sleep(1)
print(app._myTotalCashValue)

和往常一样,在使用线程时,你必须小心使用appmain之间的共享内存。

 类似资料:
  • 问题内容: 以下代码给出了编译错误,提示“意外运行”: 我知道,如果正常调用函数就可以获取返回值,而无需使用goroutine。或者我可以使用频道等 我的问题是为什么不能从goroutine中获取像这样的返回值。 问题答案: 严格的答案是您 可以 做到。这可能不是一个好主意。下面的代码可以做到这一点: 这将产生一个新的goroutine,它将进行计算,然后将结果分配给。问题是:您将如何使用原始go

  • 有许多关于如何在使用JavaScript Promise编程时使用“然后”和“捕获”的教程。然而,所有这些教程似乎都忽略了一个重要的点:从然后/捕获块返回以打破promise链。让我们从一些同步代码开始来说明这个问题: 本质上,我正在测试一个捕获的错误,如果不是我期望的错误,我会返回给调用方,否则程序将继续。然而,这种逻辑在Promise中不起作用: 这种逻辑用于我的一些单元测试,我希望函数以某种

  • 我想要能够让我的catch请求用户输入文件名,直到文件名有效为止,有没有人能给我一个建议,如何安排我的代码做到这一点? 导入java.io.FileNotFoundException;导入java.util.scanner; public class Requierment2{public static void main(String[]args){ }

  • 问题内容: 我想在其中捕获返回键,以便对当前标记的单元格执行某些操作。那就是:我希望用户在任何单元格处于高亮状态时按下键盘上的“返回/输入”键。按下该按钮应发出一种新方法。例如,显示带有该单元格内容的消息框。 如何将按回车键的事件连接到方法? 由于我是python的新手,所以我不知道该怎么做,并且感谢任何建议。 问题答案: 您的问题有点模棱两可。“捕捉返回键”是什么意思?有几种返回信息的方法。 如

  • 问题内容: 我需要兑现承诺,以便可以通过封闭函数将其返回。我知道,由于正常的JavaScript范围,我可能无法按照编码的方式进行操作。有什么办法可以做到吗? 位于#1 的 console.log 会生成正确的数据。 console.log #2总是产生’a’; 任何指针将不胜感激。 问题答案: 许诺背后的基本原则之一是它是异步处理的。这意味着您无法创建承诺,然后立即在代码中同步使用其结果(例如,