Administrator
4 天以前 48fb7a00951f91bdc707e5dd2d196e5bccb752c3
l2/l2_limitup_sell_data_manager.py
@@ -3,8 +3,10 @@
"""
from code_attribute import gpcode_manager
from l2 import l2_log
from l2.l2_data_util import L2DataUtil
from log_module import async_log_util, log_export
from log_module.log import hx_logger_l2_sell_delegate, hx_logger_l2_sell_deal
from log_module.log import hx_logger_l2_sell_delegate, hx_logger_l2_sell_deal, logger_debug
from utils import tool
class L2LimitUpSellDataManager:
@@ -23,11 +25,11 @@
    __delegating_sell_num_dict = {}
    @classmethod
    def add_l2_origin_data(cls, code, origin_datas):
    def add_l2_data(cls, code, add_datas):
        """
        添加L2委托原始数据
        @param code: 代码
        @param origin_datas: 原始数据
        @param add_datas: 新增的格式化数据
        @return:
        """
        try:
@@ -39,25 +41,23 @@
                cls.__delegating_sell_num_dict[code] = 0
            limit_up_price = gpcode_manager.get_limit_up_price_as_num(code)
            for d in origin_datas:
                order_no, price, volume = d[8], d[1], d[2]
                if price != limit_up_price:
                    continue
                if d[9] == 'D':
                    if d[3] != '1':
                        # 卖撤
                        cls.__order_no_set_dict[code].discard(order_no)
                        cls.__delegating_sell_num_dict[code] -= volume
                        async_log_util.l2_data_log.info(hx_logger_l2_sell_delegate,
                                                        f"{code}-卖撤-{order_no, price, volume}")
                else:
                    if d[3] != '1':
                        # 卖
                        cls.__order_no_data_map_dict[code][order_no] = (order_no, price, volume)
                        cls.__order_no_set_dict[code].add(order_no)
                        cls.__delegating_sell_num_dict[code] += volume
                        async_log_util.l2_data_log.info(hx_logger_l2_sell_delegate,
                                                        f"{code}-卖-{order_no, price, volume}")
            for d in add_datas:
                val = d["val"]
                if L2DataUtil.is_limit_up_price_sell(val):
                    # 卖
                    order_no, price, volume = val["orderNo"], val["price"], val["num"] * 100
                    cls.__order_no_data_map_dict[code][order_no] = (order_no, price, volume)
                    cls.__order_no_set_dict[code].add(order_no)
                    cls.__delegating_sell_num_dict[code] += volume
                    async_log_util.l2_data_log.info(hx_logger_l2_sell_delegate,
                                                    f"{code}-卖-{(order_no, price, volume)}-{cls.__delegating_sell_num_dict[code]}")
                elif L2DataUtil.is_limit_up_price_sell_cancel(val):
                    # 卖撤
                    order_no, price, volume = val["orderNo"], val["price"], val["num"] * 100
                    cls.__order_no_set_dict[code].discard(order_no)
                    cls.__delegating_sell_num_dict[code] -= volume
                    async_log_util.l2_data_log.info(hx_logger_l2_sell_delegate,
                                                    f"{code}-卖撤-{(order_no, price, volume)}-{cls.__delegating_sell_num_dict[code]}")
        except:
            pass
@@ -71,41 +71,42 @@
        return cls.__delegating_sell_num_dict.get(code)
    @classmethod
    def set_deal_datas(cls, code, datas):
    def set_deal_datas(cls, code, fdatas):
        """
        设置成交的卖单
        @param code:
        @param datas:  q.append((data['SecurityID'], data['TradePrice'], data['TradeVolume'],data['OrderTime'], data['MainSeq'], data['SubSeq'], data['BuyNo'],data['SellNo'], data['ExecType']))
        @param fdatas:  数据本身格式: (data['SecurityID'], data['TradePrice'], data['TradeVolume'],data['OrderTime'], data['MainSeq'], data['SubSeq'], data['BuyNo'],data['SellNo'], data['ExecType'])
                        [(数据本身, 是否主动买, 是否涨停, 总成交额, 不含ms时间,含ms时间)]
        @return: 是否触发计算
        """
        try:
            limit_up_price = gpcode_manager.get_limit_up_price_as_num(code)
            has_limit_up_active_buy = False
            order_no_set = cls.__order_no_set_dict.get(code)
            if order_no_set is None:
                order_no_set = set()
            for d in datas:
                if d[1] != limit_up_price:
                    continue
            # 统计涨停卖单的成交
            # 卖单成交字典
            __deal_order_volume_dict = {}
            for d in fdatas:
                # 是否有涨停主动买成交
                if d[6] < d[7]:
                if not d[1] or not d[2]:
                    continue
                has_limit_up_active_buy = True
                break
            total_deal_volume = 0
            if code in cls.__delegating_sell_num_dict:
                for d in datas:
                    # 减去
                    if d[7] in order_no_set:
                        total_deal_volume += d[2]
                cls.__delegating_sell_num_dict[code] -= total_deal_volume
                if d[0][7] not in __deal_order_volume_dict:
                    __deal_order_volume_dict[d[0][7]] = 0
                __deal_order_volume_dict[d[0][7]] += d[0][2]
            if has_limit_up_active_buy:
                # 减去
            add_order_nos = order_no_set & __deal_order_volume_dict.keys()
            _total_deal_volume = sum([__deal_order_volume_dict[x] for x in add_order_nos])
            if code in cls.__delegating_sell_num_dict:
                cls.__delegating_sell_num_dict[code] -= _total_deal_volume
            if _total_deal_volume > 0:
                l2_log.info(code, hx_logger_l2_sell_deal,
                            f"涨停主动买成交:{_total_deal_volume}")
                # 打印日志
                async_log_util.l2_data_log.info(hx_logger_l2_sell_deal,
                                                f"有涨停主动卖:{code}-{datas[-1][3]}-{cls.__delegating_sell_num_dict.get(code)}, 成交量-{total_deal_volume}")
        except:
            pass
                l2_log.info(code, hx_logger_l2_sell_deal,
                            f"有涨停主动卖:{code}-{fdatas[-1][0][3]}-{cls.__delegating_sell_num_dict.get(code)}, 成交量-{_total_deal_volume}")
        except Exception as e:
            logger_debug.exception(e)
    @classmethod
    def clear_data(cls, code):
@@ -114,22 +115,56 @@
        @param code:
        @return:
        """
        if code in cls.__order_no_set_dict:
            cls.__order_no_set_dict.pop(code)
        if cls.__order_no_set_dict.get(code):
            cls.__order_no_set_dict[code].clear()
        if code in cls.__order_no_data_map_dict:
            cls.__order_no_data_map_dict.pop(code)
        if cls.__order_no_data_map_dict.get(code):
            cls.__order_no_data_map_dict[code].clear()
        if code in cls.__delegating_sell_num_dict:
            cls.__delegating_sell_num_dict.pop(code)
        if cls.__delegating_sell_num_dict.get(code):
            cls.__delegating_sell_num_dict[code] = 0
            l2_log.info(code, hx_logger_l2_sell_delegate,
                        f"出现主动卖清除数据:{code}")
