Сохранение данных из TWS API в файл csv - PullRequest
1 голос
/ 05 мая 2020

У меня есть сценарий 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.

1 Ответ

0 голосов
/ 05 мая 2020

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...