From 045a5aa6434da6e83c3d850b17e7e58cd7b55ef5 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期一, 15 五月 2023 15:46:32 +0800 Subject: [PATCH] 开盘啦板块影响交易逻辑 --- third_data/data_server.py | 280 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 274 insertions(+), 6 deletions(-) diff --git a/third_data/data_server.py b/third_data/data_server.py index e8665f2..b1fa9a3 100644 --- a/third_data/data_server.py +++ b/third_data/data_server.py @@ -5,20 +5,229 @@ import time from http.server import BaseHTTPRequestHandler import cv2 +import dask +import global_util +import gpcode_manager +import log import tool from l2 import code_price_manager -from third_data import kpl_util, kpl_data_manager -from third_data.kpl_data_manager import KPLDataManager +from output.limit_up_data_filter import IgnoreCodeManager +from third_data import kpl_util, kpl_data_manager, kpl_api +from third_data.code_plate_key_manager import RealTimeKplMarketData +from third_data.kpl_data_manager import KPLDataManager, KPLLimitUpDataRecordManager, KPLPlatManager, \ + KPLCodeLimitUpReasonManager from third_data.kpl_util import KPLDataType import urllib.parse as urlparse +from urllib.parse import parse_qs +from output import code_info_output, limit_up_data_filter, output_util -from trade import bidding_money_manager +from trade import bidding_money_manager, trade_manager +from trade.l2_trade_util import BlackListCodeManager class DataServer(BaseHTTPRequestHandler): ocr_temp_data = {} __kplDataManager = KPLDataManager() + __IgnoreCodeManager = IgnoreCodeManager() + __KPLPlatManager = KPLPlatManager() + __KPLCodeLimitUpReasonManager = KPLCodeLimitUpReasonManager() + # 鍘嗗彶鏉垮潡 + __history_plates_dict = {} + # 鏉垮潡 + __blocks_dict = {} + + def __get_limit_up_list(self): + # 缁熻鐩墠涓烘鐨勪唬鐮佹定鍋滄暟閲忥紙鍒嗘定鍋滃師鍥狅級 + now_limit_up_codes_info = self.__kplDataManager.get_data(KPLDataType.LIMIT_UP) + limit_up_reason_dict = {} + for d in now_limit_up_codes_info: + if d[5] not in limit_up_reason_dict: + limit_up_reason_dict[d[5]] = [0, 0] + limit_up_reason_dict[d[5]][0] += 1 + # 鑾峰彇鎯充拱鍘熷洜鎯充拱鍗曠殑浠g爜鏁伴噺 + reason_map = self.__KPLCodeLimitUpReasonManager.list_all() + want_codes = gpcode_manager.WantBuyCodesManager.list_code() + # 鍏朵粬鎯充拱鍗� + other_count = 0 + for k in reason_map: + reson = reason_map[k] + if k in want_codes and reson in limit_up_reason_dict: + limit_up_reason_dict[reson][1] += 1 + elif k in want_codes: + other_count += 1 + + limit_up_reason_statistic_info = [(k, limit_up_reason_dict[k][0], limit_up_reason_dict[k][1]) for k in + limit_up_reason_dict] + limit_up_reason_statistic_info.sort(key=lambda x: x[1]) + limit_up_reason_statistic_info.reverse() + if other_count > 0: + limit_up_reason_statistic_info.insert(0, ('鍏朵粬', other_count, other_count)) + + total_datas = KPLLimitUpDataRecordManager.total_datas + if not total_datas: + KPLLimitUpDataRecordManager.load_total_datas() + total_datas = KPLLimitUpDataRecordManager.total_datas + # 閫氳繃娑ㄥ仠鏃堕棿鎺掑簭 + total_datas = list(total_datas) + + codes_set = set([d[3] for d in total_datas]) + # 鍒ゆ柇鏄緳鍑狅紝鍒ゆ柇鏄惁娑ㄥ仠锛屽垽鏂槸鍚︾偢鏉匡紝鍔犺浇鍒嗘暟 + rank_dict = limit_up_data_filter.get_limit_up_time_rank_dict(total_datas) + limit_up_dict, limit_up_codes, open_limit_up_codes = limit_up_data_filter.get_limit_up_info(codes_set) + score_dict = limit_up_data_filter.get_codes_scores_dict(codes_set) + fresult = [] + ignore_codes = self.__IgnoreCodeManager.list_ignore_codes("1") + + total_datas.sort(key=lambda x: int(x[5])) + total_datas.reverse() + + # 鑾峰彇娑ㄥ仠鍘熷洜鍙樺寲璁板綍 + reason_changes = log.load_kpl_reason_changes() + reason_changes.reverse() + reason_changes_dict = {} + for r in reason_changes: + if r[0] not in reason_changes_dict: + reason_changes_dict[r[0]] = r[1] + + for d in total_datas: + code = d[3] + # (浠g爜, 鍚嶇О, 娑ㄥ仠鐘舵��(0 - 鏃犵姸鎬� 1-娑ㄥ仠 2-鐐告澘), 榫欏嚑, 棣栨澘, 鍒嗗��, 娑ㄥ仠鏃堕棿, 鍘熷洜, 鐩稿悓鍘熷洜浠g爜鏁伴噺, 鑷敱娴侀��, 娑ㄥ仠鍘熷洜鏄惁鍙樺寲) + limit_up_state = 0 + if code in limit_up_dict: + if limit_up_dict[code][0]: + limit_up_state = 1 + elif limit_up_dict[code][1]: + limit_up_state = 2 + score = "" + if code in score_dict: + score = score_dict[code] + if code in ignore_codes: + continue + fresult.append((code, d[4], limit_up_state, f"榫檣rank_dict.get(code)}", d[12], score, + output_util.time_format(int(d[5])), d[2], d[10], output_util.money_desc(d[13]), + reason_changes_dict.get(code))) + response_data = json.dumps({"code": 0, "data": {"limit_up_count": len(limit_up_codes), + "open_limit_up_count": len(open_limit_up_codes), + "limit_up_reason_statistic": limit_up_reason_statistic_info, + "limit_up_codes": fresult}}) + return response_data + + def __get_plate_info(self, ps_dict): + + @dask.delayed + def kpl_getStockIDPlate(code_): + temp_data = kpl_api.getStockIDPlate(code_) + return temp_data + + @dask.delayed + def kpl_getSonPlate(plate_code_): + if not plate_code: + return None + temp_data = kpl_api.getSonPlate(plate_code_) + return temp_data + + @dask.delayed + def kpl_getCodesByPlate(plate_code_): + if not plate_code: + return None + temp_data = kpl_api.getCodesByPlate(plate_code_) + return temp_data + + @dask.delayed + def request_data(f1_, f2_): + temp_data = f1_, f2_ + return temp_data + + # 鑾峰彇鏉垮潡鐨勪唬鐮� + fresult = {} + code = ps_dict["code"] + code_info = KPLLimitUpDataRecordManager.list_by_code(code, tool.get_now_date_str())[0] + hot_block_name = code_info[2] + plate_code = self.__KPLPlatManager.get_plat(hot_block_name) + f1 = kpl_getStockIDPlate(code) + # f2 = kpl_getSonPlate(plate_code) + f3 = kpl_getCodesByPlate(plate_code) + dask_result = request_data(f1, f3) + plate_info, codes_by_plate_info = dask_result.compute() + + if plate_info: + plate_info.sort(key=lambda x: x[2]) + plate_info.reverse() + fresult["plate"] = plate_info + + # 鑾峰彇浠g爜鐨勫巻鍙叉定鍋滄暟鎹�,(娑ㄥ仠鍘熷洜,鏃ユ湡,鏉垮潡) + fresult["code_records"] = KPLLimitUpDataRecordManager.get_latest_infos(code, 4, False)[:2] + # 鑾峰彇浠婃棩鏁版嵁 + fresult["today"] = (code_info[2], code_info[1], code_info[6]) + fresult["industry"] = global_util.code_industry_map.get(code) + if plate_code: + # 鑾峰彇寮哄害 + # datas = son_plate_info + # # (浠g爜,鍚嶇О,寮哄害) + # temp = kpl_util.parseSonPlat(datas) + # temp.sort(key=lambda x: x[2]) + # temp.reverse() + # fresult["plat_strength"] = temp + + # 鑾峰彇娑ㄥ仠鍘熷洜涓嬮潰鐨勫垪琛� + datas = codes_by_plate_info + # (浠g爜,鍚嶇О,鐜颁环,娑ㄥ箙,鑷敱娴侀��,鍑犳澘锛岄緳鍑狅紝涓诲姏鍑�棰�,300w鍑�棰�,鏈烘瀯澧炰粨) + temps = kpl_util.parsePlateCodes(datas) + # --鏁版嵁鍑嗗寮�濮�-- + codes_set = set([d[0] for d in temps]) + limit_up_dict, limit_up_codes, open_limit_up_codes = limit_up_data_filter.get_limit_up_info(codes_set) + score_dict = limit_up_data_filter.get_codes_scores_dict(codes_set) + want_codes = gpcode_manager.WantBuyCodesManager.list_code() + black_codes = BlackListCodeManager.list_codes() + total_datas = KPLLimitUpDataRecordManager.total_datas + code_info_dict = {} + for val in total_datas: + code_info_dict[val[3]] = val + + # --鏁版嵁鍑嗗缁撴潫-- + + ignore_codes = self.__IgnoreCodeManager.list_ignore_codes("2") + # 鏈�缁堢粨鏋滐細(浠g爜,鍚嶇О,娑ㄥ仠鐘舵��(0-鏃犵姸鎬� 1-娑ㄥ仠 2-鐐告澘),榫欏嚑,棣栨澘,鍒嗗��,娑ㄥ仠鏃堕棿,鍘熷洜,鐩稿悓鍘熷洜浠g爜鏁伴噺,鑷敱娴侀��,娑ㄥ仠鍘熷洜鏄惁鍙樺寲,娑ㄥ箙,鐜颁环,榛戝悕鍗�,鎯充拱鍗�,涓诲姏鍑�鍊�,300w,) + codes_info_list = [] + for t in temps: + code = t[0] + limit_up_state = 0 + if code in limit_up_dict: + if limit_up_dict[code][0]: + limit_up_state = 1 + elif limit_up_dict[code][1]: + limit_up_state = 2 + score = "" + if code in score_dict: + score = score_dict[code] + + limit_up_time = '' + if code in code_info_dict: + limit_up_time = output_util.time_format(code_info_dict[code][5]) + final_code_info = {"code_info": ( + t[0], t[1], limit_up_state, t[6], t[5], score, limit_up_time, + code_info[2], code_info[10], output_util.money_desc(t[4]), 0, t[3], t[2], + "榛戝悕鍗�" if code in black_codes else "", "鎯充拱鍗�" if code in want_codes else "", + output_util.money_desc(t[7]), output_util.money_desc(t[8]), output_util.money_desc(t[9]))} + if code in code_info_dict: + final_code_info["today"] = ( + code_info_dict[code][2], code_info_dict[code][1], code_info_dict[code][6]) + # 鍔犺浇鍘嗗彶 + if code in self.__history_plates_dict: + final_code_info["code_records"] = self.__history_plates_dict[code][1] + # 鍔犺浇鏉垮潡 + if code in self.__blocks_dict: + final_code_info["plate"] = self.__blocks_dict[code][1] + + # 鑾峰彇浜岀骇琛屼笟 + final_code_info["industry"] = global_util.code_industry_map.get(code) + + if code not in ignore_codes: + codes_info_list.append(final_code_info) + fresult["code_list_info"] = codes_info_list + response_data = json.dumps({"code": 0, "data": fresult}) + return response_data def do_GET(self): path = self.path @@ -26,7 +235,7 @@ response_data = "" if url.path == "/get_kpl_data": best_feng_kou = self.__kplDataManager.get_data(kpl_util.KPLDataType.BEST_FENG_KOU) - best_feng_kou=best_feng_kou[:22] + best_feng_kou = best_feng_kou[:22] feng_kou = self.__kplDataManager.get_data(kpl_util.KPLDataType.FENG_KOU) feng_kou = feng_kou[:22] industry_rank = self.__kplDataManager.get_data(kpl_util.KPLDataType.INDUSTRY_RANK) @@ -35,6 +244,58 @@ feng_xiang = feng_xiang[:22] response_data = json.dumps({"code": 0, "data": {"best_feng_kou": best_feng_kou, "feng_kou": feng_kou, "industry_rank": industry_rank, "feng_xiang": feng_xiang}}) + elif url.path == "/get_score_info": + ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()]) + code = ps_dict['code'] + name = ps_dict.get('name') + + data = code_info_output.get_output_params(code) + if data["code_name"].find("None") > -1 and name: + data["code_name"] = f"{name} {code}" + + self.__history_plates_dict[code] = (time.time(), data["kpl_code_info"]["code_records"]) + self.__blocks_dict[code] = (time.time(), data["kpl_code_info"]["plate"]) + + response_data = json.dumps({"code": 0, "data": data}) + # 鑾峰彇璇勫垎淇℃伅 + pass + elif url.path == "/kpl/get_limit_up_list": + response_data = self.__get_limit_up_list() + + elif url.path == "/kpl/get_plate_info": + ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()]) + response_data = self.__get_plate_info(ps_dict) + + elif url.path == "/kpl/get_market_data": + # 鑾峰彇鏉垮潡淇℃伅 + ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()]) + type_ = int(ps_dict['type']) + result = [] + if type_ == 0: + # 琛屼笟锛屼富鍔涘噣棰濆�掑簭 + result = kpl_api.getMarketIndustryRealRankingInfo(True) + result = kpl_util.parseMarketIndustry(result) + elif type_ == 1: + # 琛屼笟锛屼富鍔涘噣棰濋『搴� + result = kpl_api.getMarketIndustryRealRankingInfo(False) + result = kpl_util.parseMarketIndustry(result) + elif type_ == 2: + # 绮鹃�夛紝涓诲姏鍑�棰濆�掑簭 + result = kpl_api.getMarketJingXuanRealRankingInfo(True) + result = kpl_util.parseMarketJingXuan(result) + elif type_ == 3: + # 绮鹃�夛紝涓诲姏鍑�棰濋『搴� + result = kpl_api.getMarketJingXuanRealRankingInfo(False) + result = kpl_util.parseMarketJingXuan(result) + + response_data = json.dumps({"code": 0, "data": result}) + elif url.path == "/kpl/add_ignore_code": + ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()]) + code = ps_dict['code'] + type_ = ps_dict['type'] + self.__IgnoreCodeManager.ignore_code(type_, code) + response_data = json.dumps({"code": 0}) + self.send_response(200) # 鍙戠粰璇锋眰瀹㈡埛绔殑鍝嶅簲鏁版嵁 self.send_header('Content-type', 'application/json') @@ -54,7 +315,7 @@ type_ = data["type"] print("寮�鐩樺暒type:", type_) if type_ == KPLDataType.BIDDING.value: - result_list = kpl_util.parseDaBanData(data["data"], kpl_util.DABAN_TYPE_LIMIT_UP) + result_list = kpl_util.parseDaBanData(data["data"], kpl_util.DABAN_TYPE_BIDDING) # 绔炰环鍙栧墠20 if result_list: result_list.sort(key=lambda x: x[2]) @@ -107,9 +368,16 @@ self.__kplDataManager.save_data(type_, result_list) elif type_ == KPLDataType.INDUSTRY_RANK.value: result_list = kpl_util.parseIndustryRank(data["data"]) - # 淇濆瓨椋庡悜鏁版嵁 + # 淇濆瓨琛屼笟鏁版嵁 if result_list: self.__kplDataManager.save_data(type_, result_list) + RealTimeKplMarketData.set_top_5_industry(result_list) + elif type_ == KPLDataType.JINGXUAN_RANK.value: + result_list = kpl_util.parseMarketJingXuan(data["data"]) + # 淇濆瓨绮鹃�夋暟鎹� + if result_list: + self.__kplDataManager.save_data(type_, result_list) + RealTimeKplMarketData.set_top_5_reasons(result_list) return json.dumps({"code": 0}) def __send_response(self, data): -- Gitblit v1.8.0