| | |
| | | """ |
| | | import time |
| | | |
| | | from huaxin_client import constant as huaxin_client_constant |
| | | from l2 import l2_data_util |
| | | from l2.l2_data_util import L2DataUtil |
| | | from log_module import async_log_util |
| | | from log_module.log import hx_logger_trade_debug, logger_real_place_order_position |
| | | from utils import tool |
| | | |
| | | _place_order_info_dict = {} |
| | | |
| | |
| | | |
| | | |
| | | # L2数据列表 |
| | | def get_l2_place_order_position(code, datas): |
| | | def get_l2_place_order_position(code, limit_up_price, datas): |
| | | order_info = get_order_info(code) |
| | | if not order_info: |
| | | # 暂无下单信息 |
| | |
| | | is_sz = code.startswith("00") |
| | | # 提交到交易所的时间预估 |
| | | min_space_time_ms = -1 if is_sz else 50 |
| | | |
| | | shadow_place_order_index = None |
| | | # 查找影子挂单 |
| | | for d in datas: |
| | | val = d['val'] |
| | | # 判断影子订单位置 |
| | | if val["num"] != huaxin_client_constant.SHADOW_ORDER_VOLUME // 100: |
| | | continue |
| | | if abs(tool.get_buy_min_price(limit_up_price) - float(val["price"])) >= 0.01: |
| | | continue |
| | | if d["index"] <= exec_data["index"]: |
| | | continue |
| | | if L2DataUtil.time_sub_as_ms(val, exec_data['val']) >= 1000: |
| | | continue |
| | | shadow_place_order_index = d["index"] |
| | | break |
| | | if shadow_place_order_index is None: |
| | | return None |
| | | total_datas = l2_data_util.local_today_datas.get(code) |
| | | start_index = max(shadow_place_order_index - 10, 0) |
| | | end_index = min(shadow_place_order_index + 10, datas[-1]["index"]) |
| | | real_place_index = None |
| | | # 从中间向两头遍历 |
| | | for i in range(shadow_place_order_index - 1, start_index, -1): |
| | | d = total_datas[i] |
| | | if d["val"]["num"] != volume // 100: |
| | | continue |
| | | if abs(float(price) - float(d["val"]["price"])) >= 0.01: |
| | | continue |
| | | |
| | | # 必须是买入 |
| | | if not L2DataUtil.is_limit_up_price_buy(d["val"]): |
| | | continue |
| | | |
| | | # 不可能比下单执行位置还早 |
| | | if d["index"] <= exec_data["index"]: |
| | | continue |
| | | # 时间差不能小于预估下单用时 |
| | | if L2DataUtil.time_sub_as_ms(d['val'], exec_data['val']) <= min_space_time_ms: |
| | | continue |
| | | # 真实下单位置与挂单位置不能相差1s |
| | | if L2DataUtil.time_sub_as_ms(d["val"], exec_data['val']) >= 1000: |
| | | continue |
| | | # 获取到了下单位置 |
| | | async_log_util.info(hx_logger_trade_debug, f"真实下单位置:{code}-{d['index']}") |
| | | async_log_util.info(logger_real_place_order_position, f"真实下单位置:{code}-{d['index']}") |
| | | if code in _place_order_info_dict: |
| | | _place_order_info_dict.pop(code) |
| | | __place_order_position[code] = d['index'] |
| | | return d["index"] |
| | | return None |
| | | real_place_index = i |
| | | break |
| | | if not real_place_index: |
| | | for i in range(shadow_place_order_index + 1, end_index): |
| | | d = total_datas[i] |
| | | if d["val"]["num"] != volume // 100: |
| | | continue |
| | | if abs(float(price) - float(d["val"]["price"])) >= 0.01: |
| | | continue |
| | | # 必须是买入 |
| | | if not L2DataUtil.is_limit_up_price_buy(d["val"]): |
| | | continue |
| | | real_place_index = i |
| | | break |
| | | if not real_place_index: |
| | | real_place_index = shadow_place_order_index |
| | | # 获取到了下单位置 |
| | | async_log_util.info(hx_logger_trade_debug, f"真实下单位置:{code}-{real_place_index}") |
| | | async_log_util.info(logger_real_place_order_position, f"真实下单位置:{code}-{real_place_index}") |
| | | if code in _place_order_info_dict: |
| | | _place_order_info_dict.pop(code) |
| | | __place_order_position[code] = real_place_index |
| | | return real_place_index |
| | | |
| | | |
| | | # 获取真实下单位置 |