| | |
| | | if referer_volume == today_volumn: |
| | | expire_rate = "100%" |
| | | else: |
| | | expire_rate = f"{round(100 * total_left_num * 100 / (referer_volume - today_volumn), 2)}%" |
| | | expire_rate = f"{100 - round(100 * total_left_num * 100 / (referer_volume - today_volumn), 2)}%" |
| | | except: |
| | | pass |
| | | |
| | |
| | | # 今日的新概念 |
| | | __new_blocks = set() |
| | | |
| | | # 代码的新题材 |
| | | __code_new_blocks = {} |
| | | |
| | | __instance = None |
| | | |
| | | __day = tool.get_now_date_str() |
| | |
| | | if block in old_blocks: |
| | | return False |
| | | self.__new_blocks.add(block) |
| | | if code not in self.__code_new_blocks: |
| | | self.__code_new_blocks[code] = set() |
| | | self.__code_new_blocks[code].add(block) |
| | | |
| | | old_blocks.add(block) |
| | | trade_record_log_util.add_temp_special_codes(code, f"新题材辨识度:{block}") |
| | | async_log_util.info(logger_debug, f"今日新增概念:{code} - {block}") |
| | |
| | | @return: |
| | | """ |
| | | if self.__new_blocks and block in self.__new_blocks: |
| | | return True |
| | | return True |
| | | return False |
| | | |
| | | def has_new_block(self, code): |
| | | """ |
| | | 是否有新题材 |
| | | @param code: |
| | | @return: |
| | | """ |
| | | if self.__code_new_blocks.get(code): |
| | | return True |
| | | return False |
| | | |
| | | |
| | | class TodayLimitUpReasonChangeManager: |
| | |
| | | @param code: |
| | | @return: |
| | | """ |
| | | if BlockSpecialCodesManager().get_code_blocks(code): |
| | | if LimitUpCodesBlockRecordManager().has_new_block(code): |
| | | # 有新题材 |
| | | k_format = code_nature_analyse.CodeNatureRecordManager().get_k_format_cache(code) |
| | | if k_format and k_format[1]: |
| | | # 突破形态 |
| | | return False |
| | | return True |
| | | |
| | |
| | | from third_data.third_blocks_manager import BlockMapManager |
| | | from trade import trade_record_log_util, trade_data_manager, trade_manager, trade_constant |
| | | from trade.buy_money_count_setting import RadicalBuyBlockCodeCountManager |
| | | from trade.buy_radical import new_block_processor |
| | | from trade.buy_radical.block_special_codes_manager import BlockSpecialCodesManager |
| | | from trade.trade_data_manager import RadicalBuyDealCodesManager |
| | | from utils import tool, global_util, trade_util |
| | |
| | | # 今日新板块不考虑净流入 |
| | | return True, False |
| | | # 10点之前不考虑净流入 |
| | | if tool.get_now_time_as_int()<=100000: |
| | | if tool.get_now_time_as_int() <= 100000: |
| | | return True, False |
| | | |
| | | # 辨识度不在流入的票打回封(回封已经在订阅的时候处理了) |
| | |
| | | can_buy_blocks.add(b) |
| | | msges.append(f"【{b}】:{result[1]}") |
| | | fmsges.append("首封板块辨识度判断##" + ",".join(msges)) |
| | | |
| | | # 新题材只买前2 |
| | | if can_buy_blocks: |
| | | msges.clear() |
| | | # 判断代码是否破前高 |
| | | is_new_high = False |
| | | k_format = code_nature_analyse.CodeNatureRecordManager().get_k_format_cache(code) |
| | | if k_format and k_format[1]: |
| | | # 突破形态 |
| | | is_new_high = True |
| | | delete_blocks = set() |
| | | for b in can_buy_blocks: |
| | | # 板块 |
| | | if LimitUpCodesBlockRecordManager().is_new_block(b): |
| | | if not is_new_high: |
| | | msges.append(f"【{b}】:新题材没破前高") |
| | | delete_blocks.add(b) |
| | | continue |
| | | # 新题材只买前2 |
| | | history_index, history_before_codes_info, limit_up_space_ge_60s_codes = cls.__get_history_index( |
| | | code, b, |
| | | yesterday_limit_up_codes) |
| | | if history_index > 1: |
| | | delete_blocks.add(b) |
| | | msges.append(f"【{b}】:新题材只买前2") |
| | | continue |
| | | can_buy_blocks -= delete_blocks |
| | | if msges: |
| | | fmsges.append("新题材判断##" + ",".join(msges)) |
| | | |
| | | # 判断板块是否不能买 |
| | | if can_buy_blocks: |
| | | msges.clear() |
| | |
| | | from log_module import async_log_util |
| | | from log_module.log import logger_l2_radical_buy, hx_logger_l2_transaction, logger_l2_not_buy_reasons |
| | | from third_data import kpl_data_manager |
| | | from third_data.kpl_data_constant import LimitUpDataConstant |
| | | from third_data.kpl_data_constant import LimitUpDataConstant, LimitUpCodesBlockRecordManager |
| | | from trade.buy_radical import radical_buy_data_manager |
| | | from trade.buy_radical.radical_buy_data_manager import RadicalBuyBlockManager |
| | | from trade.trade_data_manager import RadicalBuyDealCodesManager |
| | |
| | | average_rate = Buy1PriceManager().get_average_rate(code) |
| | | if average_rate is not None and average_rate < 0.07: |
| | | average_big_order_money = 299 * 10000 |
| | | if average_big_order_money > left_limit_up_sell_money: |
| | | threshold_left_sell_money = average_big_order_money |
| | | |
| | | # 如果是非新题材的首封: 2个大单的折扣 |
| | | if radical_buy_data_manager.is_first_limit_up_buy(code) and not LimitUpCodesBlockRecordManager().has_new_block( |
| | | code): |
| | | threshold_left_sell_money = average_big_order_money * 2 |
| | | |
| | | if threshold_left_sell_money > left_limit_up_sell_money: |
| | | # 剩余总卖小于均大单才能下单 |
| | | # 如果是深证且卖一大于5000w可不判断大单是否满足 |
| | | if tool.is_sz_code(code) and refer_sell_money >= 5e7: |
| | | return BUY_MODE_DIRECT, f"剩余涨停总卖额-{left_limit_up_sell_money},均大单-{average_big_order_money}, 总抛压大({refer_sell_money})" |
| | | return BUY_MODE_DIRECT, f"剩余涨停总卖额-{left_limit_up_sell_money},均大单-{average_big_order_money}, 剩余阈值-{threshold_left_sell_money}, 总抛压大({refer_sell_money})" |
| | | else: |
| | | # 判断大单是否满足 |
| | | total_lack_money_info = radical_buy_data_manager.get_total_deal_big_order_info(code, |