Ibpy: как получить данные, возвращаемые из reqAccountSummary

Я использую ibapi от интерактивных брокеров, и я застрял на том, как собрать возвращенные данные, как правило. Например, согласно api docs, когда я запрашиваю reqAccountSummary(), метод доставляет данные через accountSummary(). Но их пример только распечатывает данные. Я пытался захватить данные или присвоить их переменной, но нигде в их документах не показано, как это сделать. Я также ищу в Google и нахожу только 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 ответ

Вы не можете сделать это в основной функции, так как app.run слушает ответы от TWS. После того, как вы настроили все обратные вызовы, как вы правильно сделали, основная функция будет зацикливаться app.run,

Вы должны поместить свой код прямо в accountSummary функция. Так работают подобные программы, вы помещаете свою логику прямо в функции обратного вызова. Вы всегда можете назначить self.myTotalCashValue = value сделать его доступным для других частей вашего класса или даже для другого потока.

-- ИЛИ ЖЕ --

Вы запускаете app.run в потоке и ждете возврата значения, например

добавлять self._myTotalCashValue = value на счет Сумма, импорт threading а также time а затем добавить что-то вроде этого в основной:

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

Как обычно с потоками, вы должны быть немного осторожны с общей памятью между app а также main,

Другие вопросы по тегам