From 21c96ed504f93f16ce6f8a3ccf164a87c9edd9c0 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期二, 30 一月 2024 15:45:23 +0800 Subject: [PATCH] 增加调试日志 --- third_data/code_plate_key_manager.py | 483 ++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 329 insertions(+), 154 deletions(-) diff --git a/third_data/code_plate_key_manager.py b/third_data/code_plate_key_manager.py index cca6bf9..3715995 100644 --- a/third_data/code_plate_key_manager.py +++ b/third_data/code_plate_key_manager.py @@ -3,43 +3,60 @@ """ # 娑ㄥ仠浠g爜鍏抽敭璇嶆澘鍧楃鐞� +import copy import json +import time import constant +from code_attribute import code_nature_analyse from db.redis_manager_delegate import RedisUtils -from third_data import kpl_block_util -from utils import global_util, tool -from log_module import log +from third_data import kpl_block_util, kpl_api, kpl_util +from trade.trade_manager import MarketSituationManager +from utils import global_util, tool, buy_condition_util +from log_module import log, async_log_util from db import redis_manager_delegate as redis_manager -from log_module.log import logger_kpl_limit_up, logger_kpl_block_can_buy, logger_kpl_debug +from log_module.log import logger_kpl_block_can_buy from third_data.kpl_util import KPLPlatManager from trade import trade_manager, l2_trade_util # 浠g爜绮鹃�夋澘鍧楃鐞� class KPLCodeJXBlockManager: + __db = 3 __redisManager = redis_manager.RedisManager(3) __code_blocks = {} # 澶囩敤 __code_by_blocks = {} + __instance = None + + def __new__(cls, *args, **kwargs): + if not cls.__instance: + cls.__instance = super(KPLCodeJXBlockManager, cls).__new__(cls, *args, **kwargs) + return cls.__instance + def __get_redis(self): return self.__redisManager.getRedis() - def save_jx_blocks(self, code, blocks, by=False): - if blocks is None: + def save_jx_blocks(self, code, blocks: list, current_limit_up_blocks: set, by=False): + if not blocks: return + final_blocks = copy.deepcopy(blocks) if len(blocks) > 2: - blocks = blocks[:2] - + final_blocks.clear() + for b in blocks: + if b not in constant.KPL_INVALID_BLOCKS: + final_blocks.append(b) + if len(final_blocks) < 2: + final_blocks = blocks # 淇濆瓨鍓�2鏉℃暟鎹� if by: - RedisUtils.setex(self.__get_redis(), f"kpl_jx_blocks_by-{code}", tool.get_expire(), json.dumps(blocks)) - self.__code_by_blocks[code] = blocks + RedisUtils.setex_async(self.__db, f"kpl_jx_blocks_by-{code}", tool.get_expire(), json.dumps(final_blocks)) + self.__code_by_blocks[code] = (final_blocks, time.time()) else: - RedisUtils.setex(self.__get_redis(), f"kpl_jx_blocks-{code}", tool.get_expire(), json.dumps(blocks)) - self.__code_blocks[code] = blocks + RedisUtils.setex_async(self.__db, f"kpl_jx_blocks-{code}", tool.get_expire(), json.dumps(final_blocks)) + self.__code_blocks[code] = (final_blocks, time.time()) # 鑾峰彇绮鹃�夋澘鍧� def get_jx_blocks(self, code, by=False): @@ -69,6 +86,50 @@ return self.__code_by_blocks.get(code) else: return self.__code_blocks.get(code) + + # 浠庣綉缁滀笂鍔犺浇绮鹃�夋澘鍧�, 褰撳墠娑ㄥ仠鐨勬澘鍧� + def load_jx_blocks(self, code, buy_1_price, limit_up_price, current_limit_up_blocks): + try: + # logger_kpl_block_can_buy.info(f"鍑嗗鏇存柊绮鹃�夋澘鍧楋細{code}-{buy_1_price}-{limit_up_price}") + if limit_up_price and buy_1_price: + # 澶勭悊涔�1,鍗�1淇℃伅 + pre_close_price = round(float(limit_up_price) / 1.1, 2) + # 濡傛灉娑ㄥ箙澶т簬7%灏辫鍙栨澘鍧� + price_rate = (buy_1_price - pre_close_price) / pre_close_price + if price_rate > 0.07: + jx_blocks_info = self.get_jx_blocks_cache(code) + if not jx_blocks_info: + blocks = kpl_api.getCodeBlocks(code) + self.save_jx_blocks(code, blocks, current_limit_up_blocks) + async_log_util.info(logger_kpl_block_can_buy, f"{code}:鑾峰彇鍒扮簿閫夋澘鍧�-{blocks}") + else: + # 杩樻病娑ㄥ仠鐨勯渶瑕佹洿鏂扮簿閫夋澘鍧� 鏇存柊绮鹃�夋澘鍧� + if abs(float(buy_1_price) - float(limit_up_price)) >= 0.001: + # 闈炴定鍋滅姸鎬� + UPDATE_TIME_SPACE = 5 * 60 + time_diff = tool.trade_time_sub(tool.get_now_time_str(), "09:30:00") + if time_diff < 0: + UPDATE_TIME_SPACE = 60 * 60 + else: + UPDATE_TIME_SPACE = int(time_diff / 30) + 60 + if UPDATE_TIME_SPACE > 5 * 60: + UPDATE_TIME_SPACE = 5 * 60 + + if time.time() - jx_blocks_info[1] > UPDATE_TIME_SPACE: + # 璺濈涓婃鏇存柊鏃堕棿杩囧幓浜�5鍒嗛挓 + blocks = kpl_api.getCodeBlocks(code) + self.save_jx_blocks(code, blocks, current_limit_up_blocks) + async_log_util.info(logger_kpl_block_can_buy, f"{code}:鑾峰彇鍒扮簿閫夋澘鍧楋紙鏇存柊锛�-{blocks}") + + elif price_rate > 0.03: + # 娣诲姞澶囩敤鏉垮潡 + if not self.get_jx_blocks_cache(code, by=True): + blocks = kpl_api.getCodeBlocks(code) + self.save_jx_blocks(code, blocks, current_limit_up_blocks, by=True) + async_log_util.info(logger_kpl_block_can_buy, f"{code}:鑾峰彇鍒扮簿閫夋澘鍧�(澶囩敤)-{blocks}") + except Exception as e: + logger_kpl_block_can_buy.error(f"{code} 鑾峰彇鏉垮潡鍑洪敊") + logger_kpl_block_can_buy.exception(e) # 寮�鐩樺暒绂佹浜ゆ槗鏉垮潡绠$悊 @@ -157,7 +218,7 @@ self.total_key_codes_dict[k] = set() self.total_key_codes_dict[k].add(code) - logger_kpl_limit_up.info("{}鏉垮潡鍏抽敭璇�:{}", code, keys) + # logger_kpl_limit_up.info("{}鏉垮潡鍏抽敭璇�:{}", code, keys) # 鏍规嵁浼犲叆鐨勫叧閿瘝涓庢定鍋滀唬鐮佷俊鎭尮閰嶈韩浣� @@ -283,11 +344,9 @@ @classmethod def is_in_top(cls, keys): reasons = cls.get_can_buy_key_set() - log.logger_kpl_debug.debug("甯傚満娴佸叆鍓�5:{}", reasons) forbidden_plates = cls.__KPLPlateForbiddenManager.list_all_cache() reasons = reasons - forbidden_plates temp_set = keys & reasons - log.logger_kpl_debug.debug("甯傚満娴佸叆鍓�5鍖归厤缁撴灉:{}", temp_set) if temp_set: return True, temp_set else: @@ -309,7 +368,6 @@ self.__history_limit_up_reason_dict[code] = set(reasons) RedisUtils.setex(self.__get_redis(), f"kpl_his_limit_up_reason-{code}", tool.get_expire(), json.dumps(list(reasons))) - logger_kpl_debug.debug(f"璁剧疆鍘嗗彶娑ㄥ仠鍘熷洜锛歿code}-{reasons}") # 濡傛灉杩斿洖鍊间笉涓篘one琛ㄧず宸茬粡鍔犺浇杩囧巻鍙插師鍥犱簡 def get_history_limit_up_reason(self, code): @@ -386,12 +444,12 @@ k3 = {industry} k4 = set() - jingxuan_blocks = self.__KPLCodeJXBlockManager.get_jx_blocks_cache(code) - if not jingxuan_blocks: - jingxuan_blocks = self.__KPLCodeJXBlockManager.get_jx_blocks_cache(code, by=True) - if jingxuan_blocks: - jingxuan_blocks = jingxuan_blocks[:2] - k4 |= set([x[1] for x in jingxuan_blocks]) + jingxuan_block_info = self.__KPLCodeJXBlockManager.get_jx_blocks_cache(code) + if not jingxuan_block_info: + jingxuan_block_info = self.__KPLCodeJXBlockManager.get_jx_blocks_cache(code, by=True) + if jingxuan_block_info: + jingxuan_blocks = jingxuan_block_info[0] + k4 |= set(jingxuan_blocks) # set([x[1] for x in jingxuan_blocks]) for k in [k1, k11, k2, k3, k4]: keys |= k @@ -430,46 +488,130 @@ l2_trade_util.forbidden_trade(code, msg=msg) logger_kpl_block_can_buy.info(msg) + # 杩斿洖鍐呭(鏄惁鍙拱, 鏄惁涓虹嫭鑻�, 鎻忚堪淇℃伅) @classmethod - def __is_block_can_buy(cls, code, block, current_limit_up_datas, code_limit_up_reason_dict, - yesterday_current_limit_up_codes, limit_up_record_datas): - log.logger_kpl_debug.info(f"鍒ゆ柇鏉垮潡鏄惁鍙拱锛歿block}") - # is_top_8_record, top_8_record = kpl_block_util.is_record_top_block(code, block, limit_up_record_datas, - # yesterday_current_limit_up_codes, 50) - # is_top_4_current, top_4_current = kpl_block_util.is_current_top_block(code, block, current_limit_up_datas, - # yesterday_current_limit_up_codes, 50) - # is_top_4 = is_top_8_record and is_top_4_current - # msg_list.append(f"\n瀹炴椂top10(娑ㄥ仠鏁伴噺锛歿len(current_limit_up_datas)})") - # msg_list.append(f"鍘嗗彶top20(娑ㄥ仠鏁伴噺锛歿len(top_8_record)})") + def __is_block_can_buy(cls, code, block, current_limit_up_datas, code_limit_up_reasons_dict, + yesterday_current_limit_up_codes, limit_up_record_datas, current_limit_up_block_codes_dict, + high_level_code_blocks=None, high_level_block_codes=None): + # 鐙嫍鍒ゆ柇 + if high_level_code_blocks is None: + high_level_code_blocks = {} + if high_level_block_codes is None: + high_level_block_codes = {} + block_codes = current_limit_up_block_codes_dict.get(block) + if block_codes is None: + block_codes = set() + if not block_codes: + # 楂樹綅鏉挎硾鍖栨澘鍧椾腑鏃犳澘鍧� + if not high_level_block_codes.get(block): + return False, True, f"{block}:鏉垮潡鏃犳定鍋�", False + elif len(block_codes) == 1 and code in block_codes: + if not high_level_block_codes.get(block): + return False, True, f"{block}:鏉垮潡鍙湁褰撳墠浠g爜娑ㄥ仠", False + # 鍙互涔扮殑鏈�澶ф帓鍚� + # open_limit_up_codes = kpl_block_util.get_shsz_open_limit_up_codes(code, block, limit_up_record_datas, + # code_limit_up_reason_dict) + current_open_limit_up_codes = kpl_block_util.get_shsz_open_limit_up_codes_current(code, block, + current_limit_up_datas) + + # ---------------------------鍒ゆ柇寮哄娍涓荤嚎------------------------- + is_strong_block = False + for d in current_limit_up_datas: + bs = kpl_util.get_current_limit_up_reasons(d) + if block not in bs: + general_blocks = high_level_code_blocks.get(d[0]) + if not general_blocks or block not in general_blocks: + # 娌″湪娉涘寲鏉垮潡涓� + continue + count = kpl_util.get_high_level_count(d[4]) + if count >= 3: + if d[4].find("杩炴澘") > 0: + is_strong_block = True + break + elif d[0] in yesterday_current_limit_up_codes and len(block_codes) >= 2: + # 鍑犲ぉ鍑犳澘锛屼笖鏈�杩�2杩炴澘 + # 鐪嬫槸鍚︽湁棣栨澘鍚庢帓 + is_strong_block = True + break + + if not is_strong_block: + temp_block_codes = set(copy.deepcopy(block_codes)) + temp_block_codes.discard(code) + if len(temp_block_codes) >= 3: + is_strong_block = True + max_rank = 2 + # 寮哄娍鏉垮潡涔拌�佸洓 + if is_strong_block: + max_rank = 3 + + # 闇�瑕佹帓闄ょ殑鑰佸ぇ鐨勪唬鐮� + exclude_first_codes = set() # HighIncreaseCodeManager().list_all() + + # 鑾峰彇涓绘澘寮�1鐨勪唬鐮� + + # 鍓旈櫎楂樹綅鏉� + if current_open_limit_up_codes and yesterday_current_limit_up_codes: + current_open_limit_up_codes -= yesterday_current_limit_up_codes + + # 鑾峰彇浠g爜鐨勫垵娆℃定鍋滄椂闂� + first_limit_up_time = time.time() + for r in limit_up_record_datas: + if r[3] == code: + first_limit_up_time = int(r[5]) # 鑾峰彇涓绘澘瀹炴椂韬綅,鍓旈櫎楂樹綅鏉� - current_shsz_rank = kpl_block_util.get_code_current_rank(code, block, current_limit_up_datas, - code_limit_up_reason_dict, - yesterday_current_limit_up_codes, shsz=True) - record_shsz_rank = kpl_block_util.get_code_record_rank(code, block, limit_up_record_datas, - code_limit_up_reason_dict, - yesterday_current_limit_up_codes, shsz=True) - # 鑾峰彇涓绘澘鍘嗗彶韬綅 + current_shsz_rank, front_current_shsz_rank_codes = kpl_block_util.get_code_current_rank(code, block, + current_limit_up_datas, + code_limit_up_reasons_dict, + yesterday_current_limit_up_codes, + exclude_first_codes, + len( + current_open_limit_up_codes), + shsz=True, + limit_up_time=first_limit_up_time) + # record_shsz_rank, record_shsz_rank_codes = kpl_block_util.get_code_record_rank(code, block, + # limit_up_record_datas, + # code_limit_up_reason_dict, + # yesterday_current_limit_up_codes, + # shsz=True) + if int(tool.get_now_time_str().replace(":", "")) <= int("094000") and is_strong_block: + # 寮哄娍涓荤嚎鍔犲己鍔�10鍒嗛挓 + return True, False, f"銆恵block}銆戯細寮哄娍涓荤嚎+寮哄娍10鍒嗛挓", is_strong_block - open_limit_up_codes = kpl_block_util.get_shsz_open_limit_up_codes(code, block, limit_up_record_datas, - code_limit_up_reason_dict) - if open_limit_up_codes: - # 涓绘澘寮�1 - if current_shsz_rank < len(open_limit_up_codes) + 1 and record_shsz_rank < len(open_limit_up_codes) + 2: - # 灞炰簬榫�1,榫�2 - return True, f"{tool.get_now_time_str()} {block}锛歵op10娑ㄥ仠鏉垮潡锛屼富鏉垮紑1({open_limit_up_codes}),灞炰簬涓绘澘鍓嶉緳{len(open_limit_up_codes) + 1}(瀹炴椂韬綅-{current_shsz_rank}/{len(current_limit_up_datas)})" - else: - if record_shsz_rank >= len(open_limit_up_codes) + 1: - cls.__remove_from_l2(code, f"{code}鏍规嵁韬綅绂佹涔板叆锛氥�恵block}銆戝巻鍙茶韩浣峽record_shsz_rank}") - return False, f"鏉垮潡-{block}: top4娑ㄥ仠鏉垮潡锛屼富鏉垮紑1锛坽open_limit_up_codes}锛�,涓嶄负涓绘澘鍓嶉緳{len(open_limit_up_codes) + 1}锛堝疄鏃惰韩浣�-{current_shsz_rank},鍘嗗彶韬綅-{record_shsz_rank}锛�" + if current_shsz_rank < len(current_open_limit_up_codes) + max_rank: + return True, False, f"銆恵block}銆戝墠鎺掍唬鐮侊細{current_shsz_rank}", is_strong_block else: - if current_shsz_rank == 0 and record_shsz_rank < 2: - return True, f"{tool.get_now_time_str()} {block}锛歵op4娑ㄥ仠鏉垮潡锛岄潪涓绘澘寮�1锛屽睘浜庨緳1锛屽疄鏃舵定鍋滃垪琛ㄦ暟閲�({len(current_limit_up_datas)})" - else: - if record_shsz_rank >= 2: - cls.__remove_from_l2(code, f"{code}鏍规嵁韬綅绂佹涔板叆锛氥�恵block}銆戝巻鍙茶韩浣峽record_shsz_rank}") + # k_format = code_nature_analyse.CodeNatureRecordManager().get_k_format_cache(code) + # if k_format and k_format[8][0]: + # # 鍏锋湁杈ㄨ瘑搴� + # return True, False, f"銆恵block}銆戝叿鏈夎鲸璇嗗害", is_strong_block + # 鐪嬭嚜鐢辨祦閫氬競鍊兼槸鍚﹀皬浜�20浜� + if is_strong_block and current_shsz_rank < len(current_open_limit_up_codes) + max_rank + 1: + zyltgb_as_yi = round(global_util.zyltgb_map.get(code) / 100000000, 2) if code in global_util.zyltgb_map else None + situation = MarketSituationManager().get_situation_cache() + zylt_threshold_as_yi = buy_condition_util.get_zyltgb_threshold(situation) + if zyltgb_as_yi and zylt_threshold_as_yi[2] <= zyltgb_as_yi <= zylt_threshold_as_yi[3]: + return True, False, f"銆恵block}銆戝己鍔挎澘鍧� 鑷敱娴侀�氬競鍊�({zyltgb_as_yi})澶т簬{zylt_threshold_as_yi[2]}浜� 灏忎簬{zylt_threshold_as_yi[3]}浜�", is_strong_block + return False, False, f"銆恵block}銆戝墠鎺掍唬鐮侊細{front_current_shsz_rank_codes} 瓒呰繃{len(current_open_limit_up_codes) + max_rank}涓�", is_strong_block - return False, f"鏉垮潡-{block}: top4娑ㄥ仠鏉垮潡锛岄潪涓绘澘寮�1,涓嶄负涓绘澘榫�1锛堝疄鏃惰韩浣�-{current_shsz_rank},鍘嗗彶韬綅-{record_shsz_rank}锛�" + # 杩囨椂鐨勪唬鐮� + # if open_limit_up_codes: + # # 涓绘澘寮�1 + # if current_shsz_rank < len(open_limit_up_codes) + 1 and record_shsz_rank < len(open_limit_up_codes) + 2: + # # 灞炰簬榫�1,榫�2 + # return True, f"{tool.get_now_time_str()} {block}锛歵op10娑ㄥ仠鏉垮潡锛屼富鏉垮紑1({open_limit_up_codes}),灞炰簬涓绘澘鍓嶉緳{len(open_limit_up_codes) + 1}(瀹炴椂韬綅-{current_shsz_rank}:{front_current_shsz_rank_codes}/{len(current_limit_up_datas)})" + # else: + # if record_shsz_rank >= len(open_limit_up_codes) + 1: + # cls.__remove_from_l2(code, f"{code}鏍规嵁韬綅绂佹涔板叆锛氥�恵block}銆戝巻鍙茶韩浣峽record_shsz_rank}") + # return False, f"鏉垮潡-{block}: top4娑ㄥ仠鏉垮潡锛屼富鏉垮紑1锛坽open_limit_up_codes}锛�,涓嶄负涓绘澘鍓嶉緳{len(open_limit_up_codes) + 1}锛堝疄鏃惰韩浣�-{current_shsz_rank}:{front_current_shsz_rank_codes},鍘嗗彶韬綅-{record_shsz_rank}锛�" + # else: + # if current_shsz_rank == 0 and record_shsz_rank < 2: + # return True, f"{tool.get_now_time_str()} {block}锛歵op4娑ㄥ仠鏉垮潡锛岄潪涓绘澘寮�1锛屽睘浜庨緳1锛屽疄鏃舵定鍋滃垪琛ㄦ暟閲�({len(current_limit_up_datas)})" + # else: + # if record_shsz_rank >= 2: + # cls.__remove_from_l2(code, f"{code}鏍规嵁韬綅绂佹涔板叆锛氥�恵block}銆戝巻鍙茶韩浣峽record_shsz_rank}") + # + # return False, f"鏉垮潡-{block}: top4娑ㄥ仠鏉垮潡锛岄潪涓绘澘寮�1,涓嶄负涓绘澘榫�1锛堝疄鏃惰韩浣�-{current_shsz_rank}:{front_current_shsz_rank_codes},鍘嗗彶韬綅-{record_shsz_rank}锛�" # 鑾峰彇鍙互涔扮殑鏉垮潡 # current_limit_up_datas: 浠婃棩瀹炴椂娑ㄥ仠 @@ -477,24 +619,30 @@ # limit_up_record_datas锛氫粖鏃ュ巻鍙叉定鍋� # yesterday_current_limit_up_codes 锛� 鏄ㄦ棩娑ㄥ仠浠g爜 # before_blocks_dict锛氬巻鍙叉定鍋滃師鍥� + # 杩斿洖鏉垮潡鐨勮绠楃粨鏋淸(鏉垮潡鍚嶇О,鏄惁鍙拱,鏄惁鏄嫭鑻�,淇℃伅)] + @classmethod def get_can_buy_block(cls, code, current_limit_up_datas, limit_up_record_datas, yesterday_current_limit_up_codes, - before_blocks_dict): + before_blocks_dict, current_limit_up_block_codes_dict, high_level_general_code_blocks, + high_level_general_block_codes): # 鍔犺浇娑ㄥ仠浠g爜鐨勭洰鏍囨澘鍧� def load_code_block(): - for d in limit_up_record_datas: - if d[2] in constant.KPL_INVALID_BLOCKS and d[3] in before_blocks_dict: - code_limit_up_reason_dict[d[3]] = list(before_blocks_dict.get(d[3]))[0] - else: - code_limit_up_reason_dict[d[3]] = d[2] - return code_limit_up_reason_dict + if limit_up_record_datas: + for d in limit_up_record_datas: + if d[2] in constant.KPL_INVALID_BLOCKS and d[3] in before_blocks_dict: + code_limit_up_reasons_dict[d[3]] = {list(before_blocks_dict.get(d[3]))[0]} + else: + code_limit_up_reasons_dict[d[3]] = {d[2]} + if d[6]: + code_limit_up_reasons_dict[d[3]] |= set(d[6].split("銆�")) + return code_limit_up_reasons_dict if current_limit_up_datas is None: current_limit_up_datas = [] # 鑾峰彇鐩爣浠g爜鏉垮潡 keys, k1, k11, k2, k3, k4 = cls.__TargetCodePlateKeyManager.get_plate_keys(code) - log.logger_kpl_debug.info("{}鍏抽敭璇嶏細浠婃棩-{},浠婃棩鍘嗗彶-{},鍘嗗彶-{},浜岀骇琛屼笟-{},浠g爜鏉垮潡-{}", code, k1, k11, k2, k3, k4) + # log.logger_kpl_debug.info("{}鍏抽敭璇嶏細浠婃棩-{},浠婃棩鍘嗗彶-{},鍘嗗彶-{},浜岀骇琛屼笟-{},浠g爜鏉垮潡-{}", code, k1, k11, k2, k3, k4) keys = set() if k1: for k in k1: @@ -504,73 +652,79 @@ if True: # 鑾峰彇 if k4: + # 褰撴定鍋滃師鍥犳病鏈夋椂鎵嶅彇绮鹃�夋澘鍧� keys |= k4 keys = keys - constant.KPL_INVALID_BLOCKS - log.logger_kpl_debug.info("{}鏈�缁堝叧閿瘝锛歿}", code, keys) + # log.logger_kpl_debug.info("{}鏈�缁堝叧閿瘝锛歿}", code, keys) # 娑ㄥ仠鍒楄〃涓尮閰嶅叧閿瘝锛岃繑鍥烇紙鏉垮潡:浠g爜闆嗗悎锛夛紝浠g爜闆嗗悎涓凡缁忔帓闄よ嚜韬� + + fresults = [] if not keys: - return None, "灏氭湭鎵惧埌娑ㄥ仠鍘熷洜" - code_limit_up_reason_dict = {} + return fresults, set() + code_limit_up_reasons_dict = {} load_code_block() - msg_list = [] - - can_buy_blocks = [] for block in keys: - - can_buy, msg = cls.__is_block_can_buy(code, block, current_limit_up_datas, code_limit_up_reason_dict, - yesterday_current_limit_up_codes, limit_up_record_datas) - if can_buy: - can_buy_blocks.append((block, msg)) - else: - msg_list.append(msg) - if len(can_buy_blocks) == len(keys): - blocks = [x[0] for x in can_buy_blocks] - blocks_msg = "\n".join([x[1] for x in can_buy_blocks]) - return blocks, blocks_msg - - return None, "\n".join(msg_list) + can_buy, unique, msg, is_strong = cls.__is_block_can_buy(code, block, current_limit_up_datas, + code_limit_up_reasons_dict, + yesterday_current_limit_up_codes, + limit_up_record_datas, + current_limit_up_block_codes_dict, + high_level_code_blocks=high_level_general_code_blocks, + high_level_block_codes=high_level_general_block_codes) + fresults.append((block, can_buy, unique, msg, is_strong)) + return fresults, keys # 鏄惁鍙互涓嬪崟 - # 杩斿洖锛氭槸鍚﹀彲浠ヤ笅鍗�,娑堟伅,鏉垮潡绫诲瀷 + # 杩斿洖锛氬彲浠ヤ拱鐨勬澘鍧�,鏄惁鐙嫍,娑堟伅 @classmethod def can_buy(cls, code): if constant.TEST: - return True, cls.BLOCK_TYPE_NONE + return ["娴嬭瘯"], True, cls.BLOCK_TYPE_NONE, [], set() # if True: # # 娴嬭瘯 # return True, "涓嶅垽鏂澘鍧楄韩浣�" return cls.__can_buy_compute_result_dict.get(code) + # 杩斿洖:(鍙互涔扮殑鏉垮潡鍒楄〃, 鏄惁鏄嫭鑻�, 娑堟伅绠�浠�,鍙拱鐨勫己鍔夸富绾�) @classmethod def __compute_can_buy_blocks(cls, code, current_limit_up_datas, limit_up_record_datas, - yesterday_current_limit_up_codes, before_blocks_dict): - - blocks, block_msg = cls.get_can_buy_block(code, current_limit_up_datas, - limit_up_record_datas, yesterday_current_limit_up_codes, - before_blocks_dict) - if not blocks: - return False, block_msg - log.logger_kpl_debug.info(f"{code}:鑾峰彇濮旀墭/涔板叆浠g爜") + yesterday_current_limit_up_codes, before_blocks_dict, + current_limit_up_block_codes_dict, high_level_general_code_blocks): + # 鏍规嵁浠g爜娉涘寲鏉垮潡鑾峰彇娉涘寲鏉垮潡鐨勪唬鐮侀泦鍚� + high_level_general_block_codes = {} + for c in high_level_general_code_blocks: + blocks = high_level_general_code_blocks[c] + for b in blocks: + if b not in high_level_general_block_codes: + high_level_general_block_codes[b] = set() + high_level_general_block_codes[b].add(c) + blocks_compute_results, keys = cls.get_can_buy_block(code, current_limit_up_datas, + limit_up_record_datas, yesterday_current_limit_up_codes, + before_blocks_dict, current_limit_up_block_codes_dict, + high_level_general_code_blocks, + high_level_general_block_codes) + if not blocks_compute_results: + return False, True, f"娌℃湁鎵惧埌鏉垮潡", [], keys codes_delegate = set(cls.__CodesTradeStateManager.get_codes_by_trade_states_cache( {trade_manager.TRADE_STATE_BUY_DELEGATED, trade_manager.TRADE_STATE_BUY_PLACE_ORDER})) codes_success = set(cls.__CodesTradeStateManager.get_codes_by_trade_states_cache( {trade_manager.TRADE_STATE_BUY_SUCCESS})) - codes = codes_delegate | codes_success - # 缁熻鎴愪氦浠g爜鐨勬澘鍧� trade_codes_blocks_dict = {} # 宸茬粡鎴愪氦鐨勬澘鍧� trade_success_blocks_count = {} - log.logger_kpl_debug.info(f"{code}:鑾峰彇浠g爜鏉垮潡") + trade_delegate_blocks_count = {} for c in codes: keys_, k1_, k11_, k2_, k3_, k4_ = cls.__TargetCodePlateKeyManager.get_plate_keys(c) - # 瀹炴椂娑ㄥ仠鍘熷洜 - trade_codes_blocks_dict[c] = k1_ | k4_ + # 瀹炴椂娑ㄥ仠鍘熷洜 + 鎺ㄨ崘鍘熷洜 + if not k1_: + trade_codes_blocks_dict[c] = k4_ + else: + trade_codes_blocks_dict[c] = k1_ # 缁熻鏉垮潡涓殑浠g爜 - log.logger_kpl_debug.info(f"{code}:缁熻鏉垮潡涓殑浠g爜") trade_block_codes_dict = {} for c in trade_codes_blocks_dict: for b in trade_codes_blocks_dict[c]: @@ -578,72 +732,93 @@ if b not in trade_success_blocks_count: trade_success_blocks_count[b] = set() trade_success_blocks_count[b].add(c) + if c in codes_delegate: + if b not in trade_delegate_blocks_count: + trade_delegate_blocks_count[b] = set() + trade_delegate_blocks_count[b].add(c) + if b not in trade_block_codes_dict: trade_block_codes_dict[b] = set() trade_block_codes_dict[b].add(c) # ---------------------------------鍔犺浇宸茬粡涓嬪崟/鎴愪氦鐨勪唬鐮佷俊鎭�------------end------------- - log.logger_kpl_debug.info(f"{code}:寮�濮嬭绠楁槸鍚﹀彲浠ヤ拱") - msg_list = [] - for key in blocks: - # 鏉垮潡涓凡缁忔湁鎴愪氦鐨勫氨涓嶄笅鍗曚簡 - if key in trade_success_blocks_count: - success_codes_count = len(trade_success_blocks_count[key]) - if success_codes_count >= 1: - msg_list.append(f"銆恵key}銆戜腑宸茬粡鏈墈success_codes_count}涓垚浜や唬鐮�") - log.logger_kpl_debug.debug(f"{code}锛氭澘鍧楋紙{key}锛夊凡缁忔湁鎴愪氦銆恵trade_success_blocks_count[key]}銆�") - continue - return True, block_msg - return False, ",".join(msg_list) + # + can_buy_blocks = [] + can_buy_strong_blocks = [] + unique_count = 0 + msg_list = [] + + for r in blocks_compute_results: + # r鐨勬暟鎹粨鏋�(鏉垮潡,鏄惁鍙互涔�,鏄惁鐙嫍,娑堟伅,鏄惁鏄己鍔挎澘鍧�) + if r[2]: + # 鐙嫍 + unique_count += 1 + if r[1]: + # 寮哄娍涓荤嚎鏈�澶氬悓鏃舵寕3鍙エ锛屾渶澶氭垚浜�2鍙エ + MAX_DELEGATE_COUNT = 3 if r[4] else 2 + MAX_DEAL_COUNT = 2 if r[4] else 1 + if r[0] in trade_success_blocks_count and len(trade_success_blocks_count[r[0]]) >= MAX_DEAL_COUNT: + msg_list.append(f"銆恵r[0]}銆戞湁鎴愪氦浠g爜锛歿trade_success_blocks_count[r[0]]}") + continue + if r[0] in trade_delegate_blocks_count and len(trade_delegate_blocks_count[r[0]]) >= MAX_DELEGATE_COUNT: + msg_list.append(f"銆恵r[0]}銆戝凡鎸傚崟锛歿trade_delegate_blocks_count[r[0]]}") + continue + can_buy_blocks.append(r[0]) + if r[4]: + can_buy_strong_blocks.append(r[0]) + if r[3]: + msg_list.append(r[3]) + else: + if r[3]: + msg_list.append(r[3]) + # 鎵�鏈夋澘鍧楅兘鏄嫭鑻� + if unique_count == len(blocks_compute_results): + return can_buy_blocks, True, ",".join(msg_list), can_buy_strong_blocks, keys + return can_buy_blocks, False, ",".join(msg_list), can_buy_strong_blocks, keys # 鏇存柊浠g爜鏉垮潡鍒ゆ柇鏄惁鍙互涔扮殑缁撴灉 + # high_level_general_code_blocks 楂樹綅娉涘寲鏉垮潡 @classmethod def update_can_buy_blocks(cls, code, current_limit_up_datas, limit_up_record_datas, - yesterday_current_limit_up_codes, - before_blocks_dict): - can_buy, msg = cls.__compute_can_buy_blocks(code, current_limit_up_datas, limit_up_record_datas, - yesterday_current_limit_up_codes, - before_blocks_dict) + latest_current_limit_up_records, + before_blocks_dict, current_limit_up_block_codes_dict): + yesterday_current_limit_up_codes = set() + yesterday_current_limit_up_records_dict = {} + yesterday_current_limit_up_records = latest_current_limit_up_records[0][1] + if yesterday_current_limit_up_records: + for r in yesterday_current_limit_up_records: + yesterday_current_limit_up_codes.add(r[0]) + yesterday_current_limit_up_records_dict[r[0]] = r + high_level_general_code_blocks = {} + # 鏄惁鏄�3鏉垮強浠ヤ笂鐨勯珮浣嶆澘 + for r in current_limit_up_datas: + count = kpl_util.get_high_level_count(r[4]) + if count >= 3 and r[0] in yesterday_current_limit_up_codes: + latest_datas = latest_current_limit_up_records[:count - 1] + # 鏄珮浣嶆澘 + # 褰撴棩绮鹃�� + blocks = set(r[6].split("銆�")) + for d in latest_datas: + for dd in d[1]: + if dd[0] == r[0]: + blocks.add(dd[5]) + break + f_blocks = [] + for b in blocks: + if b: + f_blocks.append(b) + high_level_general_code_blocks[r[0]] = f_blocks + + can_buy_blocks, unique, msg, can_buy_strong_blocks, keys = cls.__compute_can_buy_blocks(code, + current_limit_up_datas, + limit_up_record_datas, + yesterday_current_limit_up_codes, + before_blocks_dict, + current_limit_up_block_codes_dict, + high_level_general_code_blocks) # 淇濆瓨鏉垮潡璁$畻缁撴灉 - cls.__can_buy_compute_result_dict[code] = (can_buy, msg) - - # 鍒ゆ柇鏄惁涓虹湡鑰佸ぇ - @classmethod - def __is_real_first_limit_up(cls, code, block, current_limit_up_datas, limit_up_record_datas, - yesterday_current_limit_up_codes, - before_blocks_dict): - # 鍔犺浇娑ㄥ仠浠g爜鐨勭洰鏍囨澘鍧� - def load_code_block(): - if limit_up_record_datas: - for d in limit_up_record_datas: - if d[2] in constant.KPL_INVALID_BLOCKS and d[3] in before_blocks_dict: - code_limit_up_reason_dict[d[3]] = list(before_blocks_dict.get(d[3]))[0] - else: - code_limit_up_reason_dict[d[3]] = d[2] - return code_limit_up_reason_dict - - if current_limit_up_datas is None: - current_limit_up_datas = [] - if limit_up_record_datas is None: - limit_up_record_datas = [] - code_limit_up_reason_dict = {} - load_code_block() - can_buy, msg = cls.__is_block_can_buy(code, block, current_limit_up_datas, code_limit_up_reason_dict, - yesterday_current_limit_up_codes, limit_up_record_datas) - return can_buy, msg - - @classmethod - def is_need_cancel(cls, code, limit_up_reason, current_limit_up_datas, limit_up_record_datas, - yesterday_current_limit_up_codes, - before_blocks_dict): - can_buy, msg = cls.__is_real_first_limit_up(code, limit_up_reason, current_limit_up_datas, - limit_up_record_datas, - yesterday_current_limit_up_codes, - before_blocks_dict) - if not can_buy: - logger_kpl_block_can_buy.warning(f"{code} 鏍规嵁娑ㄥ仠鍘熷洜锛坽limit_up_reason}锛夊尮閰嶄笉鑳戒拱") - return not can_buy + cls.__can_buy_compute_result_dict[code] = (can_buy_blocks, unique, msg, can_buy_strong_blocks, keys) if __name__ == "__main__": -- Gitblit v1.8.0