From 751183dcd74207a50834cacc575f0dfccb41658c Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期二, 06 六月 2023 18:13:05 +0800 Subject: [PATCH] 交易优化,看盘接口完善 --- third_data/data_server.py | 99 ++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 89 insertions(+), 10 deletions(-) diff --git a/third_data/data_server.py b/third_data/data_server.py index b1fa9a3..5b99222 100644 --- a/third_data/data_server.py +++ b/third_data/data_server.py @@ -1,4 +1,5 @@ import base64 +import http import json import logging import socketserver @@ -10,14 +11,15 @@ import global_util import gpcode_manager import log +import log_analyse import tool from l2 import code_price_manager 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, \ +from third_data.code_plate_key_manager import RealTimeKplMarketData, KPLPlateForbiddenManager +from third_data.kpl_data_manager import KPLDataManager, KPLLimitUpDataRecordManager, \ KPLCodeLimitUpReasonManager -from third_data.kpl_util import KPLDataType +from third_data.kpl_util import KPLDataType, KPLPlatManager import urllib.parse as urlparse from urllib.parse import parse_qs from output import code_info_output, limit_up_data_filter, output_util @@ -32,10 +34,14 @@ __IgnoreCodeManager = IgnoreCodeManager() __KPLPlatManager = KPLPlatManager() __KPLCodeLimitUpReasonManager = KPLCodeLimitUpReasonManager() + __KPLPlateForbiddenManager = KPLPlateForbiddenManager() # 鍘嗗彶鏉垮潡 __history_plates_dict = {} # 鏉垮潡 __blocks_dict = {} + # 绮鹃��,琛屼笟鏁版嵁缂撳瓨 + __jingxuan_cache_dict = {} + __industry_cache_dict = {} def __get_limit_up_list(self): # 缁熻鐩墠涓烘鐨勪唬鐮佹定鍋滄暟閲忥紙鍒嗘定鍋滃師鍥狅級 @@ -89,10 +95,13 @@ for r in reason_changes: if r[0] not in reason_changes_dict: reason_changes_dict[r[0]] = r[1] + # 缁熻鏈�杩戜笅鍗曞姩浣滃弽棣� + order_reasons_dict = log_analyse.get_cant_order_reasons_dict() + kpl_can_buy_reasons_dict = log_analyse.get_kpl_can_buy_reasons_dict() for d in total_datas: code = d[3] - # (浠g爜, 鍚嶇О, 娑ㄥ仠鐘舵��(0 - 鏃犵姸鎬� 1-娑ㄥ仠 2-鐐告澘), 榫欏嚑, 棣栨澘, 鍒嗗��, 娑ㄥ仠鏃堕棿, 鍘熷洜, 鐩稿悓鍘熷洜浠g爜鏁伴噺, 鑷敱娴侀��, 娑ㄥ仠鍘熷洜鏄惁鍙樺寲) + # (浠g爜, 鍚嶇О, 娑ㄥ仠鐘舵��(0 - 鏃犵姸鎬� 1-娑ㄥ仠 2-鐐告澘), 榫欏嚑, 棣栨澘, 鍒嗗��, 娑ㄥ仠鏃堕棿, 鍘熷洜, 鐩稿悓鍘熷洜浠g爜鏁伴噺, 鑷敱娴侀��, 娑ㄥ仠鍘熷洜鏄惁鍙樺寲,娑ㄥ仠鍘熷洜鐨勬祦鍏ュ噣棰�,涓嬪崟绠�浠�) limit_up_state = 0 if code in limit_up_dict: if limit_up_dict[code][0]: @@ -104,9 +113,33 @@ score = score_dict[code] if code in ignore_codes: continue + + # 娑ㄥ仠鍘熷洜鐨勫噣娴佸叆閲戦 + reason = d[2] + reason_money = '' + if reason in self.__jingxuan_cache_dict: + reason_money = output_util.money_desc(self.__jingxuan_cache_dict[reason][3]) + elif reason in self.__industry_cache_dict: + reason_money = output_util.money_desc(self.__industry_cache_dict[reason][3]) + + # 鍖归厤涓嬪崟鍙嶉 + order_desc = '' + order_reason = order_reasons_dict.get(code) + kpl_can_buy_reason = kpl_can_buy_reasons_dict.get(code) + if order_reason and kpl_can_buy_reason: + if int(order_reason[0].replace(":", "").replace(".", "")) > int( + kpl_can_buy_reason[0].replace(":", "").replace(".", "")): + order_desc = f"涓嶏細{order_reason[1]}" + else: + order_desc = f"涔帮細{kpl_can_buy_reason[1]}" + elif order_reason: + order_desc = f"涓嶏細{order_reason[1]}" + elif kpl_can_buy_reason: + order_desc = f"涔帮細{kpl_can_buy_reason[1]}" + 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))) + reason_changes_dict.get(code), reason_money, order_desc)) 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, @@ -235,12 +268,20 @@ response_data = "" if url.path == "/get_kpl_data": best_feng_kou = self.__kplDataManager.get_data(kpl_util.KPLDataType.BEST_FENG_KOU) + if not best_feng_kou: + best_feng_kou = [] best_feng_kou = best_feng_kou[:22] feng_kou = self.__kplDataManager.get_data(kpl_util.KPLDataType.FENG_KOU) + if not feng_kou: + feng_kou = [] feng_kou = feng_kou[:22] industry_rank = self.__kplDataManager.get_data(kpl_util.KPLDataType.INDUSTRY_RANK) + if not industry_rank: + industry_rank = [] industry_rank = industry_rank[:22] feng_xiang = self.__kplDataManager.get_data(kpl_util.KPLDataType.FENG_XIANG) + if not feng_xiang: + feng_xiang = [] 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}}) @@ -249,12 +290,14 @@ code = ps_dict['code'] name = ps_dict.get('name') - data = code_info_output.get_output_params(code) + data = code_info_output.get_output_params(code,self.__jingxuan_cache_dict,self.__industry_cache_dict) 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"]) + if "plate" in data["kpl_code_info"]: + self.__blocks_dict[code] = (time.time(), data["kpl_code_info"]["plate"]) response_data = json.dumps({"code": 0, "data": data}) # 鑾峰彇璇勫垎淇℃伅 @@ -287,14 +330,47 @@ # 绮鹃�夛紝涓诲姏鍑�棰濋『搴� result = kpl_api.getMarketJingXuanRealRankingInfo(False) result = kpl_util.parseMarketJingXuan(result) - - response_data = json.dumps({"code": 0, "data": result}) + forbidden_plates = self.__KPLPlateForbiddenManager.list_all() + fresult = [] + for d in result: + if type_ == 2 or type_ == 3: + self.__jingxuan_cache_dict[d[1]] = d + elif type_ == 0 or type_ == 1: + self.__industry_cache_dict[d[1]] = d + d = list(d) + d.append(1 if d[1] in forbidden_plates else 0) + fresult.append(d) + response_data = json.dumps({"code": 0, "data": fresult}) 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}) + elif url.path == "/kpl/forbidden_plate": + ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()]) + plate = ps_dict["plate"] + # 鍔犲叆绂佹 + self.__KPLPlateForbiddenManager.save_plate(plate) + response_data = json.dumps({"code": 0}) + elif url.path == "/kpl/get_plate_codes": + # 鑾峰彇娑ㄥ仠鍘熷洜涓嬮潰鐨勪唬鐮� + ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()]) + plate = ps_dict["plate"] + # 鑾峰彇鏉垮潡涓嬬殑浠g爜 + # 缁熻鐩墠涓烘鐨勪唬鐮佹定鍋滄暟閲忥紙鍒嗘定鍋滃師鍥狅級 + now_limit_up_codes_info = self.__kplDataManager.get_data(KPLDataType.LIMIT_UP) + codes_info = [] + for d in now_limit_up_codes_info: + if d[5] != plate: + continue + codes_info.append([d[0],d[1],0]) + # 鏌ヨ鏄惁涓烘兂涔板崟 + want_codes = gpcode_manager.WantBuyCodesManager.list_code() + for code_info in codes_info: + code_info[2] = 1 if code_info[0] in want_codes else 0 + response_data = json.dumps({"code": 0,"data":codes_info}) + self.send_response(200) # 鍙戠粰璇锋眰瀹㈡埛绔殑鍝嶅簲鏁版嵁 @@ -395,10 +471,13 @@ params = json.loads(_str) return params +class ThreadedHTTPServer(socketserver.ThreadingMixIn, http.server.HTTPServer): + pass def run(addr, port): handler = DataServer - httpd = socketserver.TCPServer((addr, port), handler) + # httpd = socketserver.TCPServer((addr, port), handler) + httpd =ThreadedHTTPServer((addr, port), handler) print("HTTP server is at: http://%s:%d/" % (addr, port)) httpd.serve_forever() -- Gitblit v1.8.0