def __init__(self, thread_num=2, *args, **kwargs): self.thread_num = thread_num self._queue = queue.Queue(maxsize=200) self.api_no_connection = TdxHq_API() self._api_worker = Thread( target=self.api_worker, args=(), name='API Worker') self._api_worker.start() self.executor = ThreadPoolExecutor(self.thread_num)
def __init__(self, **kwargs): try: default = settings.get('SERVER').get('HQ')[0] self.bestip = config.get('BESTIP').get('HQ', default) except ValueError: self.config = None self.client = TdxHq_API(**kwargs)
def request_data(stklist, parse_one_result, ip, port): """请求失败将抛出异常""" api = TdxHq_API() hku_check(api.connect(ip, port), 'Failed connect tdx ({}:{})!'.format(ip, port)) quotes_list = api.get_security_quotes(stklist) result = [parse_one_result(q) for q in quotes_list] if quotes_list is not None else [] return [r for r in result if r is not None]
def fetch_bars(self, typ: SeType, code, start, end, freq): try: tdxApi = TdxHq_API() ex_nbr = map_exchange_to_tdx_number[Exchange.from_type_and_code(typ, code)] if typ == SeType.Stock or typ == SeType.ETF: tdx_fetch_func = tdxApi.get_security_bars elif typ == SeType.Index: tdx_fetch_func = tdxApi.get_index_bars else: raise Exception('Unsupported se type') #timeout is in seconds. with tdxApi.connect(self.server['ip'], self.server['port'], time_out=3): frequence = map_freq_to_tdx_number[freq][0] days_between = date_time_utils.Date.from_str(end).delta_to(start).days + 1 if days_between > MAX_DAYS: days_between = MAX_DAYS max_count = int(map_freq_to_tdx_number[freq][1] * days_between) tmp_list = [] n_start = 0 while n_start < max_count: fetch_size = min(max_count - n_start, BATCH_SIZE) tmp_res = tdx_fetch_func( frequence, ex_nbr, code, n_start, fetch_size ) if tmp_res is None or len(tmp_res) < 1: break n_start += len(tmp_res) tmp_list.extend(tmp_res) if n_start == 0: print('No rows fetched for {}'.format(code)) # print('total fetched rows for {}: {}'.format(code, n_start)) data = tdxApi.to_df(tmp_list) if len(data) < 1: return None data = data[data['open'] != 0] cols_to_drop = ['year', 'month', 'day'] if freq.is_minutes(): data = data.assign(datetime=data['datetime'].apply(lambda x: str(x[0:19])), date=data['datetime'].apply(lambda x: str(x[0:10])), code=str(code)) \ .set_index('datetime', drop=True, inplace=False) \ .drop(cols_to_drop, axis=1) else: cols_to_drop.extend(['datetime', 'hour', 'minute']) data = data.assign(datetime=data['datetime'], date=data['datetime'].apply(lambda x: str(x[0:10])), code=str(code)) \ .set_index('date', drop=True, inplace=False) \ .drop(cols_to_drop, axis=1) return data except Exception as e: print('exception caught: {}'.format(e))
def __hq_tick(self, code): api = TdxHq_API() ip, port = self.__hq.get() with api.connect(ip, port): df = api.get_security_quotes(code) if df is not None: df = api.to_df(df) api.disconnect() self.__hq.put((ip, port)) return df
def __init__(self, thread_num=3, *args, **kwargs): self.thread_num = thread_num self._queue = queue.Queue(maxsize=thread_num*2) self.api_no_connection = TdxHq_API() self._api_worker = Thread( target=self.api_worker, args=(), name='API Worker') self.executor = ThreadPoolExecutor(self.thread_num) self._timer=LoopTimer(3,self.__test_connected) self._timer.start()
def __init__(self,ip="192.168.0.106",online=True): self.mongo = MongoDB(ip=ip) self.api = TdxHq_API(heartbeat=True) self.TDX_IP_SETS = STOCK_IP_SETS self.collection = "BASIC_INFO" self.file_incon = FILE_INCON self.file_tdxhy = FILE_TDXHY self.file_tdxzs = FILE_TDXZS self.online = online #版本库获取最新文件
def get_company_info(): api = TdxHq_API() if api.connect('119.147.212.81', 7709): print(api.get_company_info_category(TDXParams.MARKET_SZ, '000001')) #查询公司信息目录,参数:市场代码, 股票代码 api.get_company_info_content(0, '000001', os.getcwd() + "/tdx_file/" + '000001.txt', 0, 100) #读取公司信息详情,参数文件路径不知干什么 print(api.get_finance_info(0, '000001')) #读取财务信息 api.disconnect()
def multiple_task(code, timeout=100): api = TdxHq_API() api.connect('115.238.90.165', 7709) market = __select_market_code(code) res = api.get_security_bars(1, market, code, 0, 800) re=[changer(x,code) for x in res] #print(re) #res=api.get_security_quotes([(__select_market_code(code), code)]) return re
def __init__(self, *args, **kwargs): self.thread_num = kwargs.pop('thread_num', 4) self.ip = kwargs.pop('ip', '14.17.75.71') self.executor = ThreadPoolExecutor(self.thread_num) self.queue = queue.Queue(self.thread_num) for i in range(self.thread_num): api = TdxHq_API(args, kwargs) api.connect(self.ip) self.queue.put(api)
def ping(ip): api = TdxHq_API() __time1 = datetime.datetime.now() try: with api.connect(ip, 7709): if len(api.get_security_list(0, 1)) > 800: return datetime.datetime.now() - __time1 except: print('Bad REPSONSE %s' % ip) return datetime.timedelta(9, 9, 0)
def original_quotes(): api = TdxHq_API() api.connect(best_ip) now = datetime.now() #data=api.get_security_quotes((get_market(x), x)) #print(data) data = [api.get_security_quotes([(get_market(x), x) for x in code[80 * pos:80 * (pos + 1)]]) for pos in range(int(len(code) / 80) + 1)] return data[0:-1]
def api(retry_count=3): for _ in range(retry_count): try: api = TdxHq_API(heartbeat=True) api.connect(ct._get_server(), ct.T_PORT) except Exception as e: print(e) else: return api raise IOError(ct.NETWORK_URL_ERROR_MSG)
def __init__(self, thread_num=2, timeout=1, sleep_time=1, *args, **kwargs): super().__init__(name='QATdxExecutor') self.thread_num = thread_num self._queue = queue.Queue(maxsize=200) self.api_no_connection = TdxHq_API() self._api_worker = Thread( target=self.api_worker, args=(), name='API Worker') self._api_worker.start() self.timeout = timeout self.executor = ThreadPoolExecutor(self.thread_num) self.sleep_time = sleep_time
def __init__(self, db_interface: DBInterface = None, host: str = None, port: int = None): super().__init__(db_interface) if host is None: conf = get_global_config() host = conf['tdx_server']['host'] port = conf['tdx_server']['port'] self.api = TdxHq_API() self.host = host self.port = port self._factor_param = utils.load_param('tdx_param.json') self.stock_ticker = StockTickers(db_interface)
def QA_fetch_get_stock_realtime(code=['000001', '000002'], ip=best_ip, port=7709): api = TdxHq_API() __data = pd.DataFrame() with api.connect(ip, port): code = [code] if type(code) is str else code for id_ in range(int(len(code) / 80) + 1): __data = __data.append(api.to_df(api.get_security_quotes( [(__select_market_code(x), x) for x in code[80 * id_:80 * (id_ + 1)]]))) __data['datetime'] = datetime.datetime.now() data = __data[['datetime', 'code', 'open', 'high', 'low', 'price']] return data.set_index('code', drop=False, inplace=False)
def api_worker(self): for item in stock_ip_list: _sec = self._test_speed(ip=item['ip'], port=item['port'],time_out=0.5) if _sec < 0.15: try: self._queue.put(TdxHq_API(heartbeat=False,auto_retry=True).connect( ip=item['ip'], port=item['port'])) break except Exception: pass
def get_block_info(): api = TdxHq_API() if api.connect('119.147.212.81', 7709): data = api.get_and_parse_block_info("block.dat") #一般板块 #print(api.get_and_parse_block_info("block_zs.dat")) #指数板块 #print(api.get_and_parse_block_info("block_fg.dat")) #风格板块 #print(api.get_and_parse_block_info("block_gn.dat")) #概念板块 datadf = api.to_df(data) print(datadf) api.disconnect()
def get_kline_data(): api = TdxHq_API() if api.connect('119.147.212.81', 7709): data = api.get_security_bars( 9, 0, '000001', 0, 10) # 返回普通list,五个参数分别为:category(k线),市场代码(深市),股票代码,开始时间,记录条数 print(data) data = api.to_df(api.get_security_bars(9, 0, '000001', 0, 10)) # 返回DataFrame print(data) api.disconnect()
def QA_fetch_get_index_min(code, start, end, frequence='1min', ip=None, port=None): '指数分钟线' global best_ip if ip is None and port is None and best_ip['stock']['ip'] is None and best_ip['stock']['port'] is None: best_ip = select_best_ip() ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] elif ip is None and port is None and best_ip['stock']['ip'] is not None and best_ip['stock']['port'] is not None: ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] else: pass api = TdxHq_API() type_ = '' start_date = str(start)[0:10] today_ = datetime.date.today() lens = QA_util_get_trade_gap(start_date, today_) if str(frequence) in ['5', '5m', '5min', 'five']: frequence, type_ = 0, '5min' lens = 48 * lens elif str(frequence) in ['1', '1m', '1min', 'one']: frequence, type_ = 8, '1min' lens = 240 * lens elif str(frequence) in ['15', '15m', '15min', 'fifteen']: frequence, type_ = 1, '15min' lens = 16 * lens elif str(frequence) in ['30', '30m', '30min', 'half']: frequence, type_ = 2, '30min' lens = 8 * lens elif str(frequence) in ['60', '60m', '60min', '1h']: frequence, type_ = 3, '60min' lens = 4 * lens if lens > 20800: lens = 20800 with api.connect(ip, port): if str(code)[0] in ['5', '1']: # ETF data = pd.concat([api.to_df(api.get_security_bars( frequence, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1)], axis=0) else: data = pd.concat([api.to_df(api.get_index_bars( frequence, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1)], axis=0) data = data\ .assign(datetime=pd.to_datetime(data['datetime']), code=str(code))\ .drop(['year', 'month', 'day', 'hour', 'minute'], axis=1, inplace=False)\ .assign(code=code)\ .assign(date=data['datetime'].apply(lambda x: str(x)[0:10]))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(x)))\ .assign(time_stamp=data['datetime'].apply(lambda x: QA_util_time_stamp(x)))\ .assign(type=type_).set_index('datetime', drop=False, inplace=False)[start:end] # data return data.assign(datetime=data['datetime'].apply(lambda x: str(x)))
def __init__(self, *args, **kwargs): if kwargs.pop('best_ip', False): self.ip = self.best_ip else: self.ip = '14.17.75.71' self.ip = kwargs.pop('ip', '14.17.75.71') self.thread_num = kwargs.pop('thread_num', 1) if not PY2 and self.thread_num != 1: self.use_concurrent = True else: self.use_concurrent = False self.api = TdxHq_API(args, kwargs) if self.use_concurrent: self.apis = [ TdxHq_API(args, kwargs) for i in range(self.thread_num) ] self.executor = ThreadPoolExecutor(self.thread_num)
def _test_speed(self, ip, port=7709): api = TdxHq_API(raise_exception=True, auto_retry=False) _time = datetime.datetime.now() try: with api.connect(ip, port): if len(api.get_security_list(0, 1)) > 800: return (datetime.datetime.now() - _time).total_seconds() else: return datetime.timedelta(9, 9, 0).total_seconds() except Exception as e: return datetime.timedelta(9, 9, 0).total_seconds()
def api_worker(self): data = [] if self._queue.qsize() < 80: for item in info_ip_list: _sec = self._test_speed(item) if _sec < 0.1: self._queue.put( TdxHq_API(heartbeat=False).connect(ip=item, time_out=0.05)) else: self._queue_clean() Timer(0, self.api_worker).start() Timer(300, self.api_worker).start()
def __init__(self, thread_num=2, timeout=1, max_size=80, *args, **kwargs): self.thread_num = thread_num self.max_size = max_size if isinstance(max_size, int) else len(stock_ip_list) self._queue = queue.Queue(maxsize=self.max_size) self.api_no_connection = TdxHq_API() self._api_worker = Thread(target=self.api_worker, args=(), name='API Worker') self._api_worker.start() self.timeout = timeout self.executor = ThreadPoolExecutor(self.thread_num)
def QA_fetch_get_stock_latest(code, ip=best_ip, port=7709): code = [code] if isinstance(code, str) else code api = TdxHq_API(multithread=True) with api.connect(ip, port): data = pd.concat([api.to_df(api.get_security_bars( 9, __select_market_code(item), item, 0, 1)).assign(code=item) for item in code], axis=0) return data\ .assign(date=pd.to_datetime(data['datetime'] .apply(lambda x: x[0:10])), date_stamp=data['datetime'] .apply(lambda x: QA_util_date_stamp(str(x[0:10]))))\ .set_index('date', drop=False)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1)
def ping(self, ip, port): api = TdxHq_API() time1 = datetime.datetime.now() try: with api.connect(ip, int(port)): if len(api.get_security_list(0, 1)) > 800: return datetime.datetime.now() - time1 else: return datetime.timedelta(9, 9, 0) except: return datetime.timedelta(9, 9, 0)
def QA_fetch_get_index_day(code, start_date, end_date, frequence='day', ip=best_ip["stock"], port=7709): '指数日线' api = TdxHq_API() if frequence in ['day', 'd', 'D', 'DAY', 'Day']: frequence = 9 elif frequence in ['w', 'W', 'Week', 'week']: frequence = 5 elif frequence in ['month', 'M', 'm', 'Month']: frequence = 6 elif frequence in ['Q', 'Quarter', 'q']: frequence = 10 elif frequence in ['y', 'Y', 'year', 'Year']: frequence = 11 with api.connect(ip, port): start_date = str(start_date)[0:10] today_ = datetime.date.today() lens = QA_util_get_trade_gap(start_date, today_) if str(code)[0] in ['5', '1']: # ETF data = pd.concat([ api.to_df( api.get_security_bars( frequence, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1) ], axis=0) else: data = pd.concat([ api.to_df( api.get_index_bars( frequence, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1) ], axis=0) data = data.assign(date=data['datetime'].apply(lambda x: str(x[0:10]))).assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10])))\ .set_index('date', drop=False, inplace=False)\ .assign(code=code)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1)[start_date:end_date] return data.assign(date=data['date'].apply(lambda x: str(x)[0:10]))
def connect_api(self): """连接API""" # 连接增强行情API并检查连接情况 try: if not self.connected: host = SETTINGS["TDX_HOST"] port = SETTINGS["TDX_PORT"] self.hq_api = TdxHq_API() self.hq_api.connect(host, port) self.connected = True return True except Exception: raise ConnectionError("pytdx连接错误")
def connect_api(self, host: str = "", port: int = 0): """连接行情api""" # 连接行情API并检查连接情况 try: if not self.connect_status: self.hq_api = TdxHq_API() self.hq_api.connect(host, port) self.connect_status = True self.login_status = True self.subscribe_start() except Exception as e: return e
def __call__(self): count = 0 try: connect = sqlite3.connect(self.sqlitefile) progress = ProgressBar(self) api = TdxHq_API() api.connect(self.ip, self.port) count = import_data(connect, self.market, self.ktype, self.quotations, api, self.dest_dir, progress) except Exception as e: print(e) self.queue.put([self.task_name, self.market, self.ktype, None, count])