From 06df6025404f0aa1cae1bff229c00bb09db0a861 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期一, 27 十一月 2023 16:42:56 +0800 Subject: [PATCH] 新版选票机制实行 --- third_data/code_plate_key_manager.py | 244 ++++++++++++++++++++++++------------------------ 1 files changed, 124 insertions(+), 120 deletions(-) diff --git a/third_data/code_plate_key_manager.py b/third_data/code_plate_key_manager.py index 5eea3db..7fe0f9d 100644 --- a/third_data/code_plate_key_manager.py +++ b/third_data/code_plate_key_manager.py @@ -6,7 +6,6 @@ import json 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 @@ -455,60 +454,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,9 +544,11 @@ # 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(): if limit_up_record_datas: @@ -550,63 +580,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: @@ -615,71 +640,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