From 7ca9e90febd61dbcc5357349294affe95ea04105 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期五, 30 八月 2024 00:34:33 +0800 Subject: [PATCH] 激进买入完善 --- third_data/code_plate_key_manager.py | 226 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 211 insertions(+), 15 deletions(-) diff --git a/third_data/code_plate_key_manager.py b/third_data/code_plate_key_manager.py index 4f0be3a..c3224b3 100644 --- a/third_data/code_plate_key_manager.py +++ b/third_data/code_plate_key_manager.py @@ -14,6 +14,7 @@ from settings.trade_setting import MarketSituationManager from third_data.history_k_data_manager import HistoryKDataManager from third_data.history_k_data_util import HistoryKDatasUtils +from third_data.kpl_data_constant import LimitUpDataConstant from utils import global_util, tool, buy_condition_util, init_data_util from log_module import log, async_log_util from db import redis_manager_delegate as redis_manager @@ -1050,6 +1051,13 @@ cls.__can_buy_compute_result_dict[code] = ( can_buy_blocks, unique, msg, can_buy_strong_blocks, keys, active_buy_blocks) + +class RadicalBuyBlockManager: + """ + 婵�杩涗拱鏉垮潡绠$悊 + """ + __TargetCodePlateKeyManager = TargetCodePlateKeyManager() + @classmethod def compute_open_limit_up_code_dict_for_radical_buy(cls, current_limit_up_datas): """ @@ -1057,9 +1065,7 @@ @param current_limit_up_datas: @return: """ - timestamp_start = time.mktime( - time.strptime(datetime.datetime.now().strftime("%Y-%m-%d") + " 09:25:00", '%Y-%m-%d %H:%M:%S')) - timestamp_end = time.mktime(time.strptime(datetime.datetime.now().strftime("%Y-%m-%d") + " 09:30:00", '%Y-%m-%d %H:%M:%S')) + timestamp_start, timestamp_end = kpl_block_util.open_limit_up_time_range temp_dict = {} for d in current_limit_up_datas: code = d[0] @@ -1067,36 +1073,226 @@ # 璁$畻鏄惁寮�1 if int(d[2]) >= timestamp_end or int(d[2]) < timestamp_start: continue - # 鍓旈櫎5鏉夸互涓婄殑 - if d[4].find("杩炴澘") > 0 and int(d[4].replace("杩炴澘", "")) >= 5: - continue buy1_money = huaxin_l1_data_manager.get_buy1_money(code) - if not buy1_money or buy1_money < 1e8: + # 涔�1鏄惁澶т簬5000w + if not buy1_money or buy1_money < 5e7: continue if not tool.is_can_buy_code(code): continue - # 涔�1鏄惁澶т簬1浜� blocks = {d[5]} if d[6]: blocks |= set(d[6].split("銆�")) blocks -= constant.KPL_INVALID_BLOCKS - temp_dict[code] = (kpl_util.get_high_level_count(d[4]), d[6]) + temp_dict[code] = (kpl_util.get_high_level_count(d[4]), blocks) kpl_data_constant.open_limit_up_code_dict_for_radical_buy = temp_dict @classmethod - def is_radical_buy(cls, code): + def __get_current_index(cls, code, block, yesterday_limit_up_codes): + """ + 鑾峰彇褰撳墠娑ㄥ仠韬綅 + @param code: + @param block: + @param yesterday_limit_up_codes: + @return: 绱㈠紩,鍓嶆帓浠g爜淇℃伅锛圼(浠g爜, 娑ㄥ仠鏃堕棿)]锛� + """ + current_index = 0 + block_codes_infos = [] + timestamp_start, timestamp_end = kpl_block_util.open_limit_up_time_range + limit_up_time = time.time() + for k in LimitUpDataConstant.current_limit_up_datas: + _code = k[0] + blocks = LimitUpDataConstant.get_blocks_with_history(_code) + if not blocks: + blocks = set() + if _code == code: + # 鑾峰彇褰撳墠浠g爜娑ㄥ仠鏃堕棿 + limit_up_time = int(k[2]) + continue + # 涓嶆槸杩欎釜鏉垮潡 + if block not in blocks: + continue + if not tool.is_can_buy_code(_code): + continue + # 鍓旈櫎寮�1鐨勬暟鎹� + if timestamp_start <= int(k[2]) < timestamp_end: + continue + # 鍓旈櫎楂樹綅鏉� + if _code in yesterday_limit_up_codes: + continue + # 浠g爜.娑ㄥ仠鏃堕棿 + block_codes_infos.append((_code, int(k[2]))) + block_codes_infos.append((code, limit_up_time)) + block_codes_infos.sort(key=lambda x: x[1]) + before_codes_info = [] + for i in range(0, len(block_codes_infos)): + if block_codes_infos[i][0] == code: + current_index = i + break + else: + before_codes_info.append(block_codes_infos[i]) + + return current_index, before_codes_info + + @classmethod + def __get_history_index(cls, code, block, yesterday_limit_up_codes): + """ + 鑾峰彇鍘嗗彶娑ㄥ仠韬綅 + @param code: + @param block: + @param current_limit_up_datas: + @return: + """ + history_index = 0 + block_codes_infos = [] + timestamp_start, timestamp_end = kpl_block_util.open_limit_up_time_range + limit_up_time = time.time() + for k in LimitUpDataConstant.history_limit_up_datas: + _code = k[3] + blocks = LimitUpDataConstant.get_blocks_with_history(_code) + if _code == code: + # 鑾峰彇褰撳墠浠g爜娑ㄥ仠鏃堕棿 + limit_up_time = int(k[5]) + continue + # 涓嶆槸杩欎釜鏉垮潡 + if block not in blocks: + continue + if not tool.is_can_buy_code(_code): + continue + # 鍓旈櫎寮�1鐨勬暟鎹� + if timestamp_start <= int(k[5]) < timestamp_end: + continue + # 鍓旈櫎楂樹綅鏉� + if _code in yesterday_limit_up_codes: + continue + # 浠g爜.娑ㄥ仠鏃堕棿 + block_codes_infos.append((_code, int(k[5]))) + block_codes_infos.append((code, limit_up_time)) + block_codes_infos.sort(key=lambda x: x[1]) + before_codes_info = [] + for i in range(0, len(block_codes_infos)): + if block_codes_infos[i][0] == code: + history_index = i + break + else: + before_codes_info.append(block_codes_infos[i]) + return history_index, before_codes_info + + @classmethod + def __is_radical_buy_with_open_limitup(cls, code, block, yesterday_limit_up_codes): + """ + 鏄惁闇�瑕佹縺杩涗拱(鏌愪釜鏉垮潡寮�1) + 1.鏈�>=2涓紑1涔拌��2 + 2.鏈�1涓紑1鐨勪拱鑰�3 + @param code: + @param block: + @param yesterday_limit_up_codes 鏄ㄦ棩娑ㄥ仠浠g爜 + @return: + """ + # 10鐐逛箣鍓嶆墠鑳戒拱鍏� + if int(tool.get_now_time_str().replace(":", "")) > 100000: + return False, "瓒呰繃鐢熸晥鏃堕棿" + + # 鏍规嵁鏉垮潡鑱氬悎鏁版嵁 + open_limit_up_block_codes = {} + for c in kpl_data_constant.open_limit_up_code_dict_for_radical_buy: + blocks = kpl_data_constant.open_limit_up_code_dict_for_radical_buy[c][1] + for b in blocks: + if b not in open_limit_up_block_codes: + open_limit_up_block_codes[b] = set() + open_limit_up_block_codes[b].add(c) + if block not in open_limit_up_block_codes: + return False, "鏉垮潡鏈紑1" + + count = len(open_limit_up_block_codes.get(block)) + # ----鑾峰彇鍘嗗彶韬綅---- + history_index, history_before_codes_info = cls.__get_history_index(code, block, yesterday_limit_up_codes) + # ----鑾峰彇瀹炴椂韬綅---- + current_index, current_before_codes_info = cls.__get_current_index(code, block, yesterday_limit_up_codes) + if count >= 2: + # 涔拌��2 + if history_index == 0 and current_index == 0: + return True, f"寮�1鏁伴噺锛歿count}" + else: + return False, f"寮�1鏁伴噺锛歿count}锛岃韩浣嶄笉鍖归厤锛氬巻鍙�-{history_index} 瀹炴椂-{current_index}" + else: + # 涔拌��3 + if history_index == 1 and current_index == 1: + return True, f"寮�1鏁伴噺锛歿count}" + else: + return False, f"寮�1鏁伴噺锛歿count}锛岃韩浣嶄笉鍖归厤锛氬巻鍙�-{history_index} 瀹炴椂-{current_index}" + + @classmethod + def __is_radical_buy_with_block_up(cls, code, block, yesterday_limit_up_codes): + """ + 鏄惁婵�杩涗拱锛堟澘鍧楃獊鐒舵定璧锋潵锛� + 鑰佸ぇ鍜岃�佷簩鐨勬定鍋滄椂闂寸浉宸�5鍒嗛挓鍐� + 鑰佷笁鐨勬定鍋滄椂闂磋窛绂昏�佸ぇ娑ㄥ仠鍦�10鍒嗛挓鍐呭氨涔� + @param code: + @param block: + @param yesterday_limit_up_codes: + @return: + """ + # 鑾峰彇褰撳墠鐨勬澘鍧� + current_index, current_before_codes_info = cls.__get_current_index(code, block, set()) + if current_index != 2: + return False, f"鍙兘涔拌��3锛屽綋鍓嶈韩浣�-{current_index + 1}" + history_index, history_before_codes_info = cls.__get_history_index(code, block, set()) + if history_index != current_index or len(current_before_codes_info) != len(history_before_codes_info): + return False, f"鍓嶆帓浠g爜鏈夌偢鏉�" + if len(current_before_codes_info) < 2: + return False, f"鍓嶆帓浠g爜灏忎簬2涓�" + # 鑰佸ぇ锛岃�佷簩蹇呴』鐩搁殧5鍒嗛挓鍐� + if current_before_codes_info[0][1] >= kpl_block_util.open_limit_up_time_range[1]: + return False, f"鏈夊紑1" + + if current_before_codes_info[1][1] - current_before_codes_info[0][1] < 5 * 60: + # 鑾峰彇褰撳墠浠g爜鐨勬定鍋滄椂闂� + limit_up_timestamp = LimitUpDataConstant.get_first_limit_up_time(code) + if not limit_up_timestamp: + limit_up_timestamp = time.time() + if limit_up_timestamp - current_before_codes_info[0][1] < 10 * 60: + return True, f"鍓嶆帓娑ㄥ仠:{current_before_codes_info}" + return False, "鍓嶆帓娑ㄥ仠鏃堕棿闂撮殧涓嶆弧瓒虫潯浠�" + + @classmethod + def is_radical_buy(cls, code, yesterday_limit_up_codes): """ 鏄惁鏄縺杩涗拱 @param code: - @return: + @return: {婵�杩涗拱鐨勬澘鍧梷, 鍘熷洜 """ - # 鑾峰彇浠婃棩寮�涓�鐨勪唬鐮�,鍓旈櫎5鏉夸互涓婄殑 - current_limit_up_datas = kpl_data_constant.current_limit_up_datas # 璁$畻 - + # 鑾峰彇寮�1鐨勬澘鍧� + open_limit_up_code_dict = kpl_data_constant.open_limit_up_code_dict_for_radical_buy + if not open_limit_up_code_dict: + return False, "娌℃湁棣栨澘寮�1鐨勬暟鎹�" + open_limit_up_blocks = set() + for c in open_limit_up_code_dict: + open_limit_up_blocks |= open_limit_up_code_dict[c][1] # 鑾峰彇浠g爜鐨勬澘鍧� keys_, k1_, k11_, k2_, k3_, k4_ = cls.__TargetCodePlateKeyManager.get_plate_keys(code, contains_today=False) - # 鑾峰彇 + match_blocks = open_limit_up_blocks & keys_ + if not match_blocks: + return False, "娌″尮閰嶅埌寮�1鐨勬澘鍧�" + can_buy_blocks = set() + msges = [] + for b in match_blocks: + # 鍒ゆ柇鏉垮潡鏄惁璇ユ縺杩涗拱 + result = cls.__is_radical_buy_with_open_limitup(code, b, yesterday_limit_up_codes) + if result[0]: + can_buy_blocks.add(b) + msges.append(f"銆恵b}銆�:{result}") + if can_buy_blocks: + return can_buy_blocks, "寮�1婊¤冻鏉′欢锛�" + "锛�".join(msges) + if not can_buy_blocks: + msges.clear() + for b in match_blocks: + # 鏉垮潡蹇�熷惎鍔� + result = cls.__is_radical_buy_with_block_up(code, b, yesterday_limit_up_codes) + if result[0]: + can_buy_blocks.add(b) + msges.append(f"銆恵b}銆�:{result}") + return can_buy_blocks, "寮�1涓嶆弧瓒虫潯浠讹紝鏉垮潡蹇�熷惎鍔細" + "锛�".join(msges) if __name__ == "__main__": -- Gitblit v1.8.0