Administrator
2023-10-16 5ed30c03ddfedd4cf79cd8fea9fc45b05821d898
l2/huaxin/huaxin_delegate_postion_manager.py
@@ -3,9 +3,12 @@
"""
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 = {}
@@ -31,7 +34,7 @@
# 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:
        # 暂无下单信息
@@ -44,33 +47,61 @@
    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
# 获取真实下单位置