From 49f952cfa1dbc5bedaa8a2e136a662bae50aecc1 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期三, 29 十一月 2023 11:14:38 +0800 Subject: [PATCH] bug修改 --- third_data/code_plate_key_manager.py | 347 ++++++++++++++++++++++++++++++++------------------------- 1 files changed, 194 insertions(+), 153 deletions(-) diff --git a/third_data/code_plate_key_manager.py b/third_data/code_plate_key_manager.py index 774ff1a..51af9d3 100644 --- a/third_data/code_plate_key_manager.py +++ b/third_data/code_plate_key_manager.py @@ -3,10 +3,11 @@ """ # 娑ㄥ仠浠g爜鍏抽敭璇嶆澘鍧楃鐞� +import copy import json +import time import constant -from code_attribute.code_nature_analyse import HighIncreaseCodeManager from db.redis_manager_delegate import RedisUtils from third_data import kpl_block_util, kpl_api from utils import global_util, tool @@ -36,19 +37,28 @@ 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, by=False): + if not blocks: return + final_blocks = copy.deepcopy(blocks) if len(blocks) > 2: - blocks = blocks[:2] + final_blocks.clear() + # 鏍规嵁娑ㄥ箙鎺掑簭 + blocks.sort(key=lambda x: x[2]) + blocks.reverse() + for b in blocks: + if b[2] > 0 and b[1] not in constant.KPL_INVALID_BLOCKS: + final_blocks.append(b) + if len(final_blocks) < 2: + final_blocks = blocks # 淇濆瓨鍓�2鏉℃暟鎹� if by: - RedisUtils.setex_async(self.__db, 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_async(self.__db, 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): @@ -81,22 +91,47 @@ # 浠庣綉缁滀笂鍔犺浇绮鹃�夋澘鍧� def load_jx_blocks(self, 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: - if not self.get_jx_blocks_cache(code): - blocks = kpl_api.getCodeJingXuanBlocks(code) - self.save_jx_blocks(code, 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.getCodeJingXuanBlocks(code) - self.save_jx_blocks(code, blocks, by=True) - async_log_util.info(logger_kpl_block_can_buy, f"{code}:鑾峰彇鍒扮簿閫夋澘鍧�(澶囩敤)-{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.getCodeJingXuanBlocks(code) + self.save_jx_blocks(code, 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 or True: + # 闈炴定鍋滅姸鎬� + 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.getCodeJingXuanBlocks(code) + self.save_jx_blocks(code, 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.getCodeJingXuanBlocks(code) + self.save_jx_blocks(code, 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) # 寮�鐩樺暒绂佹浜ゆ槗鏉垮潡绠$悊 @@ -411,11 +446,11 @@ 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] + 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([x[1] for x in jingxuan_blocks]) for k in [k1, k11, k2, k3, k4]: keys |= k @@ -455,60 +490,89 @@ 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)})") + yesterday_current_limit_up_codes, limit_up_record_datas, current_limit_up_block_codes_dict): - # 闇�瑕佹帓闄ょ殑鑰佸ぇ鐨勪唬鐮� - exclude_first_codes = HighIncreaseCodeManager().list_all() - - # 鑾峰彇涓绘澘寮�1鐨勪唬鐮� + # 鐙嫍鍒ゆ柇 + block_codes = current_limit_up_block_codes_dict.get(block) + if not block_codes: + return False, True, "" + elif len(block_codes) == 1 and code in block_codes: + return False, True, "" + # 鍙互涔扮殑鏈�澶ф帓鍚� 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) + + max_rank = 2 + # 濡傛灉鏄己鍔挎澘鍧楋紙鏈�1涓紑1/鏈夐潪涓绘澘娑ㄥ仠/鏈夐珮浣嶆澘锛夊彲浠ヤ拱鍒拌�佷笁 + msg_list = [] + for bc in block_codes: + if bc in current_open_limit_up_codes: + max_rank = 3 + msg_list.append(f"{bc}寮�1") + break + elif bc in yesterday_current_limit_up_codes: + max_rank = 3 + msg_list.append(f"{bc}楂樹綅鏉�") + break + elif bc.find("00") != 0 and bc.find("60") != 0: + max_rank = 3 + msg_list.append(f"{bc}鍒涗笟鏉�/绉戝垱鏉�") + break + + # 鍒ゆ柇韬綅 + + # 闇�瑕佹帓闄ょ殑鑰佸ぇ鐨勪唬鐮� + exclude_first_codes = set() # HighIncreaseCodeManager().list_all() + + # 鑾峰彇涓绘澘寮�1鐨勪唬鐮� + # 鍓旈櫎楂樹綅鏉� if open_limit_up_codes and yesterday_current_limit_up_codes: open_limit_up_codes -= yesterday_current_limit_up_codes - # 鑾峰彇涓绘澘瀹炴椂韬綅,鍓旈櫎楂樹綅鏉� - current_shsz_rank, front_current_shsz_rank_codes = kpl_block_util.get_code_current_rank(code, block, - current_limit_up_datas, - code_limit_up_reason_dict, - yesterday_current_limit_up_codes, - exclude_first_codes, - len(open_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_reason_dict, + # yesterday_current_limit_up_codes, + # exclude_first_codes, + # len( + # open_limit_up_codes), + # shsz=True) 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 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}锛�" + if record_shsz_rank < len(open_limit_up_codes) + max_rank: + return True, False, f"銆恵block}銆戝墠鎺掍唬鐮侊細{record_shsz_rank_codes}" 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 True, False, f"銆恵block}銆戝墠鎺掍唬鐮侊細{record_shsz_rank_codes} 瓒呰繃{len(open_limit_up_codes) + max_rank}涓�" - return False, f"鏉垮潡-{block}: top4娑ㄥ仠鏉垮潡锛岄潪涓绘澘寮�1,涓嶄负涓绘澘榫�1锛堝疄鏃惰韩浣�-{current_shsz_rank}:{front_current_shsz_rank_codes},鍘嗗彶韬綅-{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: 浠婃棩瀹炴椂娑ㄥ仠 @@ -516,16 +580,19 @@ # 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): # 鍔犺浇娑ㄥ仠浠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] + 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: @@ -549,63 +616,58 @@ # log.logger_kpl_debug.info("{}鏈�缁堝叧閿瘝锛歿}", code, keys) # 娑ㄥ仠鍒楄〃涓尮閰嶅叧閿瘝锛岃繑鍥烇紙鏉垮潡:浠g爜闆嗗悎锛夛紝浠g爜闆嗗悎涓凡缁忔帓闄よ嚜韬� + + fresults = [] if not keys: - return None, "灏氭湭鎵惧埌娑ㄥ仠鍘熷洜" + return fresults code_limit_up_reason_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 = 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, + current_limit_up_block_codes_dict) + fresults.append((block, can_buy, unique, msg)) + return fresults # 鏄惁鍙互涓嬪崟 # 杩斿洖锛氭槸鍚﹀彲浠ヤ笅鍗�,娑堟伅,鏉垮潡绫诲瀷 @classmethod def can_buy(cls, code): if constant.TEST: - return True, cls.BLOCK_TYPE_NONE + return ["娴嬭瘯"], True, cls.BLOCK_TYPE_NONE # 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 + yesterday_current_limit_up_codes, before_blocks_dict, + current_limit_up_block_codes_dict): + blocks_compute_results = 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) + if not blocks_compute_results: + return False, True, "娌℃湁鎵惧埌鏉垮潡" 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 = {} + 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爜 trade_block_codes_dict = {} for c in trade_codes_blocks_dict: @@ -614,71 +676,50 @@ 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------------- - 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 = [] + unique_count = 0 + msg_list = [] + for r in blocks_compute_results: + # r鐨勬暟鎹粨鏋�(鏉垮潡,鏄惁鍙互涔�,鏄惁鐙嫍,娑堟伅) + if r[2]: + unique_count += 1 + if r[1]: + if r[0] in trade_success_blocks_count and len(trade_success_blocks_count[r[0]]) > 0: + 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]]) >= 2: + msg_list.append(f"銆恵r[0]}銆戝凡鎸傚崟锛歿trade_delegate_blocks_count[r[0]]}") + continue + can_buy_blocks.append(r[0]) + msg_list.append(r[3]) + # 鎵�鏈夋澘鍧楅兘鏄嫭鑻� + if unique_count == len(blocks_compute_results): + return can_buy_blocks, True, ",".join(msg_list) + return can_buy_blocks, False, ",".join(msg_list) # 鏇存柊浠g爜鏉垮潡鍒ゆ柇鏄惁鍙互涔扮殑缁撴灉 @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) + before_blocks_dict, current_limit_up_block_codes_dict): + can_buy_blocks, unique, msg = 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) # 淇濆瓨鏉垮潡璁$畻缁撴灉 - 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) if __name__ == "__main__": -- Gitblit v1.8.0