python - 将数据从 TWS API 保存到 csv 文件
问题描述
我有一个 python 脚本,它从 TWS API(Interactive Brokers)读取数据并希望将数据转储到 csv 文件中。
现在它只是覆盖数据并打印最后一行以及一堆我不想要的其他值。
它使用 print(df) 打印出正确的值。
代码:
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.common import *
from ibapi.contract import *
from threading import Timer
from ibapi.ticktype import *
import pandas as pd
import numpy as np
class TestApp(EWrapper, EClient):
def __init__(self):
EWrapper.__init__(self)
EClient.__init__(self, self)
def error(self, reqId, errorCode, errorString):
print("Error: ", reqId, " ", errorCode, " ", errorString)
def nextValidId(self, orderId):
self.start()
def contractDetails(self, reqId, contractDetails):
self.data = [contractDetails]
df = pd.DataFrame(self.data)
df.to_csv('options_test.csv')
print(df)
def contractDetailsEnd(self, reqId):
print("\ncontractDetails End\n")
def start(self):
#self.reqSecDefOptParams(1, "AAPL", "", "STK", 265598)
contract = Contract()
contract.symbol = 'AAPL'
contract.secType = 'OPT'
contract.exchange = 'SMART'
contract.currency = 'USD'
#contract.primaryExchange = 'NASDAQ'
contract.lastTradeDateOrContractMonth = '202010'
#contract.strike = 175
#contract.right = "C"
#contract.multiplier = "100"
global underlying
underlying = contract.symbol
self.reqMktData(1, contract, '106', False, False, [])
self.reqContractDetails(1, contract)
def stop(self):
self.done = True
self.disconnect()
def main():
app = TestApp()
app.nextOrderId = 0
app.connect('127.0.0.1', 7497, 123)
app.data = []
Timer(4, app.stop).start()
app.run()
if __name__ == "__main__":
main()
我尝试使用 append() 并吐出一个错误。
def contractDetails(self, reqId, contractDetails):
self.data = [contractDetails]
df = pd.append(self.data)
df.to_csv('options_test.csv')
print(df)
..raise AttributeError(f"module 'pandas' has no attribute '{name}'")
AttributeError: module 'pandas' has no attribute 'append'
我只想将“contractDetails”中收到的数据保存到 csv 中。
解决方案
contractDetails 是一个 ContractDetails 详细信息对象,我不确定 pandas 将如何制作数据框。最常用的字段是合约对象,它具有可用于请求数据或下订单的 conId。它也有符号,所以你知道你在交易什么。contractDetails 具有其他信息,例如交易时间和交易所。检查合同的源代码。为了提高效率,我稍微修改了数据框的制作方式。我还稍微修改了代码并删除了不需要的计时器。
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.common import *
from ibapi.contract import *
from threading import Timer
from ibapi.ticktype import *
import collections
import pandas as pd
class TestApp(EWrapper, EClient):
def __init__(self):
EWrapper.__init__(self)
EClient.__init__(self, self)
self.data=collections.defaultdict(list)
def error(self, reqId, errorCode, errorString):
print("Error: ", reqId, " ", errorCode, " ", errorString)
def nextValidId(self, orderId):
self.nextOrderId=orderId
self.start()
def contractDetails(self, reqId, contractDetails):
self.data["conid"].append(contractDetails.contract.conId)
self.data["symbol"].append(contractDetails.contract.localSymbol)
def contractDetailsEnd(self, reqId):
print("\ncontractDetails End\n")
self.df=pd.DataFrame.from_dict(app.data)
self.stop()
def start(self):
#self.reqSecDefOptParams(1, "AAPL", "", "STK", 265598)
contract = Contract()
contract.symbol = 'AAPL'
contract.secType = 'OPT'
contract.exchange = 'SMART'
contract.currency = 'USD'
#contract.primaryExchange = 'NASDAQ'
contract.lastTradeDateOrContractMonth = '202010'
#contract.strike = 175
#contract.right = "C"
#contract.multiplier = "100"
self.reqContractDetails(1, contract)
def stop(self):
self.disconnect()
print(self.df)
#self.df.to_csv('options_test.csv')
def main():
app = TestApp()
app.connect('127.0.0.1', 7496, 123)
app.run()
推荐阅读
- excel-formula - 如何使用百分比在 Excel 中创建五星级评分系统
- c# - 如何在 Div htmlagilitypack 中获取 Div
- javascript - 当我添加另一个具有相同 js 文件的 html 文件时不添加行
- reactjs - TSlint 和 React:如何在导出默认值之前在底部强制执行样式?
- c++ - c++ hpp 文件包含在许多文件中,编译器报告“LNK4006”
- c - C语言中的套接字通信。发送文件内容
- c# - 将变量从另一个类传递到表单中
- c - C程序正在自动关闭
- swift - 图像压缩而不快速改变图像的分辨率
- makefile - 为什么在配方中使用 $(MAKE) 制作“--dry-run”会导致错误?