"""
|
涨停卖数据管理
|
"""
|
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)
|