From a6db14d8bf83be51d61b285a86f16ffe7b4ce5cf Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期四, 12 九月 2024 00:08:14 +0800 Subject: [PATCH] 激进买策略修复 --- third_data/code_plate_key_manager.py | 132 +++++++++++++++++++++++++++++++------------ 1 files changed, 94 insertions(+), 38 deletions(-) diff --git a/third_data/code_plate_key_manager.py b/third_data/code_plate_key_manager.py index 0324401..05c452e 100644 --- a/third_data/code_plate_key_manager.py +++ b/third_data/code_plate_key_manager.py @@ -15,6 +15,7 @@ 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 trade.radical_buy_data_manager import RedicalBuyDataManager 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 @@ -1131,7 +1132,7 @@ kpl_data_constant.open_limit_up_code_dict_for_radical_buy = temp_dict @classmethod - def __get_current_index(cls, code, block, yesterday_limit_up_codes): + def __get_current_index(cls, code, block, yesterday_limit_up_codes, exclude_codes=None): """ 鑾峰彇褰撳墠娑ㄥ仠韬綅 @param code: @@ -1139,12 +1140,16 @@ @param yesterday_limit_up_codes: @return: 绱㈠紩,鍓嶆帓浠g爜淇℃伅锛圼(浠g爜, 娑ㄥ仠鏃堕棿)]锛� """ + if exclude_codes is None: + exclude_codes = set() 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] + if _code in exclude_codes: + continue blocks = LimitUpDataConstant.get_blocks_with_history(_code) if not blocks: blocks = set() @@ -1178,7 +1183,7 @@ return current_index, before_codes_info @classmethod - def __get_history_index(cls, code, block, yesterday_limit_up_codes): + def __get_history_index(cls, code, block, yesterday_limit_up_codes, exclude_codes=None): """ 鑾峰彇鍘嗗彶娑ㄥ仠韬綅 @param code: @@ -1187,13 +1192,18 @@ @param current_limit_up_codes: 鐩墠鐨勬定鍋滀唬鐮� @return: """ + if exclude_codes is None: + exclude_codes = set() history_index = 0 block_codes_infos = [] # 寮�1鏃堕棿鑼冨洿 timestamp_start, timestamp_end = kpl_block_util.open_limit_up_time_range limit_up_time = time.time() + limit_up_space_ge_60s_codes = set() for k in LimitUpDataConstant.history_limit_up_datas: _code = k[3] + if _code in exclude_codes: + continue blocks = LimitUpDataConstant.get_blocks_with_history(_code) if _code == code: # 鑾峰彇褰撳墠浠g爜娑ㄥ仠鏃堕棿 @@ -1210,9 +1220,11 @@ # 鍓旈櫎楂樹綅鏉� if _code in yesterday_limit_up_codes: continue - # 鍓旈櫎鐐告澘浠g爜鎸佺画娑ㄥ仠鏃堕棿灏忎簬1鍒嗛挓鐨勪唬鐮� + # 鍓旈櫎鐐告澘浠g爜鎸佺画娑ㄥ仠鏃堕棿灏忎簬1鍒嗛挓鐨勪唬鐮� 涓� 鍙兘鐢ㄤ簬涓嶆帓闄ゅ墠2鏉℃暟鎹� if _code not in cls.__current_limit_up_codes and _code in cls.__total_limit_up_space_dict and \ - cls.__total_limit_up_space_dict[_code] < 60: + cls.__total_limit_up_space_dict[_code] < 60 and not exclude_codes and len( + limit_up_space_ge_60s_codes) < 3: + limit_up_space_ge_60s_codes.add(_code) continue # 浠g爜,娑ㄥ仠鏃堕棿 block_codes_infos.append((_code, int(k[5]))) @@ -1238,11 +1250,13 @@ @param yesterday_limit_up_codes 鏄ㄦ棩娑ㄥ仠浠g爜 @return: """ - # 9:45鐐逛箣鍓嶆墠鑳戒拱鍏� - if not constant.TEST: - if int(tool.get_now_time_str().replace(":", "")) > 94500: - return False, "瓒呰繃鐢熸晥鏃堕棿" - + # 9:45鐐逛箣鍓嶆定鍋滅殑鎵嶈兘涔板叆 + # 鑾峰彇褰撳墠浠g爜鐨勬定鍋滄椂闂� + limit_up_timestamp = LimitUpDataConstant.get_first_limit_up_time(code) + if not limit_up_timestamp: + limit_up_timestamp = time.time() + if int(tool.timestamp_format(limit_up_timestamp, "%H%M%S")) > 94500: + return False, "瓒呰繃鐢熸晥鏃堕棿" # 鏍规嵁鏉垮潡鑱氬悎鏁版嵁 open_limit_up_block_codes_dict = {} for c in kpl_data_constant.open_limit_up_code_dict_for_radical_buy: @@ -1259,27 +1273,50 @@ 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) + exclude_codes = set() if count >= 2 or ( count == 1 and kpl_data_constant.open_limit_up_code_dict_for_radical_buy[open_limit_up_block_codes[0]][ 0] == 2): # 寮�濮嬫暟閲忓ぇ浜�2涓垨鑰呭彧鏈変竴涓�2鏉垮紑1 - if history_index == 0 and current_index == 0: - return True, f"寮�1鏁伴噺锛歿count}" - else: - return False, f"寮�1鏁伴噺锛歿count}锛岄潪寮�1棣栨澘韬綅涓嶅尮閰嶏細鍘嗗彶-{history_index + 1} 瀹炴椂-{current_index + 1}" + exclude_codes.clear() else: - # 涔拌��3 - if history_index == 1 and current_index == 1: - return True, f"寮�1鏁伴噺锛歿count}" + # 鑾峰彇鍖呭惈楂樹綅鏉跨殑韬綅 + # ----鑾峰彇鍘嗗彶韬綅---- + history_index, history_before_codes_info = cls.__get_history_index(code, block, set()) + # ----鑾峰彇瀹炴椂韬綅---- + current_index, current_before_codes_info = cls.__get_current_index(code, block, set()) + if history_before_codes_info and current_before_codes_info and history_before_codes_info[0][0] == \ + current_before_codes_info[0][0]: + # 鍓嶆帓绗竴涓厓绱犳棤鐐告澘 + exclude_codes = {history_before_codes_info[0][0]} else: - return False, f"寮�1鏁伴噺锛歿count}锛岄潪寮�1棣栨澘韬綅涓嶅尮閰嶏細鍘嗗彶-{history_index + 1} 瀹炴椂-{current_index + 1}" + return False, f"寮�1鏁伴噺锛歿count}锛屽巻鍙�-{history_index + 1} 瀹炴椂-{current_index + 1}" + + # 鑾峰彇涓绘澘鐨勮韩浣� + history_index, history_before_codes_info = cls.__get_history_index(code, block, + yesterday_limit_up_codes, + exclude_codes=exclude_codes) + # 涔伴鏉胯�佸ぇ/鑰佷簩 + # 棣栨澘鑰佸ぇ涓嶈兘涔版椂鍙拱鑰佷簩 + if history_index > 1: + return False, f"寮�1鏁伴噺锛歿count}锛岄潪寮�1棣栨澘韬綅涓嶅尮閰嶏細鍘嗗彶-{history_index + 1} 瀹炴椂-{current_index + 1}" + if history_index == 1: + # 褰撳墠浠g爜涓鸿��2锛岃鍒ゆ柇鑰佸ぇ鏄惁鍙拱 + if RedicalBuyDataManager.can_buy(history_before_codes_info[0][0])[0]: + return False, f"寮�1鏁伴噺锛歿count}锛屽墠鎺掍唬鐮佸彲涔帮細{history_before_codes_info[0]}" + return True, f"寮�1鏁伴噺锛歿count}锛屽墠鎺掍唬鐮佷笉鍙拱锛歿history_before_codes_info[0]}" + return True, f"寮�1鏁伴噺锛歿count}锛屽巻鍙�-{history_index + 1} 瀹炴椂-{current_index + 1}" @classmethod def __is_radical_buy_with_block_up(cls, code, block, yesterday_limit_up_codes): """ 鏄惁婵�杩涗拱锛堟澘鍧楃獊鐒舵定璧锋潵锛� - 鑰佸ぇ鍜岃�佷簩鐨勬定鍋滄椂闂寸浉宸�5鍒嗛挓鍐� - 鑰佷笁鐨勬定鍋滄椂闂磋窛绂昏�佸ぇ娑ㄥ仠鍦�10鍒嗛挓鍐呭氨涔� + 1.鑰佸ぇ鍜岃�佷簩鐨勬定鍋滄椂闂寸浉宸�5鍒嗛挓鍐� + 2.鑰佷笁鐨勬定鍋滄椂闂磋窛绂昏�佸ぇ娑ㄥ仠鍦�10鍒嗛挓鍐呭氨涔� + 3.鍓�2涓エ涓嶈兘鐐告澘锛堝巻鍙茶韩浣嶄笌鐜板湪韬綅涓�鑷达級 + 4.闄ゅ紑鍓嶄袱涓唬鐮佸彲涔拌��1涓庤��2 + 5.涔拌��2鐨勬儏鍐碉細鑰�1涓嶆弧瓒充拱鍏ユ潯浠� + @param code: @param block: @param yesterday_limit_up_codes: @@ -1287,25 +1324,44 @@ """ # 鑾峰彇褰撳墠鐨勬澘鍧� current_index, current_before_codes_info = cls.__get_current_index(code, block, set()) + current_before_codes = [x[0] for x in current_before_codes_info] + if len(current_before_codes_info) < 2: - return False, f"鍓嶆帓浠g爜灏忎簬2涓�" - if current_before_codes_info[0][1] >= kpl_block_util.open_limit_up_time_range[1]: - return False, f"鏈夊紑1" - 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爜鏈夌偢鏉�" + return False, f"鍓嶆帓浠g爜灏忎簬2涓細{current_before_codes_info}" + if current_before_codes_info[0][1] < kpl_block_util.open_limit_up_time_range[1]: + return False, f"鏈夊紑1锛歿current_before_codes_info}" # 鑰佸ぇ锛岃�佷簩蹇呴』鐩搁殧5鍒嗛挓鍐� - 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, "鍓嶆帓娑ㄥ仠鏃堕棿闂撮殧涓嶆弧瓒虫潯浠�" + if current_before_codes_info[1][1] - current_before_codes_info[0][1] >= 5 * 60: + return False, f"鑰佸ぇ鑰佷簩娑ㄥ仠鏃堕棿蹇呴』闂撮殧5鍒嗛挓鍐�" + + # 鑾峰彇褰撳墠浠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 False, f"璺濈鑰佸ぇ娑ㄥ仠宸茶繃鍘�10鍒嗛挓锛坽current_before_codes_info[0]}锛�" + + history_index, history_before_codes_info = cls.__get_history_index(code, block, set()) + history_before_codes = [x[0] for x in history_before_codes_info] + + # 鍓嶄袱涓唬鐮佹槸鍚︽湁鐐告澘 + dif_codes = set(history_before_codes[:2]) - set(current_before_codes[:2]) + if dif_codes: + return False, f"鍓�2浠g爜鏈夌偢鏉匡細{dif_codes}" + # 涓嶈绠楀墠2鐨勪唬鐮� + exclude_codes = set(current_before_codes[:2]) + history_index, history_before_codes_info = cls.__get_history_index(code, block, yesterday_limit_up_codes, + exclude_codes) + if history_index > 1: + return False, f"鎺掗櫎鍓�2锛岀洰鏍囦唬鐮佷綅浜庡巻鍙茶韩浣�-{history_index + 1}锛屽墠鎺掍唬鐮侊細{history_before_codes_info}" + if history_index == 1: + # 棣栨澘鑰�2锛屽垽鏂墠闈㈢殑鑰佸ぇ鏄惁鏄睘浜庝笉鑳戒拱鐨勮寖鐣� + pre_code = history_before_codes_info[0][0] + # pre_code涓嶈兘涔帮紝鎵嶈兘涔� + if RedicalBuyDataManager.can_buy(pre_code)[0]: + return False, f"鍓嶆帓浠g爜鍙拱锛歿pre_code}" + return True, "婊¤冻涔板叆闇�姹�" @classmethod def is_radical_buy(cls, code, yesterday_limit_up_codes): @@ -1333,16 +1389,16 @@ 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}") + msges.append(f"銆恵b}銆�:{result[1]}") fmsges.append("寮�1鍒ゆ柇##" + ",".join(msges)) if not can_buy_blocks: msges.clear() - for b in match_blocks: + for b in keys_: # 鏉垮潡蹇�熷惎鍔� 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}") + msges.append(f"銆恵b}銆�:{result[1]}") fmsges.append("鏉垮潡蹇�熷惎鍔ㄥ垽鏂�##" + ",".join(msges)) return can_buy_blocks, " **** ".join(fmsges) -- Gitblit v1.8.0