import enum import json from db import mysql_data_delegate as mysql_data def parse_kpl_datas(results): start_y = -1 end_x = -1 index = 0 datas = [] for result in results: text = result[1] if text.find("股票名称") > -1: start_y = result[0][0][1] if text.find("竞价涨幅") > -1: end_x = result[0][0][0] if start_y > 0 and end_x > 0: if result[0][0][0] < end_x and result[0][0][1] > start_y and (result[0][1][0] - result[0][0][0]) > 30: datas.append(text) index += 1 datas = datas[:3 * 5] fdatas = [] temp = [] for data in datas: temp.append(data) if len(temp) == 3: fdatas.append((temp[2][:6], temp[1])) temp = [] return fdatas # 涨停代码: # (代码,名称,首次涨停时间,最近涨停时间,几板,涨停原因,板块,实际流通,主力净额,涨停原因代码,涨停原因代码数量) # (0,1,6,25,9,16,11,15,12) # 竞价代码: # (代码,名称,涨停委买额,板块,竞价成交额,实际流通) # (0,1,18,11,22,15) # 炸板: # (代码,名称,涨幅,板块,实际流通) # (0,1,4,11,15) # 跌停: # (代码,名称,板块,实际流通) # (0,1,11,15) # 曾跌停: # (代码,名称,涨幅,板块,实际流通) # (0,1,4,11,15) DABAN_TYPE_BIDDING = 8 DABAN_TYPE_LIMIT_UP = 1 DABAN_TYPE_OPEN_LIMIT_UP = 2 DABAN_TYPE_LIMIT_DOWN = 3 DABAN_TYPE_EVER_LIMIT_DOWN = 5 class KPLDataType(enum.Enum): BIDDING = "biddings" LIMIT_UP = "limit_up" OPEN_LIMIT_UP = "open_limit_up" LIMIT_DOWN = "limit_down" EVER_LIMIT_DOWN = "ever_limit_down" FENG_KOU = "feng_kou" BEST_FENG_KOU = "best_feng_kou" FENG_XIANG = "feng_xiang" INDUSTRY_RANK = "industry_rank" JINGXUAN_RANK = "jingxuan_rank" JINGXUAN_RANK_OUT = "jingxuan_rank_out" def __parseDaBanItemData(data, type): if type == DABAN_TYPE_BIDDING: return data[0], data[1], data[18], data[11], data[22], data[15] elif type == DABAN_TYPE_LIMIT_UP: # (代码, 名称, 首次涨停时间, 最近涨停时间, 几板, 涨停原因, 板块, 实际流通, 主力净额, 涨停原因代码, 涨停原因代码数量) return data[0], data[1], data[6], data[25], data[9], data[16], data[11], data[15], data[12], data[26], data[27] elif type == DABAN_TYPE_OPEN_LIMIT_UP: return data[0], data[1], data[4], data[11], data[15] elif type == DABAN_TYPE_LIMIT_DOWN: return data[0], data[1], data[11], data[15] elif type == DABAN_TYPE_EVER_LIMIT_DOWN: return data[0], data[1], data[4], data[11], data[15] return None def __parseLimitUpItemData(data): # (代码, 名称, 首次涨停时间, 最近涨停时间, 几板, 涨停原因, 板块, 实际流通, 主力净额, 涨停原因代码, 涨停原因代码数量) return data[0], data[1], data[4], data[4], data[18], data[5], data[12], data[13], data[8], data[19], data[20] # 最强风口 # (代码,名称,强度,涨幅,热门板块,所有板块) def __parseBestFengKouItemData(data): return data[0], data[1], data[2], data[4], data[12], data[10] # 市场风口 # (代码,名称,涨幅,主力净额,风口概念) def __parseFengKouItemData(data): return data[0], data[1], data[3], data[7], data[11] # 风向标 # (代码, 名称, 现价, 涨幅, 板块, 300万大单净额, 主力净额, 自由市值) def __parseFengXiangBiaoItemData(data): return data[0], data[1], data[5], data[6], data[4], data[-3], data[13], data[10] # 行业涨幅 # (代码,名称,主力净额,涨跌幅) def __parseIndustry_rank(data): return data[0], data[1], data[6], data[3] def parseDaBanData(data, type_): if type(data) == str: data = json.loads(data) if int(data["errcode"]) != 0: raise Exception(f"解析数据出错,errcode:{data['errcode']}") list_ = data["list"] fresult_ = [] for d in list_: pdata = __parseDaBanItemData(d, type_) if pdata: fresult_.append(pdata) return fresult_ def parseLimitUpData(data): if type(data) == str: data = json.loads(data) if int(data["errcode"]) != 0: raise Exception(f"解析数据出错,errcode:{data['errcode']}") list_ = data["list"] fresult_ = [] for d in list_: pdata = __parseLimitUpItemData(d) if pdata: fresult_.append(pdata) return fresult_ def parseFengKou(data): if type(data) == str: data = json.loads(data) if int(data["errcode"]) != 0: raise Exception(f"解析数据出错,errcode:{data['errcode']}") list_ = data["List"] fresult_ = [] for d in list_: pdata = __parseFengKouItemData(d) if pdata: fresult_.append(pdata) return fresult_ def parseBestFengKou(data): if type(data) == str: data = json.loads(data) if int(data["errcode"]) != 0: raise Exception(f"解析数据出错,errcode:{data['errcode']}") list_ = data["List"] fresult_ = [] for d in list_: pdata = __parseBestFengKouItemData(d) if pdata: fresult_.append(pdata) return fresult_ def parseFengXiang(data): if type(data) == str: data = json.loads(data) if int(data["errcode"]) != 0: raise Exception(f"解析数据出错,errcode:{data['errcode']}") list_ = data["list"] fresult_ = [] for d in list_: pdata = __parseFengXiangBiaoItemData(d) if pdata: fresult_.append(pdata) return fresult_ def parseIndustryRank(data): if type(data) == str: data = json.loads(data) if int(data["errcode"]) != 0: raise Exception(f"解析数据出错,errcode:{data['errcode']}") list_ = data["list"] fresult_ = [] for d in list_: pdata = __parseIndustry_rank(d) if pdata: fresult_.append(pdata) return fresult_ # 解析板块代码 def parsePlateCodes(data): if type(data) == str: data = json.loads(data) if int(data["errcode"]) != 0: raise Exception(f"解析数据出错,errcode:{data['errcode']}") list_ = data["list"] fresult_ = [] for d in list_: # (代码,名称,现价,涨幅,自由流通,几板,龙几,主力净额,300w净额,机构增仓) fresult_.append((d[0], d[1], d[5], d[6], d[10], d[23], d[24], d[13], d[50], d[42])) return fresult_ # 解析概念中的板块强度 def parseSonPlat(data): if type(data) == str: data = json.loads(data) if int(data["errcode"]) != 0: raise Exception(f"解析数据出错,errcode:{data['errcode']}") list_ = data["List"] fresult_ = [] for d in list_: # (代码,名称,强度) fresult_.append((d[0], d[1], d[2])) return fresult_ def __money_desc(money): if abs(money) > 100000000: return f"{round(money / 100000000, 2)}亿" else: return f"{round(money / 10000, 2)}万" def parseMarketIndustry(data): if type(data) == str: data = json.loads(data) if int(data["errcode"]) != 0: raise Exception(f"解析数据出错,errcode:{data['errcode']}") list_ = data["list"] fresult_ = [] for d in list_: # (代码,名称,涨幅,主力净额) fresult_.append((d[0], d[1], d[3], d[6])) return fresult_ def parseMarketJingXuan(data): if type(data) == str: data = json.loads(data) if int(data["errcode"]) != 0: raise Exception(f"解析数据出错,errcode:{data['errcode']}") list_ = data["list"] fresult_ = [] for d in list_: # (代码,名称,强度,主力净额) fresult_.append((d[0], d[1], d[2], d[6])) return fresult_ class KPLPlatManager: def save_plat(self, _id, name): if not _id: return mysqldb = mysql_data.Mysqldb() key = f"{_id}-{name}" results = mysqldb.select_one(f"select * from kpl_plate where _name='{name}'") if not results: mysqldb.execute(f"insert into kpl_plate(_id,_name,_key) values({_id},'{name}','{key}')") def get_plat(self, name): mysqldb = mysql_data.Mysqldb() results = mysqldb.select_one(f"select * from kpl_plate where _name='{name}'") if results: return results[0] return None def get_same_plat_names(self, name): mysqldb = mysql_data.Mysqldb() plate = self.get_plat(name) if not plate: return {name} results = mysqldb.select_all(f"select _name from kpl_plate where _id='{plate}'") return set([r[0] for r in results]) def get_same_plat_names_by_id(self, id_): mysqldb = mysql_data.Mysqldb() results = mysqldb.select_all(f"select _name from kpl_plate where _id='{id_}'") return set([r[0] for r in results]) # 获取高位板的数量 def get_high_level_count(key): if key.find("连板") >= 0: # 形式如: 3连板 return int(key.replace("连板", "")) elif key.find("天") >= 0 and key.find("板") >= 0: # 形式如:5天4板 return int(key.split("天")[1].replace("板", "")) # 形式如:首板 return 1 # 获取实时涨停列表中的涨停原因 def get_current_limit_up_reasons(item) -> set: b = {item[5]} if item[6]: b |= set(item[6].split("、")) return b # 获取目前的涨停原因 def get_current_limit_up_reason(item) -> str: return item[5] def filter_block(block): if not block: return block return block.replace("概念", "") if __name__ == "__main__": print(get_high_level_count("首板")) print(get_high_level_count("5天4板")) print(get_high_level_count("2连板")) print(get_high_level_count("4连板"))