if __name__ == "__main__":
    code = "300479"
    datas = log_export.load_huaxin_l2_sell_deal(code).get(code)
    # 测试涨停总卖吃掉的情况
    code = "002681"
    datas = log_export.load_huaxin_l2_sell_deal_list(code).get(code)
    print(datas)
    total_volume = sum([x[1] for x in datas])
    print("涨停卖成交", total_volume * 20.41)
    deal_datas = []
    deal_order_nos = set()
    for i in range(len(datas)):
        if 100100 <= int(datas[i][0].replace(":", "")) <= 100230:
            deal_datas.append(datas[i])
    for x in deal_datas:
        for xx in x[1]:
            deal_order_nos.add(xx[7])
    total_deal_volume = sum([sum([xx[2] for xx in x[1]]) for x in deal_datas])
    print("涨停卖成交量", total_deal_volume)
    datas = log_export.load_huaxin_l2_sell_delegate(code).get(code)
    total_delegate = sum([x[2][2] for x in datas])
    print("总委托",total_delegate)
    fdatas = []
    for x in datas:
        # if int("101821") < int(x[0].replace(":", "")) < int("102841"):
        if 14578165 >= x[2][0] >= 14565438:
            fdatas.append(x)
    delegate_order_nos = set()
    total_delegate = 0
    for x in fdatas:
        if x[1] == '卖':
            total_delegate += x[2][2]
            delegate_order_nos.add(x[2][0])
        elif x[1] == '卖撤':
            total_delegate -= x[2][2]
            delegate_order_nos.discard(x[2][0])
    print(fdatas)
    for d in fdatas:
        print(d)
    print("总成交", total_deal_volume, total_deal_volume * 17.28)
    print("总委托", total_delegate, total_delegate * 17.28)
    print("委托剩余", total_delegate - total_deal_volume, (total_delegate - total_deal_volume) * 17.28)
    not_deal_order_nos = delegate_order_nos - deal_order_nos
    for x in not_deal_order_nos:
        print("未成交:", x)