| | |
| | | watch_indexes.add(i) |
| | | break |
| | | self.__set_watch_indexes(code, buy_single_index, re_compute, watch_indexes) |
| | | l2_log.l_cancel_debug(code, f"设置监听范围{ '(重新计算)' if re_compute else ''}, 数据范围:{re_start_index}-{end_index} 监听范围-{watch_indexes}") |
| | | l2_log.l_cancel_debug(code, |
| | | f"设置监听范围{'(重新计算)' if re_compute else ''}, 数据范围:{re_start_index}-{end_index} 监听范围-{watch_indexes}") |
| | | except Exception as e: |
| | | l2_log.l_cancel_debug(code, f"计算L后囊括范围出错:{str(e)}") |
| | | async_log_util.exception(logger_l2_l_cancel, e) |
| | |
| | | return need_cancel, f"成交进度位({transaction_index})-真实下单位({place_order_index}) 纯买手数:{buy_nums}/1.8倍m值手数:{thresh_num}" |
| | | |
| | | |
| | | # ---------------------------------独苗撤------------------------------- |
| | | class UCancelBigNumComputer: |
| | | __db = 0 |
| | | __redis_manager = redis_manager.RedisManager(0) |
| | | __cancel_real_order_index_cache = {} |
| | | |
| | | __instance = None |
| | | |
| | | def __new__(cls, *args, **kwargs): |
| | | if not cls.__instance: |
| | | cls.__instance = super(UCancelBigNumComputer, cls).__new__(cls, *args, **kwargs) |
| | | cls.__load_datas() |
| | | return cls.__instance |
| | | |
| | | @classmethod |
| | | def __load_datas(cls): |
| | | pass |
| | | |
| | | @classmethod |
| | | def __get_redis(cls): |
| | | return cls.__redis_manager.getRedis() |
| | | |
| | | # 是否可以撤单 |
| | | def need_cancel(self, code, order_begin_pos: OrderBeginPosInfo, current_limit_up_block_codes_dict, volume_rate): |
| | | if not order_begin_pos or not order_begin_pos.buy_exec_index or order_begin_pos.buy_exec_index < 0: |
| | | return False, "尚未下单" |
| | | if not current_limit_up_block_codes_dict: |
| | | return False, "涨停列表无数据" |
| | | # 获取涨停原因 |
| | | block = None |
| | | for b in current_limit_up_block_codes_dict: |
| | | if code in current_limit_up_block_codes_dict[b]: |
| | | block = b |
| | | break |
| | | if not block: |
| | | return False, "没有找到代码的涨停原因" |
| | | if len(current_limit_up_block_codes_dict[block]) > 1: |
| | | return False, "有后排无需撤单" |
| | | total_datas = local_today_datas.get(code) |
| | | time_sub = tool.trade_time_sub(tool.get_now_time_str(), |
| | | total_datas[order_begin_pos.buy_exec_index]["val"]["time"]) |
| | | if time_sub > 15 * 60: |
| | | if len(current_limit_up_block_codes_dict[block]) == 1: |
| | | return True, "独苗下单15分钟无后排" |
| | | elif time_sub > 5 * 60: |
| | | if len(current_limit_up_block_codes_dict[block]) == 1 and volume_rate < 0.8: |
| | | return True, f"独苗下单5分钟无后排且量({volume_rate})小于80%" |
| | | return False, "不需要撤单" |
| | | |
| | | |
| | | # --------------------------------封单额变化撤------------------------ |
| | | # 涨停封单额统计 |
| | | class L2LimitUpMoneyStatisticUtil: |
| | |
| | | kpl_data_manager.KPLLimitUpDataRecordManager.total_datas, |
| | | yesterday_codes, |
| | | block_info.get_before_blocks_dict(), |
| | | kpl_data_manager.KPLLimitUpDataRecordManager.get_current_code_block_dict()) |
| | | kpl_data_manager.KPLLimitUpDataRecordManager.get_current_reason_codes_dict()) |
| | | can_buy_result = CodePlateKeyBuyManager.can_buy(code) |
| | | |
| | | if can_buy_result is None: |
| | | return False, True, "尚未获取到板块信息" |
| | | |
| | | if can_buy_result[1]: |
| | | if cls.volume_rate_info[code][0] < 0.6: |
| | | return False, True, f"独苗:量比({cls.volume_rate_info[code][0]})未达到60%" |
| | | |
| | | # 获取K线形态,判断是否近2天是否为10天内最大量 |
| | | k_format = code_nature_analyse.CodeNatureRecordManager().get_k_format_cache(code) |
| | | if k_format and len(k_format) >= 10 and k_format[9][0]: |
| | | # 是独苗 |
| | | if can_buy_result[1]: |
| | | if cls.volume_rate_info[code][0] < 0.6: |
| | | return False, True, f"独苗:近2天有10日内最高量,量比({cls.volume_rate_info[code][0]})未达到60%" |
| | | else: |
| | | if cls.volume_rate_info[code][0] < 0.3: |
| | | return False, True, f"近2天有10日内最高量,量比({cls.volume_rate_info[code][0]})未达到30%" |
| | | |
| | | if cls.volume_rate_info[code][0] < 0.3: |
| | | return False, True, f"近2天有10日内最高量,量比({cls.volume_rate_info[code][0]})未达到30%" |
| | | # 是独苗 |
| | | if can_buy_result[1]: |
| | | now_time_int = int(tool.get_now_time_str().replace(":", "")) |
| | |
| | | kpl_data_manager.KPLLimitUpDataRecordManager.total_datas, |
| | | yesterday_codes, |
| | | block_info.get_before_blocks_dict(), |
| | | kpl_data_manager.KPLLimitUpDataRecordManager.get_current_code_block_dict()) |
| | | kpl_data_manager.KPLLimitUpDataRecordManager.get_current_reason_codes_dict()) |
| | | l2.l2_data_manager_new.L2TradeDataProcessor.can_buy_first(code, None) |
| | | |
| | | @unittest.skip("跳过此单元测试") |
| | |
| | | return cls.__current_reason_codes_dict.get(block) |
| | | |
| | | @classmethod |
| | | def get_current_code_block_dict(cls): |
| | | def get_current_reason_codes_dict(cls): |
| | | return copy.deepcopy(cls.__current_reason_codes_dict) |
| | | |
| | | |
| | |
| | | from l2 import l2_data_manager_new, l2_log, code_price_manager, l2_data_util, l2_data_manager, transaction_progress, \ |
| | | l2_data_log, l2_data_source_util |
| | | from l2.cancel_buy_strategy import HourCancelBigNumComputer, LCancelBigNumComputer, DCancelBigNumComputer, \ |
| | | GCancelBigNumComputer, SecondCancelBigNumComputer, LCancelRateManager, LatestCancelIndexManager |
| | | GCancelBigNumComputer, SecondCancelBigNumComputer, LCancelRateManager, LatestCancelIndexManager, \ |
| | | UCancelBigNumComputer |
| | | from l2.huaxin import huaxin_target_codes_manager |
| | | from l2.huaxin.huaxin_target_codes_manager import HuaXinL1TargetCodesManager |
| | | from l2.l2_data_listen_manager import L2DataListenManager |
| | | from l2.l2_data_manager_new import L2TradeDataProcessor |
| | | from l2.l2_data_util import L2DataUtil |
| | | from l2.l2_sell_manager import L2MarketSellManager |
| | | from l2.l2_transaction_data_manager import HuaXinTransactionDatasProcessor |
| | |
| | | limit_up_price, |
| | | sell_1_price, sell_1_volume // 100) |
| | | latest_3m_buy1_money_list = code_price_manager.Buy1PriceManager().get_latest_3m_buy1_money_list(code) |
| | | # -----------------------------重新计算L撤后--------------------------- |
| | | # 如果时涨停状态 |
| | | if abs(float(limit_up_price) - float(buy_1_price)) < 0.001: |
| | | # 是否处于下单状态 |
| | |
| | | # 买1封单额平稳 |
| | | LCancelBigNumComputer().re_compute_l_down_watch_indexes(code) |
| | | |
| | | # ---------------------------------判断板块是否跟上来了------------------------------- |
| | | try: |
| | | order_begin_pos = l2_data_manager.TradePointManager().get_buy_compute_start_data_cache(code) |
| | | volume_rate = 0 |
| | | volume_info = l2_data_manager_new.L2TradeDataProcessor.volume_rate_info.get(code) |
| | | if volume_info: |
| | | volume_rate = volume_info[0] |
| | | need_cancel, msg = UCancelBigNumComputer().need_cancel(code, order_begin_pos, kpl_data_manager.KPLLimitUpDataRecordManager.get_current_reason_codes_dict(), volume_rate) |
| | | if need_cancel: |
| | | l2_data_manager_new.L2TradeDataProcessor.cancel_buy(code, msg) |
| | | except Exception as e: |
| | | logger_debug.exception(e) |
| | | |
| | | # ----------------------------------板块相关------------------------------ |
| | | cls.__KPLCodeJXBlockManager.load_jx_blocks(code, buy_1_price, limit_up_price) |
| | | # 更新板块信息 |
| | | yesterday_codes = kpl_data_manager.get_yesterday_limit_up_codes() |
| | |
| | | kpl_data_manager.KPLLimitUpDataRecordManager.latest_origin_datas, |
| | | kpl_data_manager.KPLLimitUpDataRecordManager.total_datas, |
| | | yesterday_codes, |
| | | block_info.get_before_blocks_dict(),kpl_data_manager.KPLLimitUpDataRecordManager.get_current_code_block_dict()) |
| | | block_info.get_before_blocks_dict(), |
| | | kpl_data_manager.KPLLimitUpDataRecordManager.get_current_reason_codes_dict()) |
| | | |
| | | async_log_util.info(hx_logger_l2_market_data, f"{code}#{data}") |
| | | L2MarketSellManager().set_current_total_sell_data(code, time_str, |