Administrator
2025-07-30 7effd6cbe7ba570c91fc47ff3971df6fb686759d
l2/l2_transaction_data_processor.py
@@ -38,10 +38,17 @@
    # 计算成交进度
    @classmethod
    def __compute_latest_trade_progress(cls, code, fdatas):
    def __compute_latest_trade_progress(cls, code, fdatas, buy_exec_index=None):
        """
        计算真实下单位置
        @param code:
        @param fdatas:
        @param buy_exec_index:
        @return:真实下单位置, 是否是近似计算
        """
        buyno_map = l2_data_util.local_today_buyno_map.get(code)
        if not buyno_map:
            return None
            return None, False
        buy_progress_index = None
        for i in range(len(fdatas) - 1, -1, -1):
            d = fdatas[i]
@@ -51,7 +58,37 @@
                if L2DataUtil.is_limit_up_price_buy(buyno_map[buy_no]["val"]):
                    buy_progress_index = buyno_map[buy_no]["index"]
                break
        return buy_progress_index
        if buy_progress_index is None and buy_exec_index is not None and buy_exec_index >= 0:
            # 没有找到真实成交进度位且有买入执行位置
            # 根据最近的成交买单号计算真实成交位置
            try:
                latest_buy_order_no = fdatas[-1][0][6]
                total_datas = l2_data_util.local_today_datas.get(code)
                if tool.trade_time_sub(total_datas[-1]["val"]["time"], total_datas[buy_exec_index]["val"]["time"]) < 60:
                    # 下单60s内才这样计算
                    # 取最新的成交买单号,在两个涨停委托买之间的后一个数据
                    index_1 = None
                    max_index = total_datas[-1]["index"]
                    for i in range(max_index, -1, -1):
                        data = total_datas[i]
                        val = data['val']
                        if not L2DataUtil.is_limit_up_price_buy(val):
                            continue
                        if val['orderNo'] < latest_buy_order_no:
                            index_1 = i
                            break
                    if index_1 is not None:
                        for i in range(index_1 + 1, max_index + 1):
                            data = total_datas[i]
                            val = data['val']
                            if not L2DataUtil.is_limit_up_price_buy(val):
                                continue
                            if val['orderNo'] > latest_buy_order_no:
                                buy_progress_index = i
                                return buy_progress_index, True
            except  Exception as e:
                async_log_util.info(logger_debug, f"计算真实成交进度位出错:{str(e)}")
        return buy_progress_index, False
    @classmethod
    def statistic_big_order_infos(cls, code, fdatas, order_begin_pos: OrderBeginPosInfo):
@@ -251,12 +288,13 @@
            # if big_money_count > 0:
            #     LCancelRateManager.compute_big_num_deal_rate(code)
            buy_progress_index = cls.__compute_latest_trade_progress(code, fdatas)
            buy_progress_index, is_similar = cls.__compute_latest_trade_progress(code, fdatas,
                                                                                 order_begin_pos.buy_exec_index)
            if buy_progress_index is not None:
                buy_progress_index_changed = cls.__TradeBuyQueue.set_traded_index(code, buy_progress_index,
                                                                                  total_datas)
                l2_log.info(code, logger_l2_trade_buy_queue, "获取成交位置成功: code-{} index-{}", code, buy_progress_index)
                l2_log.info(code, logger_l2_trade_buy_queue, "获取成交位置成功: code-{} index-{} is_similar-{}", code, buy_progress_index, is_similar)
                if is_placed_order:
                    # NewGCancelBigNumComputer().set_trade_progress(code, order_begin_pos.buy_single_index,
                    #                                               buy_progress_index)
@@ -339,18 +377,19 @@
            # 统计涨停主动卖成交,为了F撤准备数据
            HuaXinSellOrderStatisticManager.statistic_active_sell_deal_volume(code, fdatas, limit_up_price)
            # 计算成交进度
            buy_progress_index = cls.__compute_latest_trade_progress(code, fdatas)
            if buy_progress_index is not None:
            _buy_progress_index, _is_similar = cls.__compute_latest_trade_progress(code, fdatas,
                                                                                   order_begin_pos.buy_exec_index)
            if _buy_progress_index is not None:
                total_datas = l2_data_util.local_today_datas.get(code)
                buy_progress_index_changed = cls.__TradeBuyQueue.set_traded_index(code, buy_progress_index,
                buy_progress_index_changed = cls.__TradeBuyQueue.set_traded_index(code, _buy_progress_index,
                                                                                  total_datas)
                async_log_util.info(logger_l2_trade_buy_queue, "获取成交位置成功: code-{} index-{}", code,
                                    buy_progress_index)
                async_log_util.info(logger_l2_trade_buy_queue, "获取成交位置成功: code-{} index-{} similar-{}", code,
                                    _buy_progress_index, _is_similar)
                if is_placed_order:
                    LCancelBigNumComputer().set_trade_progress(code, order_begin_pos.buy_single_index,
                                                               buy_progress_index,
                                                               _buy_progress_index,
                                                               total_datas)
                    cancel_result = FCancelBigNumComputer().need_cancel_for_deal_fast(code, buy_progress_index)
                    cancel_result = FCancelBigNumComputer().need_cancel_for_deal_fast(code, _buy_progress_index)
                    if cancel_result[0]:
                        L2TradeDataProcessor.cancel_buy(code, f"F撤:{cancel_result[1]}",
                                                        cancel_type=trade_constant.CANCEL_TYPE_F)
@@ -418,7 +457,7 @@
                # 如果是被动买就更新成交进度
                if not fdatas[-1][1]:
                    buy_progress_index = cls.__compute_latest_trade_progress(code, fdatas)
                    buy_progress_index, is_similar = cls.__compute_latest_trade_progress(code, fdatas)
                    if buy_progress_index is not None:
                        total_datas = l2_data_util.local_today_datas.get(code)
                        cls.__TradeBuyQueue.set_traded_index(code, buy_progress_index,