From a66b4a987444c655b5ab5f678dbfefc82b7785b2 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期二, 27 八月 2024 15:12:06 +0800 Subject: [PATCH] 开盘啦精选板块调整 --- third_data/code_plate_key_manager.py | 121 ++++++++++++++++++++++++++++++++-------- 1 files changed, 97 insertions(+), 24 deletions(-) diff --git a/third_data/code_plate_key_manager.py b/third_data/code_plate_key_manager.py index 173a91a..cdd0181 100644 --- a/third_data/code_plate_key_manager.py +++ b/third_data/code_plate_key_manager.py @@ -8,20 +8,23 @@ 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, kpl_api, kpl_util -from trade.trade_manager import MarketSituationManager -from utils import global_util, tool, buy_condition_util +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 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 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 - +from trade import trade_manager, l2_trade_util, trade_constant # 浠g爜绮鹃�夋澘鍧楃鐞� +from utils.kpl_data_db_util import KPLLimitUpDataUtil + + class KPLCodeJXBlockManager: __db = 3 __redisManager = redis_manager.RedisManager(3) @@ -93,7 +96,7 @@ # 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) + pre_close_price = round(float(limit_up_price) / tool.get_limit_up_rate(code), 2) # 濡傛灉娑ㄥ箙澶т簬7%灏辫鍙栨澘鍧� price_rate = (buy_1_price - pre_close_price) / pre_close_price if price_rate > 0.07: @@ -137,6 +140,48 @@ except Exception as e: logger_kpl_block_can_buy.error(f"{code} 鑾峰彇鏉垮潡鍑洪敊") logger_kpl_block_can_buy.exception(e) + + +# 绂佹涓嬪崟鐨勬澘鍧� +class ForbiddenBlockManager: + __db = 3 + __redisManager = redis_manager.RedisManager(3) + __instance = None + __forbidden_blocks = set() + + def __new__(cls, *args, **kwargs): + if not cls.__instance: + cls.__instance = super(ForbiddenBlockManager, cls).__new__(cls, *args, **kwargs) + cls.__load_data() + return cls.__instance + + @classmethod + def __get_redis(cls): + return cls.__redisManager.getRedis() + + # 鍔犺浇鏁版嵁 + @classmethod + def __load_data(cls): + blocks = cls.__get_redis().smembers("forbidden_blocks") + if blocks: + for b in blocks: + cls.__forbidden_blocks.add(b) + + def add(self, block): + self.__forbidden_blocks.add(block) + RedisUtils.sadd_async(self.__db, "forbidden_blocks", block) + RedisUtils.expire_async(self.__db, "forbidden_blocks", tool.get_expire()) + + def remove(self, block): + if block in self.__forbidden_blocks: + self.__forbidden_blocks.remove(block) + RedisUtils.srem_async(self.__db, "forbidden_blocks", block) + + def get_blocks(self): + return copy.deepcopy(self.__forbidden_blocks) + + def is_in(self, block): + return block in self.__forbidden_blocks # 寮�鐩樺暒绂佹浜ゆ槗鏉垮潡绠$悊 @@ -431,6 +476,30 @@ blocks = set() return reasons | blocks + __history_blocks_dict_cache = {} + + def get_history_blocks(self, code): + """ + 鑾峰彇180澶╃殑鍘嗗彶娑ㄥ仠鍘熷洜 + @param code: + @return: + """ + if code in self.__history_blocks_dict_cache: + return self.__history_blocks_dict_cache.get(code) + try: + kpl_results = KPLLimitUpDataUtil.get_latest_block_infos(code=code) + keys = set() + if kpl_results: + keys |= set([x[2] for x in kpl_results]) + for r in kpl_results: + if r[3]: + keys |= set(r[3].split("銆�")) + self.__history_blocks_dict_cache[code] = keys + return keys + except: + pass + return set() + # 鐩爣浠g爜鏉垮潡鍏抽敭璇嶇鐞� class TargetCodePlateKeyManager: @@ -444,7 +513,7 @@ # 杩斿洖key闆嗗悎(鎺掗櫎鏃犳晥鏉垮潡),浠婃棩娑ㄥ仠鍘熷洜,浠婃棩鍘嗗彶娑ㄥ仠鍘熷洜,鍘嗗彶娑ㄥ仠鍘熷洜,浜岀骇,绮鹃�夋澘鍧� def get_plate_keys(self, code): """ - 鑾峰彇浠g爜鐨勬澘鍧� + 鑾峰彇浠g爜鐨勬澘鍧�: 锛�180澶╃殑娑ㄥ仠鍘熷洜+鎺ㄨ崘鍘熷洜锛�+浠婃棩娑ㄥ仠鍘熷洜+浠婃棩娑ㄥ仠鎺ㄨ崘鍘熷洜+浠婃棩鎺ㄨ崘鍘熷洜 @param code: @return: 锛堟澘鍧楀叧閿瘝闆嗗悎,浠婃棩娑ㄥ仠鍘熷洜+娑ㄥ仠鎺ㄨ崘鍘熷洜,浠婃棩鍘嗗彶娑ㄥ仠鍘熷洜,鍘嗗彶娑ㄥ仠鍘熷洜,绮鹃�夋澘鍧楋級 """ @@ -459,10 +528,13 @@ k2 = self.__CodesPlateKeysManager.get_history_limit_up_reason_cache(code) if k2 is None: k2 = set() - k3 = set() - industry = global_util.code_industry_map.get(code) - if industry: - k3 = {industry} + + k3 = self.__CodesPlateKeysManager.get_history_blocks(code) + if k3: + keys |= k3 + # industry = global_util.code_industry_map.get(code) + # if industry: + # k3 = {industry} k4 = set() jingxuan_block_info = self.__KPLCodeJXBlockManager.get_jx_blocks_cache(code) @@ -474,11 +546,10 @@ if k1: # 娑ㄥ仠杩� keys |= k1 - keys = keys - set(constant.KPL_INVALID_BLOCKS) - if not keys: - # 鑾峰彇涓嶅埌娑ㄥ仠鍘熷洜 - keys |= k4 - keys = keys - set(constant.KPL_INVALID_BLOCKS) + + # 鑾峰彇涓嶅埌娑ㄥ仠鍘熷洜 + keys |= k4 + keys = keys - set(constant.KPL_INVALID_BLOCKS) return keys, k1, k11, k2, k3, k4 @@ -505,7 +576,7 @@ # 鏍规嵁韬綅绉婚櫎浠g爜 # return # 涓嬭繃鍗曠殑浠g爜涓嶇Щ闄� - if trade_manager.CodesTradeStateManager().get_trade_state_cache(code) != trade_manager.TRADE_STATE_NOT_TRADE: + if trade_manager.CodesTradeStateManager().get_trade_state_cache(code) != trade_constant.TRADE_STATE_NOT_TRADE: # 鍙涓嬭繃鍗曠殑灏变笉绉婚櫎 return l2_trade_util.forbidden_trade(code, msg=msg) @@ -555,7 +626,7 @@ if not block_codes: # 楂樹綅鏉挎硾鍖栨澘鍧椾腑鏃犳澘鍧� if not high_level_block_codes.get(block): - return False, True, f"{block}:鏉垮潡鏃犳定鍋�", False, False + return False, True, f"銆恵block}銆�:鏉垮潡鏃犳定鍋�", False, 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, False @@ -705,7 +776,7 @@ if not block_codes: # 楂樹綅鏉挎硾鍖栨澘鍧椾腑鏃犳澘鍧� if not high_level_block_codes.get(block): - return False, True, f"{block}:鏉垮潡鏃犳定鍋�", False, False, 0, 0, 0 + return False, True, f"銆恵block}銆�:鏉垮潡鏃犳定鍋�", False, False, 0, 0, 0 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, False, 0, 0, 0 @@ -718,7 +789,7 @@ is_strong_block = False # 鏈�澶氫拱鑰佸嚑 - RANKS = [5, 4, 3, 3, 3, 2, 2] + RANKS = [6, 5, 4, 4, 3, 3, 2] RANK_TIMES = ["10:00:00", "10:30:00", "11:00:00", "11:30:00", "13:30:00", "14:00:00", "15:00:00"] now_time_str = tool.get_now_time_str() max_rank = 2 @@ -758,10 +829,12 @@ is_active_buy = cls.__is_need_active_buy(code, block, current_shsz_rank, len(current_open_limit_up_codes)) if current_shsz_rank < len(current_open_limit_up_codes) + max_rank: - return True, False, f"銆恵block}銆戝墠鎺掍唬鐮侊細{current_shsz_rank}", is_strong_block, is_active_buy, current_shsz_rank, len( + return True, len(block_codes | { + code}) <= 1, f"銆恵block}銆戝墠鎺掍唬鐮侊細{current_shsz_rank}", is_strong_block, is_active_buy, current_shsz_rank, len( block_codes), len(block_codes_records) else: - return False, False, f"銆恵block}銆戝墠鎺掍唬鐮侊細{front_current_shsz_rank_codes} 瓒呰繃{len(current_open_limit_up_codes) + max_rank}涓�", is_strong_block, is_active_buy, current_shsz_rank, len( + return False, len(block_codes | { + code}) <= 1, f"銆恵block}銆戝墠鎺掍唬鐮侊細{front_current_shsz_rank_codes} 瓒呰繃{len(current_open_limit_up_codes) + max_rank}涓�", is_strong_block, is_active_buy, current_shsz_rank, len( block_codes), len(block_codes_records) # 鑾峰彇鍙互涔扮殑鏉垮潡 @@ -851,9 +924,9 @@ 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})) + {trade_constant.TRADE_STATE_BUY_DELEGATED, trade_constant.TRADE_STATE_BUY_PLACE_ORDER})) codes_success = set(cls.__CodesTradeStateManager.get_codes_by_trade_states_cache( - {trade_manager.TRADE_STATE_BUY_SUCCESS})) + {trade_constant.TRADE_STATE_BUY_SUCCESS})) codes = codes_delegate | codes_success # 缁熻鎴愪氦浠g爜鐨勬澘鍧� trade_codes_blocks_dict = {} -- Gitblit v1.8.0