Administrator
2023-11-27 8280205a0f077235a2e03c9ca3079140f5a3d370
独苗撤单规则生效
5个文件已修改
94 ■■■■ 已修改文件
l2/cancel_buy_strategy.py 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
l2/l2_data_manager_new.py 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test/l2_trade_test.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
third_data/kpl_data_manager.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
trade/huaxin/huaxin_trade_server.py 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
l2/cancel_buy_strategy.py
@@ -1127,7 +1127,8 @@
                                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)
@@ -1679,6 +1680,56 @@
        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:
l2/l2_data_manager_new.py
@@ -1002,23 +1002,22 @@
                                                         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(":", ""))
test/l2_trade_test.py
@@ -230,7 +230,7 @@
                                                     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("跳过此单元测试")
third_data/kpl_data_manager.py
@@ -210,7 +210,7 @@
        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)
trade/huaxin/huaxin_trade_server.py
@@ -36,10 +36,12 @@
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
@@ -369,6 +371,7 @@
                                                          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:
                # 是否处于下单状态
@@ -393,6 +396,20 @@
                                # 买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()
@@ -400,7 +417,8 @@
                                                         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,