def sync_status(): """ Get current sync status :request: type=0|1|2|3 // 0 为同步分钟级别数据(实际间隔为30s,我们认为30s同为分钟数据) // 1 为同步1秒级别数据,实际间隔为1s // 2 为同步tick数据 // 3 为同步Realtime实时数据,30s间隔同步一次数据库(提前停止会导致最后30s数据丢失) :return: { "success": true // 当前接口是否成功 "data": { "status": 0|1 //0:当前未开启同步,1:当前已开启同步 } } """ t = int(request.args.get('type')) try: if t not in SUPPORTED_SYNC_TYPES: return parse_resp({'message': 'Type not supported.'}, False) return parse_resp(get_sync_status_helper(t)) except Exception as e: return parse_resp({'message': str(e)}, False)
def start_sync(): """ Start sync stock data. :request: type=0|1|2|3 // 0 为同步分钟级别数据(实际间隔为30s,我们认为30s同为分钟数据) // 1 为同步1秒级别数据,实际间隔为1s // 2 为同步tick数据 // 3 为同步Realtime实时数据,30s间隔同步一次数据库(提前停止会导致最后30s数据丢失) :return: { "success": true // 当前接口是否成功 "data": { "status": 0|1|2 //0:同步进程未开启,已经开启,1:表示同步进程已经开启,不需要再开启,2:当前没有需要同步的股票数据 } } """ t = int(request.args.get('type')) try: if t not in SUPPORTED_SYNC_TYPES: return parse_resp({'message': 'Type not supported.'}, False) return parse_resp(start_sync_helper(t)) except Exception as e: return parse_resp({'message': str(e)}, False)
def get_sync_metadata(): """ get stock sync metadata which could configure the query date, start date, duration or bar size :return: { "success": true // 当前接口是否成功 "data": [ { "type": 1 // 配置类型为分钟级别数据(实际间隔为30s,我们认为30s同为分钟数据) "startDate": "20140606 00:00:00" // 开始时间,同步股票数据不会超过开始时间 }, { "type": 2 // 配置类型为秒级别数据 "startDate": "20140606 00:00:00" // 开始时间,同步股票数据不会超过开始时间 }, { "type": 3 // 配置类型为tick类型数据 "startDate": "20140606 00:00:00" // 开始时间,同步股票数据不会超过开始时间 } // 历史股票元数据配置信息 ] } """ try: return parse_resp(get_sync_metadata_helper()) except Exception as e: return parse_resp({'message': str(e)}, False)
def get_symbols_info(): """ Start symbols syncing info. :request: isFuzzy=1 code=US.H :return: { "success": true // 当前接口是否成功 "data": { "status": 0|1, // 0为当前股票没有同步数据或者为模糊搜索状态,1为当前股票有同步数据 "codeList": [ // 模糊搜索列表 { "symbol": "US.HUYA", // 股票代码 "title": "虎牙", // 公司名称 "date": "1969-12-31" // 交易所日期 }, { "symbol": "US.HMI", // 股票代码 "title": "華米科技", // 公司名称 "date": "1969-12-31" // 交易所日期 }, ], "codeCnt": "US" // 股票总数 "syncInfo": { // 同步信息 "1M": { // 分钟级数据, 秒级数据为1S,天级为1D,还有5分钟(5M),10分钟(10M),15分钟(15M),30分钟(30M) "startDate": "2016-01-28 00:00:00", // 开始日期 "endDate": "2018-01-28 00:00:00" // 结束日期 } } } } """ try: data_map = {} is_fuzzy = bool(int(request.args.get('isFuzzy'))) code = request.args.get('code') if not code: return parse_resp({'message': 'Code can\'t be empty'}, False) if is_fuzzy: res_list, cnt = fuzzy_query_code_list(code) data_map['codeList'] = res_list data_map['codeCnt'] = cnt else: data_map['syncInfo'] = query_sync_info(code) return parse_resp({'data': data_map}) except Exception as e: return parse_resp({'message': str(e)}, False)
def config_sync_metadata(): """ Config stock sync metadata :request: { "metadata":[ { "type": 1, // 配置类型为分钟级别数据(实际间隔为30s,我们认为30s同为分钟数据) "startDate": "20140606 00:00:00" // 开始时间,同步股票数据不会超过开始时间 }, { "type": 2, // 配置类型为秒级别数据 "startDate": "20140606 00:00:00" // 开始时间,同步股票数据不会超过开始时间 }, { "type": 3, // 配置类型为tick类型数据 "startDate": "20140606 00:00:00" // 开始时间,同步股票数据不会超过开始时间 } // 历史股票元数据配置信息 ] } :return: { "success": true // 当前接口是否成功 "data": { "metadata": [ { "type": 1 // 配置类型为分钟级别数据(实际间隔为30s,我们认为30s同为分钟数据) "startDate": "20140606 00:00:00" // 开始时间,同步股票数据不会超过开始时间 }, { "type": 2 // 配置类型为秒级别数据 "startDate": "20140606 00:00:00" // 开始时间,同步股票数据不会超过开始时间 }, { "type": 3 // 配置类型为tick类型数据 "startDate": "20140606 00:00:00" // 开始时间,同步股票数据不会超过开始时间 } // 历史股票元数据配置信息 ] } } """ data = request.get_json() meta_data_list = data.get('metadata') if not meta_data_list: return parse_resp({'message': 'Metadata can\'t be empty.'}, False) try: return parse_resp(update_sync_metadata_helper(meta_data_list)) except Exception as e: return parse_resp({'message': str(e)}, False)
def get_current_time(): """ Get current time :return: { "success": true // 当前接口是否成功 "data": { "time": 123123131 //获取当前时间 } } """ try: return parse_resp(get_current_time_helper()) except Exception as e: return parse_resp({'message': str(e)}, False)
def sync_status(): """ Current sync status indicating if the server is syncing. :return: { "success": true // 当前接口是否成功 "data": { "status": 0|1| //0:当前服务器没有同步数据,1:当前服务器正在同步数据 } } """ try: return parse_resp({ 'status': int(ManagedProcess.is_process_existed(TD_SYNC_PROCESS_NAME)) }) except Exception as e: return parse_resp({'message': str(e)}, False)
def config_sync_symbols(): """ Config symbols which has been or need syncing. :request: { "codeList": [ // symbol列表 { "symbol": "US.HUYA", // 股票代码 }, { "symbol": "US.HMI", // 股票代码 }, ], } :return: { "success": true // 当前接口是否成功 "data": { "codeList": [ // symbol列表 { "symbol": "US.HUYA", // 股票代码 "title": "虎牙", // 公司名称 "date": "1969-12-31" // 交易所日期 }, { "symbol": "US.HMI", // 股票代码 "title": "華米科技", // 公司名称 "date": "1969-12-31" // 交易所日期 }, ], } } """ data = request.get_json() stocks = data.get('codeList') if not stocks: return parse_resp({'message': 'Stocks can\'t be empty.'}, False) try: return parse_resp(insert_sync_symbols_data_helper(stocks)) except Exception as e: return parse_resp({'message': str(e)}, False)
def stop_sync(): """ Stop syncing. :return: { "success": true // 当前接口是否成功 "data": { "status": 0|1| //0:正在同步,已经关闭,1: 已经关闭 } } """ try: is_td_process_existed = ManagedProcess.is_process_existed( TD_SYNC_PROCESS_NAME) if not is_td_process_existed: return parse_resp({'status': 1}) ManagedProcess.remove_process(TD_SYNC_PROCESS_NAME) return parse_resp({'status': 0}) except Exception as e: return parse_resp({'message': str(e)}, False)
def get_progress(): """ Get current sync progress :return: { "success": true // 当前接口是否成功 "data": { "1M": { "histDataSyncTrack": { "syncLogs": [ // 当前同步历史记录,最多显示20条,一条记录即一次得到的同步记录数据 { "datetime": "20180510 12:00:03", // log时间 "log": "[US.HUYA] xxxxxxx" // 同步内容 } ] } // 历史股票数据同步轨迹 "histDataSyncProgress": 0.4621, // 46.21% 同步进度 "syncedSymbols": [{ "symbol": "US.HUYA" }] }, // 分钟级同步数据 "1S": { ... }, // 秒级同步数据,格式同上 "TICK": { ... } // Tick级同步数据,格式同上 "REAL": { ... } // Real级同步数据,格式同上 } } """ try: return parse_resp(get_sync_progress_helper()) except Exception as e: return parse_resp({'message': str(e)}, False)
def get_sync_symbols(): """ get symbols which has been or need syncing. :request code=US.AAPL // 股票代码 type=0 // 类型 :return: { "success": true // 当前接口是否成功 "data": { "stocks": [ // symbol列表 { "symbol": "US.HUYA", // 股票代码 "title": "虎牙", // 公司名称 "date": "1969-12-31" // 交易所日期, }, { "symbol": "US.HMI", // 股票代码 "title": "華米科技", // 公司名称 "date": "1969-12-31" // 交易所日期 }, ], "syncInfo": { "startDate": "2016-01-28 00:00:00", "endDate": "2018-01-28 00:00:00" } // 同步信息 } } """ try: code = request.args.get('code') t = request.args.get('type') if t is not None: t = int(t) return parse_resp(get_sync_symbols_data_helper(code, t)) except Exception as e: return parse_resp({'message': str(e)}, False)
def start_sync(): """ Start syncing td stock data. :return: { "success": true // 当前接口是否成功 "data": { "status": 0|1| //0:当前数据同步成功开启,1:当前数据同步已经开启,不需要再开启 } } """ try: symbols = StockUtils.get_stock_symbols() is_td_process_existed = ManagedProcess.is_process_existed( TD_SYNC_PROCESS_NAME) if is_td_process_existed: return parse_resp({'status': 1}) ManagedProcess.create_process(TD_SYNC_PROCESS_NAME, start_sync_helper, (symbols, )) return parse_resp({'status': 0}) except Exception as e: return parse_resp({'message': str(e)}, False)
def get_sync_progress(): """ Get syncing progress. :return: { "success": true // 当前接口是否成功 "data": { "lastSyncStocks": [ // 最新同步的25条股票数据 "symbol": "HUYA", "frequency": "1M", "syncDateTime": "2018-08-14 11:10:00" // 我们所有的时间都是New York Region时间 ] // 最新的同步的股票数据 "currentProgress": "0.223", // 表示当前同步的进度比例为22.3% "isSyncing": true, // 表示当前股票是否在同步,如果出现异常则为false,并且进程就会关闭 "eta": "3600" //表示当前股票还需3600s=1h的时间才能同步完毕. "syncedSymbol": 200 // 表示有200支股票已经是最新状态. } } """ try: data_map = { 'isSyncing': bool(int(ManagedProcess.is_process_existed(TD_SYNC_PROCESS_NAME))), 'lastSyncStocks': SyncProcessHelper.get_sync_records(), 'currentProgress': SyncProcessHelper.get_sync_progress(), 'syncedSymbol': SyncProcessHelper.get_synced_symbols_count(), 'eta': SyncProcessHelper.get_sync_progress_eta() } return parse_resp({'data': data_map}) except Exception as e: return parse_resp({'message': str(e)}, False)