| | |
| | | |
| | | # 计算成交进度 |
| | | @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] |
| | |
| | | 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): |
| | |
| | | # 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) |
| | |
| | | # 统计涨停主动卖成交,为了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) |
| | |
| | | |
| | | # 如果是被动买就更新成交进度 |
| | | 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, |