"""
|
激进买策略管理
|
"""
|
# 上一个50W的起始时间:{code:"09:30:00.120"}
|
from l2.huaxin import l2_huaxin_util
|
from l2.l2_limitup_sell_data_manager import L2LimitUpSellDataManager
|
from l2.l2_sell_manager import L2MarketSellManager
|
from l2.l2_transaction_data_manager import HuaXinSellOrderStatisticManager
|
from log_module import async_log_util
|
from log_module.log import logger_l2_radical_buy, hx_logger_l2_transaction
|
from utils import tool
|
|
# 不买入
|
BUY_MODE_NONE = 0
|
# 直接买入
|
BUY_MODE_DIRECT = 1
|
# 根据L2买入
|
BUY_MODE_BY_L2 = 2
|
|
# 开始计时时间
|
__start_time_dict = {}
|
# 转换时间缓存
|
__huaxin_timestamp_convert_temp = {}
|
# 主动成交的累计金额
|
__deal_active_buy_total_money = {}
|
# 最近成交的买单信息{code:[订单号,量,金额]}
|
__latest_deal_active_buy_order = {}
|
|
|
def __get_deal_rate_by(code, huaxin_timestamp):
|
"""
|
|
@param code: 代码
|
@param huaxin_timestamp: 华鑫成交时间戳
|
@return:买入方式, 消息
|
"""
|
"""
|
获取备用成交比例
|
@param code:
|
@return:
|
"""
|
refer_sell_data = L2MarketSellManager().get_refer_sell_data(code, l2_huaxin_util.convert_time(
|
huaxin_timestamp))
|
async_log_util.info(logger_l2_radical_buy, f"参考总卖额(备用):{code}-{refer_sell_data}")
|
if refer_sell_data:
|
# 如果总卖额大于500w,成交到一半就直接扫
|
if refer_sell_data[1] >= 500 * 1e4:
|
THRESH_HOLD_VOLUME = refer_sell_data[2]
|
if refer_sell_data[4] and len(refer_sell_data[4]) < 10:
|
# 小于10挡,最后一档才是涨停价
|
if refer_sell_data[4][-1][1] > 0:
|
THRESH_HOLD_VOLUME = refer_sell_data[4][-1][1]
|
|
refer_sell_time = refer_sell_data[0]
|
# 获取最近的主动买成交量
|
limit_up_deal_infos = HuaXinSellOrderStatisticManager.get_latest_6s_active_buy_deal_volumes(
|
code)
|
async_log_util.info(logger_l2_radical_buy, f"最近涨停主动买成交(备用):{code}-{limit_up_deal_infos}")
|
deal_volume = 0
|
for i in range(0, len(limit_up_deal_infos)):
|
# >=统计到的总卖
|
if int(refer_sell_time.replace(":", "")) > int(
|
limit_up_deal_infos[i][0].replace(":", "")):
|
break
|
deal_volume += limit_up_deal_infos[i][1]
|
async_log_util.info(logger_l2_radical_buy, f"成交量(备用):{deal_volume}/{THRESH_HOLD_VOLUME}")
|
deal_rate = round(deal_volume / THRESH_HOLD_VOLUME, 2)
|
if deal_rate >= 0.5:
|
return BUY_MODE_DIRECT, f"达到买入条件(备用):比例-{deal_rate}"
|
else:
|
return BUY_MODE_NONE, f"尚未达到买入比例(备用):{deal_rate}"
|
else:
|
return BUY_MODE_BY_L2, f"总卖额小于500w(备用)({refer_sell_data[1]})"
|
else:
|
return BUY_MODE_NONE, "尚未获取到总卖额(备用)"
|
|
|
def limit_up_active_buy_deal(code, transaction_datas):
|
async_log_util.info(hx_logger_l2_transaction, f"板上成交:{code}-{transaction_datas}")
|
"""
|
涨停主动买成交
|
@param code:
|
@param transaction_datas: # q.append((data['SecurityID'], data['TradePrice'], data['TradeVolume'],
|
# data['OrderTime'], data['MainSeq'], data['SubSeq'], data['BuyNo'],
|
# data['SellNo'], data['ExecType']))
|
@return: 买入方式, 消息
|
"""
|
# ---------初始化-------------
|
if code not in __huaxin_timestamp_convert_temp:
|
__huaxin_timestamp_convert_temp[code] = {}
|
if code not in __deal_active_buy_total_money:
|
__deal_active_buy_total_money[code] = 0
|
if code not in __latest_deal_active_buy_order:
|
__latest_deal_active_buy_order[code] = ['', 0, 0]
|
for transaction_data in transaction_datas:
|
# 当遇到大单之后才需要计算累计成交
|
# 统计金额
|
money = transaction_data[1] * transaction_data[2]
|
price = transaction_data[1]
|
|
# 统计当前的买单
|
if __latest_deal_active_buy_order[code][0] == transaction_data[6]:
|
__latest_deal_active_buy_order[code][1] += transaction_data[2]
|
__latest_deal_active_buy_order[code][2] += money
|
else:
|
__latest_deal_active_buy_order[code] = [transaction_data[6], transaction_data[2], money]
|
|
if code not in __start_time_dict:
|
# 判断买单成交的金额,如果金额大于50w就作为计时起始点
|
if __latest_deal_active_buy_order[code][2] >= 500000:
|
# 设置计时起点,将当前的数据清零
|
__start_time_dict[code] = l2_huaxin_util.convert_time(transaction_data[3], with_ms=True)
|
__deal_active_buy_total_money[code] = __latest_deal_active_buy_order[code][2]
|
else:
|
__deal_active_buy_total_money[code] += money
|
# 已经开始计数
|
THRESHOLD_TIME = 1000 if tool.is_sh_code(code) else 500
|
huaxin_timestamp = transaction_data[3]
|
time_str_with_ms = __huaxin_timestamp_convert_temp[code].get(huaxin_timestamp)
|
if not time_str_with_ms:
|
__huaxin_timestamp_convert_temp[code].clear()
|
time_str_with_ms = l2_huaxin_util.convert_time(huaxin_timestamp, with_ms=True)
|
__huaxin_timestamp_convert_temp[code][huaxin_timestamp] = time_str_with_ms
|
|
if tool.trade_time_sub_with_ms(time_str_with_ms, __start_time_dict[code]) > THRESHOLD_TIME:
|
__start_time_dict.pop(code)
|
__deal_active_buy_total_money[code] = 0
|
return BUY_MODE_NONE, f"距离上个大单成交超过{THRESHOLD_TIME}ms"
|
|
price = transaction_datas[-1][1]
|
huaxin_timestamp = transaction_datas[-1][3]
|
# 判断
|
selling_num = L2LimitUpSellDataManager.get_delegating_sell_num(code)
|
if selling_num:
|
total_sell = __deal_active_buy_total_money[code] + selling_num * price
|
rate = round(__deal_active_buy_total_money[code] / total_sell, 2)
|
if rate > 0.5:
|
# 成交的比例
|
if total_sell > 500 * 1e4:
|
return BUY_MODE_DIRECT, f"剩余涨停总卖额-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate} "
|
else:
|
return BUY_MODE_BY_L2, f"剩余涨停总卖额小于500w-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate} "
|
else:
|
return BUY_MODE_NONE, f"被动卖成交比例未达到:剩余涨停总卖额-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}"
|
else:
|
return __get_deal_rate_by(code, huaxin_timestamp)
|