如何在交互式经纪人处导出帐户组合信息

2024-09-27 21:29:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用一个数据框来存储我的投资组合信息并每分钟更新一次。 但是下面代码中的结果是空的,我是否遗漏了什么

from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.ticktype import TickTypeEnum
import pandas as pd
import time


class IBapi(EWrapper, EClient):


    def __init__(self):
        EClient.__init__(self, self)
        self.all_positions = pd.DataFrame([], columns=['ConID', 'Symbol', 'Quantity', 'Average Cost', 'MarketPrice', 'marketValue', 'unrealizedONL', 'realizedPNL'])

    def updatePortfolio(self, contract: Contract, position: float, marketPrice: float, marketValue: float,averageCost: float, unrealizedPNL: float, realizedPNL:float, accountName:str):
        super().updatePortfolio(contract, position, marketPrice, marketValue, averageCost, unrealizedPNL, realizedPNL, accountName)
        index = str(contract.conId)
        self.all_positions.loc[index] = contract.conId, contract.symbol, position, averageCost, marketPrice, marketValue, unrealizedPNL, realizedPNL


def main():

    app = IBapi()
    app.connect('127.0.0.1', 7497, 0)
    app.reqAccountUpdates(True, "XXXXXXXX")
    current_positions = app.reqAccountUpdates(True, "XXXXXXX")

    app.run()
    print(current_positions.to_string())
    app.disconnect()

if __name__ == "__main__":
    main()

Tags: fromimportselfappdefpositionfloatcontract
1条回答
网友
1楼 · 发布于 2024-09-27 21:29:16

reqAcccountUpdates是一个异步函数调用-它发送传出消息,但不等待响应。(由于消息发起对数据流的订阅,因此返回的不是单个响应,而是一系列响应)

因此current_positions在:

current_positions = app.reqAccountUpdates(True, "XXXXXXX")

永远不会有。相反,响应由重写的updatePortfolio()函数存储在app.all_positions

另外,run()循环是一个无限循环,因此后面的行不会执行。最常见的是,这种类型的体系结构将由python/asyncio模块(如ib_insync库中)处理,或者使用一个额外的线程来运行循环

相关问题 更多 >

    热门问题