Administrator
2023-07-20 8031d02ace0b725ff168b55f4732f5821cf773c0
bug修复
3个文件已修改
88 ■■■■ 已修改文件
l2/cancel_buy_strategy.py 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
log_module/log.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
trade/trade_result_manager.py 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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,10 +766,13 @@
        cls.__getRedis().delete(f"l_cancel_watch_index-{code}")
    @classmethod
    def clear(cls):
        keys = cls.__getRedis().keys(f"l_cancel_watch_index-*")
        for k in keys:
            cls.__getRedis().delete(k)
    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)
    # 设置成交位置,成交位置变化之后相应的监听数据也会发生变化
    @classmethod
@@ -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:
                    # 计算撤单比例
                    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
                    need_compute = True
                    break
        if need_compute:
            # 计算撤单比例
            canceled_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)
            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)
# --------------------------------封单额变化撤------------------------
# 涨停封单额统计
log_module/log.py
@@ -61,6 +61,14 @@
                   filter=lambda record: record["extra"].get("name") == "h_cancel",
                   rotation="00:00", compression="zip", enqueue=True)
        logger.add(self.get_path("l2", "cancel/l_cancel"),
                   filter=lambda record: record["extra"].get("name") == "l_cancel",
                   rotation="00:00", compression="zip", enqueue=True)
        logger.add(self.get_path("l2", "cancel/d_cancel"),
                   filter=lambda record: record["extra"].get("name") == "d_cancel",
                   rotation="00:00", compression="zip", enqueue=True)
        logger.add(self.get_path("l2", "l2_trade_buy"),
                   filter=lambda record: record["extra"].get("name") == "l2_trade_buy",
                   rotation="00:00", compression="zip", enqueue=True)
@@ -216,6 +224,8 @@
logger_l2_trade_cancel = __mylogger.get_logger("l2_trade_cancel")
logger_l2_s_cancel = __mylogger.get_logger("s_cancel")
logger_l2_h_cancel = __mylogger.get_logger("h_cancel")
logger_l2_d_cancel = __mylogger.get_logger("d_cancel")
logger_l2_l_cancel = __mylogger.get_logger("l_cancel")
logger_l2_trade_buy = __mylogger.get_logger("l2_trade_buy")
logger_l2_trade_queue = __mylogger.get_logger("l2_trade_queue")
logger_l2_trade_buy_queue = __mylogger.get_logger("l2_trade_buy_queue")
trade/trade_result_manager.py
@@ -34,7 +34,8 @@
                                                                     total_datas[-1]["index"])
    f6 = dask.delayed(SecondCancelBigNumComputer.cancel_success)(code)
    f7 = dask.delayed(DCancelBigNumComputer.cancel_success)(code)
    dask.compute(f1, f2, f3, f4, f5, f6, f7)
    f8 = dask.delayed(LCancelBigNumComputer.cancel_success)(code)
    dask.compute(f1, f2, f3, f4, f5, f6, f7, f8)
# 真实买成功
@@ -93,7 +94,9 @@
    f5 = dask.delayed(l2_data_manager.TradePointManager.delete_count_info_for_cancel_buy)(code)
    f6 = dask.delayed(SecondCancelBigNumComputer.cancel_success)(code)
    f7 = dask.delayed(DCancelBigNumComputer.cancel_success)(code)
    dask.compute(f1, f2, f3, f4, f5, f6, f7)
    f8 = dask.delayed(LCancelBigNumComputer.cancel_success)(code)
    dask.compute(f1, f2, f3, f4, f5, f6, f7, f8)
if __name__ == "__main__":
@@ -104,4 +107,5 @@
    f5 = dask.delayed(l2_data_manager.TradePointManager.delete_count_info_for_cancel_buy)(code)
    f6 = dask.delayed(SecondCancelBigNumComputer.cancel_success)(code)
    f7 = dask.delayed(DCancelBigNumComputer.cancel_success)(code)
    dask.compute(f2, f3, f4, f5, f6, f7)
    f8 = dask.delayed(LCancelBigNumComputer.cancel_success)(code)
    dask.compute(f2, f3, f4, f5, f6, f7, f8)