| | |
| | | import base64 |
| | | import http |
| | | import json |
| | | import logging |
| | | import socketserver |
| | |
| | | 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 |
| | |
| | | __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): |
| | | # 统计目前为止的代码涨停数量(分涨停原因) |
| | |
| | | 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] |
| | | # (代码, 名称, 涨停状态(0 - 无状态 1-涨停 2-炸板), 龙几, 首板, 分值, 涨停时间, 原因, 相同原因代码数量, 自由流通, 涨停原因是否变化) |
| | | # (代码, 名称, 涨停状态(0 - 无状态 1-涨停 2-炸板), 龙几, 首板, 分值, 涨停时间, 原因, 相同原因代码数量, 自由流通, 涨停原因是否变化,涨停原因的流入净额,下单简介) |
| | | limit_up_state = 0 |
| | | if code in limit_up_dict: |
| | | if limit_up_dict[code][0]: |
| | |
| | | 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, |
| | |
| | | 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}}) |
| | |
| | | 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}) |
| | | # 获取评分信息 |
| | |
| | | # 精选,主力净额顺序 |
| | | 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"] |
| | | # 获取板块下的代码 |
| | | # 统计目前为止的代码涨停数量(分涨停原因) |
| | | 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) |
| | | # 发给请求客户端的响应数据 |
| | |
| | | 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() |
| | | |