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

将交互式代理API引入熊猫

葛玉堂
2023-03-14

对Python和IB API还不熟悉,但仍停留在这个简单的问题上。此应用程序工作正常,并打印IB服务器回复。然而,我不知道如何将这些数据输入熊猫的数据框或任何其他变量。你如何“把数据拿出来”谢谢

在论坛、文档或youtube上,我找不到任何有用的例子。我想答案一定是将accountSummary返回给pd。系列,但不知道如何。

预期输出将是一个可以在应用程序之外操作的数据系列或变量。

from ibapi import wrapper
from ibapi.client import EClient
from ibapi.utils import iswrapper #just for decorator
from ibapi.common import *
import pandas as pd

class TestApp(wrapper.EWrapper, EClient):
    def __init__(self):
        wrapper.EWrapper.__init__(self)
        EClient.__init__(self, wrapper=self)

    @iswrapper
    def nextValidId(self, orderId:int):
        print("setting nextValidOrderId: %d", orderId)
        self.nextValidOrderId = orderId
        # here is where you start using api
        self.reqAccountSummary(9002, "All", "$LEDGER")

    @iswrapper
    def error(self, reqId:TickerId, errorCode:int, errorString:str):
        print("Error. Id: " , reqId, " Code: " , errorCode , " Msg: " , errorString)

    @iswrapper
    def accountSummary(self, reqId:int, account:str, tag:str, value:str, currency:str):
        print("Acct Summary. ReqId:" , reqId , "Acct:", account, 
            "Tag: ", tag, "Value:", value, "Currency:", currency)
    #IB API data returns here, how to pass it to a variable or pd.series

    @iswrapper
    def accountSummaryEnd(self, reqId:int):
        print("AccountSummaryEnd. Req Id: ", reqId)
        # now we can disconnect
        self.disconnect()

def main():
    app = TestApp()
    app.connect("127.0.0.1", 4001, clientId=123)
    test = app.accountSummary
    app.run()

if __name__ == "__main__":
    main()

共有2个答案

尉迟德惠
2023-03-14

我将数据存储到一个字典中,从字典中创建一个数据帧,并使用concat函数将新的数据帧附加到主数据帧中。下面是一个例子:

def accountSummary(self, reqId:int, account:str, tag:str, value:str, currency:str):
    acct_dict = {"account": account, "value": value, "currency": currency}
    acct_df = pd.DataFrame([acct_dict], columns=acct_dict.keys())
    main_df = pd.concat([main_df, acct_df], axis=0).reset_index()

要了解更多信息,您可能喜欢与交互式经纪人进行算法交易

澹台宾白
2023-03-14

Hi也有同样的问题,collections帮我解决了。这是我的CFDs数据代码。也许它会帮助别人。你将在应用程序中拥有你的数据。df。任何改进建议都是非常受欢迎的。

import collections
import datetime as dt
from threading import Timer
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
import pandas as pd

# get yesterday and put it to correct format yyyymmdd{space}{space}hh:mm:dd
yesterday = str(dt.datetime.today() - dt.timedelta(1))
yesterday = yesterday.replace('-','')

IP = '127.0.0.1'
PORT = 7497

class App(EClient, EWrapper):

    def __init__(self):
        super().__init__(self)
        self.data = collections.defaultdict(list)
    
    def error(self, reqId, errorCode, errorString):
        print(f'Error {reqId}, {errorCode}, {errorString}')
    
    def historicalData(self, reqId, bar):
        self.data['date'].append(bar.date)
        self.data['open'].append(bar.open)
        self.data['high'].append(bar.high)
        self.data['low'].append(bar.low)
        self.data['close'].append(bar.close)
        self.data['volume'].append(bar.volume)
        self.df = pd.DataFrame.from_dict(self.data)

    def stop(self):
        self.done = True
        self.disconnect()

# create App object
app = App()
print('App created...')
app.connect(IP, PORT, 0)
print('App connected...')

# create contract
contract = Contract()
contract.symbol = 'IBDE30'
contract.secType = 'CFD' 
contract.exchange = 'SMART' 
contract.currency = 'EUR' 
print('Contract created...')

# request historical data for contract
app.reqHistoricalData(reqId=1, 
                    contract=contract, 
                    endDateTime=yesterday,
                    durationStr='1 W',  
                    barSizeSetting='15 mins', 
                    whatToShow='ASK', 
                    useRTH=0, 
                    formatDate=1, 
                    keepUpToDate=False, 
                    chartOptions=[])

Timer(4, app.stop).start()
app.run()
 类似资料:
  • 如果我想使用交互式经纪人Java API检查当前头寸,然后通过出售或购买每个头寸的股票来重新平衡这些头寸,我只需要使用EWrapper。position()方法获取帐户中的当前头寸?或者我应该使用EClientSocket。reqPositions()方法来获取它? Ewrapper似乎用于从TWS接收信息到客户端,而EClientSocket用于向TWS发送请求。在这种情况下,我是否同时使用po

  • 我正在寻找将Python连接到交互式代理应用编程接口。谷歌搜索显示了ibPy的可用性(见https://pypi.python.org/pypi/ib),但是这个库似乎没有得到维护,也不支持Python 3。我还发现https://github.com/colin1alexander/IbPython3但是这个项目已经被取消了。 我知道Quantopian使用交互式代理作为其执行代理,但有一个用于

  • 我是新的java虽然我有一些经验与R. 我参加过一门java课程,读过一两本书以及interactive brokers发布的API指南。显然,这个API比我以前使用过的任何API都要高。 我想做的第一件事就是简单地连接到软件。我已经能够用Interactive Brokers提供的测试GUI做到这一点。然而,在编写自己的脚本时,我遇到了一个错误:不可编译的源代码——错误的符号类型。我已经将jav

  • 我正在研究为我们的客户报告工具创建PDF报告的不同方法。我找到了这个链接,他们可以在PDF文档上执行操作和表单。有可能以编程方式生成这些PDF吗?比如有没有API可以创建这样的PDF? 我使用过apache POI和iText,但它没有这些功能。有没有人遇到过任何开源或商业工具用于此目的? 我的主要目标用户将是iPad用户。因此在objective c中使用此API也会有所帮助。

  • IBKR TWS(交易者工作站)是一个工具,用于通过交互式经纪人管理股票市场中的股票订单。它们提供了一个API来自动化订单,比如下订单、取消订单等等。 我正在创建一个程序来处理执行订单在我的交易员工作站使用互动经纪商JavaAPI。 我无法检测订单何时满。 留档描述了当一个订单被填满时,会调用执行细节回调(这是一个EWrapper方法,请参阅下面的代码),但是我尝试使用它,并且执行细节回调从未被调

  • 原文:Interactive navigation 所有图形窗口都带有导航工具栏,可用于浏览数据集。 以下是工具栏底部的每个按钮的说明: Home(首页)、Forward(前进)和Back(后退)按钮: 这些类似于 Web 浏览器的前进和后退按钮。 它们用于在之前定义的视图之间来回浏览。 它们没有意义,除非你已经使用平移和缩放按钮访问了其他地方。 这类似于尝试在访问新页面之前单击 Web 浏览器上