简体   繁体   中英

How to get Fundamental Ratios generic ticks (python 3.x) (Interactive Broker)

Based on the following website, i would like to download Fundamental Ratios generic ticks via reqMktData "233,236,258"

https://interactivebrokers.github.io/tws-api/fundamental_ratios_tags.html

However, I have tried many times, the error can't be corrected.

'Error reading request:Message id 1004. Unable to parse data. java.lang.NumberFormatException: For input string: "Snapshot"']

AttributeError: 'IBWrapper' object has no attribute 'reqMktData'

Remark: "IBWrapper" is NOT offered by IB official website, it is provided by the follow link: https://github.com/anthonyng2/ib

# -*- coding: utf-8 -*-

"""
Created on Wed Jun 20 19:37:23 2018
@author: Owner
"""

import time

from IBWrapper import IBWrapper, contract 

from ib.ext.EClientSocket import EClientSocket



callback = IBWrapper() # Instantiate IBWrapper. callback

tws = EClientSocket(callback) # Instantiate EClientSocket and return data to 
callback

host = "127.0.0.1"

port = 7496

clientId = 25

tws.eConnect(host, port, clientId) # connect to TWS

create = contract() # Instantiate contract class

callback.initiate_variables()

contract_Details = create.create_contract(700, 'STK', 'SEHK', 'HKD')

tickerId = 1004

tws.reqMktData(tickerId,

contract_Details,

"233,236,258",

"ReportSnapshot" #ReportsFinSummary ReportsOwnership ReportsFinStatements 
#RESC CalendarReport ReportSnapshot

)

time.sleep(5)

print(callback.reqMktData)

tws.eDisconnect()

After serious study, IBWrapper does not support the generic tick data, only ibpy can be imported.

from ib.ext.Contract import Contract
from ib.opt import ibConnection
from time import sleep
import csv

class Downloader(object):
    tickType47value = ''
    #field4price = ''

    def __init__(self):
        self.tws = ibConnection('localhost', 7496, 20)
        self.tws.register(self.tickPriceHandler, 'TickString')
        self.tws.connect()
        self._reqId = 1003 # current request id

    def tickPriceHandler(self,msg):
        if msg.tickType == 47:    # tickType=47 
            self.tickType47value = msg.value
            #print('[debug]', msg)

    def requestData(self,contract): 
        self.tws.reqMktData(self._reqId, contract, "233, 236, 258", False)  #"233, 236, 258", 
        self._reqId+=1  

    def cancelData(self):    
        #self.tws.cancelMktData(1003)
        self.tws.disconnect()

The following link are all available Fundamental Ratios - tag values which is present in "headers": https://interactivebrokers.github.io/tws-api/fundamental_ratios_tags.html

if __name__=='__main__':
    headers = ['TickNo',
            'TTMNPMGN',
             'NLOW',
             'TTMPRCFPS',
             'TTMGROSMGN',
             'TTMCFSHR',
             'QCURRATIO',
             'TTMREV',
             'TTMINVTURN',
             'TTMOPMGN',
             'TTMPR2REV',
             'AEPSNORM',
             'TTMNIPEREM',
             'EPSCHNGYR',
             'TTMPRFCFPS',
             'TTMRECTURN',
             'TTMPTMGN',
             'QCSHPS',
             'TTMFCF',
             'LATESTADATE',
             'APTMGNPCT',
             'AEBTNORM',
             'TTMNIAC',
             'NetDebt_I',
             'PRYTDPCTR',
             'TTMEBITD',
             'AFEEPSNTM',
             'PR2TANBK',
             'EPSTRENDGR',
             'QTOTD2EQ',
             'TTMFCFSHR',
             'QBVPS',
             'NPRICE',
             'YLD5YAVG',
             'REVTRENDGR',
             'TTMEPSXCLX',
             'QTANBVPS',
             'PRICE2BK',
             'MKTCAP',
             'TTMPAYRAT',
             'TTMINTCOV',
             'TTMREVCHG',
             'TTMROAPCT',
             'TTMROEPCT',
             'TTMREVPERE',
             'APENORM',
             'TTMROIPCT',
             'REVCHNGYR',
             'CURRENCY',
             'DIVGRPCT',
             'TTMEPSCHG',
             'PEEXCLXOR',
             'QQUICKRATI',
             'TTMREVPS',
             'BETA',
             'TTMEBT',
             'ADIV5YAVG',
             'ANIACNORM',
             'QLTD2EQ',
             'NHIG']

    stocks=['700']
    with open('Your path', 'w', newline='') as csvfile:
        csvwriter = csv.writer(csvfile, delimiter=',', quotechar='"')
        csvwriter.writerow(headers)
        sleep(0.5)

    for x in stocks:
        for _ in range(5): #10 #If markets are open, there can be no more than 5 requests pending for the same contract.
            dl = Downloader()
            c = Contract()
            c.m_symbol = x
            c.m_secType = 'STK'
            c.m_exchange = 'SEHK'
            c.m_currency = 'HKD'
            sleep(1)
            dl.requestData(c)
            sleep(1)
            m0 = str(x)
            m = dl.tickType47value
            #data = m.split(';')
            #pairs = { tuple(datum.split('=')) for datum in data}
            #print(m)
            sleep(1)

            if dl.tickType47value:
                    with         open(r'c:\\Users\\Owner\\Desktop\\extracedCSV\\ALLHKSTOCK@Finratio_2.csv', 'a', newline='') as csvfile:
                    csvwriter = csv.writer(csvfile, delimiter=',', quotechar='"')
                    row = []
                    row.append(m0)
                    row.append(m)
                    csvwriter.writerow(row)
                    dl.cancelData()
                    sleep(0.5)
                    break

            print("Data is empty")
            dl.cancelData()
            sleep(0.5)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM