Administrator
2023-07-20 8031d02ace0b725ff168b55f4732f5821cf773c0
l2/cancel_buy_strategy.py
@@ -20,7 +20,8 @@
from trade import trade_data_manager, trade_queue_manager, l2_trade_factor
from l2 import l2_log, l2_data_log, l2_data_source_util
from l2.l2_data_util import L2DataUtil, local_today_num_operate_map, local_today_datas
from log_module.log import logger_buy_1_volumn, logger_l2_h_cancel, logger_l2_s_cancel
from log_module.log import logger_buy_1_volumn, logger_l2_h_cancel, logger_l2_s_cancel, logger_l2_d_cancel, \
    logger_l2_l_cancel
class SecondCancelBigNumComputer:
@@ -701,7 +702,7 @@
            return False, "尚未获取到真实下单位置"
        left_num = 0
        for i in range(index, real_order_index + 1):
        for i in range(index + 1, real_order_index):
            data = total_data[i]
            val = data['val']
            if not L2DataUtil.is_limit_up_price_buy(val):
@@ -713,10 +714,12 @@
                                                                                                  total_data,
                                                                                                  local_today_num_operate_map)
            left_num += val['num'] * left_count
        # 剩下的不足动态M值的1/2
        rate = round(limit_up_price * left_num * 100 / m_value, 3)
        rate = round(float(limit_up_price) * left_num * 100 / m_value, 3)
        logger_l2_d_cancel.info(
            f"{code}成交进度({index})到下单位置({real_order_index})的剩余笔数:{left_num},撤单比例:{rate},m值:{m_value}")
        if rate < constant.D_CANCEL_RATE:
            l2_log.cancel_debug(code, "D撤撤单,比例为:{},目标比例{}", rate, constant.D_CANCEL_RATE)
            return True, f"D撤比例为:{rate}"
        return False, ""
@@ -724,6 +727,11 @@
    @classmethod
    def set_real_order_index(cls, code, index):
        cls.__set_real_order_index(code, index)
        logger_l2_d_cancel.info(f"{code}成交进度设置:{index}")
    @classmethod
    def place_order_success(cls, code):
        cls.clear(code)
    @classmethod
    def cancel_success(cls, code):
@@ -758,7 +766,10 @@
        cls.__getRedis().delete(f"l_cancel_watch_index-{code}")
    @classmethod
    def clear(cls):
    def clear(cls,code=None):
        if code:
            cls.del_watch_index(code)
        else:
        keys = cls.__getRedis().keys(f"l_cancel_watch_index-*")
        for k in keys:
            cls.__getRedis().delete(k)
@@ -794,6 +805,7 @@
                watch_indexes.add(index)
                if len(watch_indexes) >= constant.L_CANCEL_MAX_WATCH_COUNT:
                    break
        logger_l2_l_cancel.info(f"{code}:设置监听范围,成交进度-{index} 监听范围-{watch_indexes}")
        # 数据维护
        add_indexes = watch_indexes - old_watch_indexes
        delete_indexes = old_watch_indexes - watch_indexes
@@ -814,6 +826,12 @@
        if not watch_indexes:
            return False, None
        # 计算监听的总条数
        total_count = 0
        for wi in watch_indexes:
            total_count += total_data[wi]["re"]
        # 判断撤单中是否有监听中的索引
        need_compute = False
        for i in range(start_index, end_index + 1):
            data = total_data[i]
            val = data["val"]
@@ -822,21 +840,31 @@
                buy_index = l2_data_source_util.L2DataSourceUtils.get_buy_index_with_cancel_data(code, data,
                                                                                                 local_today_num_operate_map)
                if buy_index is not None and buy_index in watch_indexes:
                    need_compute = True
                    break
        if need_compute:
                    # 计算撤单比例
                    canceled_count = 0
                    total_count = 0
                    for wi in watch_indexes:
                        left_count = l2_data_source_util.L2DataSourceUtils.get_limit_up_buy_no_canceled_count(code,
                                                                                                              wi,
                                                                                                              total_data,
                                                                                                              local_today_num_operate_map)
                        canceled_count += (total_data[wi]["re"] - left_count)
                        total_count += total_data[wi]["re"]
                    if canceled_count / total_count >= constant.L_CANCEL_RATE:
                        return True, data
            rate = round(canceled_count / total_count, 3)
            logger_l2_l_cancel.info(f"计算范围:{start_index}-{end_index},已撤单比例:{rate}")
            if rate >= constant.L_CANCEL_RATE:
                return True, total_data[-1]
        return False, None
    @classmethod
    def place_order_success(cls, code):
        cls.clear(code)
    @classmethod
    def cancel_success(cls, code):
        cls.clear(code)
# --------------------------------封单额变化撤------------------------
# 涨停封单额统计