""" 涨停卖数据管理 """ 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, logger_debug from utils import tool class L2LimitUpSellDataManager: """ 涨停卖数据管理: 用来扫代码使用,当涨停卖有成交的时候就代表在吃最后一档 此时统计涨停卖的金额作为快照 当板上成交额大于涨停卖数据一定的比值就下单 """ # 卖单集合 __order_no_set_dict = {} # 订单号与数据的对照表:{code:{orderno:[order_no,price,volume]}} __order_no_data_map_dict = {} # 挂起的卖手数 __delegating_sell_num_dict = {} @classmethod def add_l2_data(cls, code, add_datas): """ 添加L2委托原始数据 @param code: 代码 @param add_datas: 新增的格式化数据 @return: """ try: if code not in cls.__order_no_set_dict: cls.__order_no_set_dict[code] = set() if code not in cls.__order_no_data_map_dict: cls.__order_no_data_map_dict[code] = {} if code not in cls.__delegating_sell_num_dict: cls.__delegating_sell_num_dict[code] = 0 limit_up_price = gpcode_manager.get_limit_up_price_as_num(code) 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 @classmethod def get_delegating_sell_num(cls, code): """ 获取处于委托状态的卖单总手数 @param code: @return: """ return cls.__delegating_sell_num_dict.get(code) @classmethod def set_deal_datas(cls, code, fdatas): """ 设置成交的卖单 @param code: @param fdatas: 数据本身格式: (data['SecurityID'], data['TradePrice'], data['TradeVolume'],data['OrderTime'], data['MainSeq'], data['SubSeq'], data['BuyNo'],data['SellNo'], data['ExecType']) [(数据本身, 是否主动买, 是否涨停, 总成交额, 不含ms时间,含ms时间)] @return: 是否触发计算 """ try: order_no_set = cls.__order_no_set_dict.get(code) if order_no_set is None: order_no_set = set() # 统计涨停卖单的成交 # 卖单成交字典 __deal_order_volume_dict = {} for d in fdatas: # 是否有涨停主动买成交 if not d[1] or not d[2]: continue 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] # 减去 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}") # 打印日志 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): """ 清除数据:当出现主动卖的时候就可以清除数据 @param code: @return: """ if cls.__order_no_set_dict.get(code): cls.__order_no_set_dict[code].clear() if cls.__order_no_data_map_dict.get(code): cls.__order_no_data_map_dict[code].clear() 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 = "002681" datas = log_export.load_huaxin_l2_sell_deal_list(code).get(code) print(datas) 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) 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)