Administrator
2025-04-09 46aa2eb6b6520333cb8ebb525fd4f7f93b0be60c
trade/buy_radical/new_block_processor.py
@@ -1,11 +1,83 @@
"""
新题材处理器
"""
import constant
from code_attribute import code_nature_analyse
from code_attribute.gpcode_manager import HumanRemoveForbiddenManager
from third_data import kpl_util
from third_data.kpl_data_constant import LimitUpCodesBlockRecordManager
from trade import l2_trade_util, trade_record_log_util
from trade.buy_radical.block_special_codes_manager import BlockSpecialCodesManager
from utils import tool
from utils.kpl_data_db_util import KPLLimitUpDataUtil
@tool.singleton
class BeforeBlocksComputer:
    """
    往日题材计算器
    """
    def __init__(self):
        self.__before_blocks = set()
        self.__load_data()
    def __load_data(self):
        # kpl_results: [( r.`_code`, r.`_day`, r.`_hot_block_name`, r.`_blocks`,  r.`_open`)]
        kpl_results = KPLLimitUpDataUtil.get_latest_block_infos()
        days = set()
        for r in kpl_results:
            # 取60个交易日之内的题材
            days.add(r[1])
        days = list(days)
        days.sort(key=lambda x: int(x.replace("-", "")), reverse=True)
        days = days[:60]
        # {"日期":{ "题材":{代码} }}
        day_block_codes_dict = {}
        for r in kpl_results:
            if r[1] not in days:
                continue
            if r[4]:
                # 不算炸板
                continue
            # 统计每一天的题材
            day = r[1]
            block = kpl_util.filter_block(r[2])
            if block in constant.KPL_INVALID_BLOCKS:
                continue
            if day not in day_block_codes_dict:
                day_block_codes_dict[day] = {}
            if block not in day_block_codes_dict[day]:
                day_block_codes_dict[day][block] = set()
            day_block_codes_dict[day][block].add(r[0])
        # 每一天走的板块
        day_block_dict = {}
        for day in day_block_codes_dict:
            for b in day_block_codes_dict[day]:
                if len(day_block_codes_dict[day][b]) >= 3:
                    if day not in day_block_dict:
                        day_block_dict[day] = set()
                    day_block_dict[day].add(b)
        day_block_list = [(d, day_block_dict[d]) for d in day_block_dict]
        day_block_list.sort(key=lambda x: x[0])
        # 过去59天出现的题材
        old_blocks = set()
        for d in day_block_list:
            if d[0] == days[0]:
                continue
            old_blocks |= d[1]
        self.__before_blocks |= old_blocks
        # 昨天出现的题材
        # if days[0] == day_block_list[-1][0]:
        #     # 昨天出现的题材
        #     yesterday_blocks = day_block_list[-1][1]
    def is_new_block(self, block):
        return block not in self.__before_blocks
    def get_old_blocks(self):
        return self.__before_blocks
def process_new_block(code, block):