"""
|
激进买策略管理
|
"""
|
# 上一个50W的起始时间:{code:"09:30:00.120"}
|
from code_attribute import code_volumn_manager, gpcode_manager
|
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, BigOrderDealManager
|
from log_module import async_log_util
|
from log_module.log import logger_l2_radical_buy, hx_logger_l2_transaction
|
from trade import radical_buy_data_manager
|
from trade.radical_buy_data_manager import EveryLimitupBigDealOrderManager
|
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 process_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)
|
# 获取当前的成交量比
|
limit_up_price = gpcode_manager.get_limit_up_price_as_num(code)
|
volume_rate = code_volumn_manager.CodeVolumeManager().get_volume_rate(code, total_sell_volume=int(
|
total_sell / limit_up_price),
|
with_info=False)
|
if volume_rate is None:
|
volume_rate = 0.5
|
# 根据大单判断是否可以扫
|
big_order_deal_result = __is_big_order_deal_enough(code, volume_rate)
|
if not big_order_deal_result[0]:
|
return BUY_MODE_NONE, big_order_deal_result[1]
|
|
THRESHOLD_RATE = radical_buy_data_manager.get_volume_rate_threshold(code, volume_rate)
|
if rate >= THRESHOLD_RATE:
|
# 成交的比例
|
# if total_sell > 1000 * 1e4:
|
if total_sell >= 0:
|
return BUY_MODE_DIRECT, f"剩余涨停总卖额-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}/{THRESHOLD_RATE}"
|
else:
|
return BUY_MODE_BY_L2, f"剩余涨停总卖额小于500w-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}/{THRESHOLD_RATE} "
|
else:
|
return BUY_MODE_NONE, f"被动卖成交比例未达到:剩余涨停总卖额-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}/{THRESHOLD_RATE}"
|
else:
|
# 根据量比与大单成交数量判断是否可扫
|
volume_rate = code_volumn_manager.CodeVolumeManager().get_volume_rate(code, with_info=False)
|
if volume_rate is None:
|
volume_rate = 0.5
|
# 根据大单判断是否可以扫
|
big_order_deal_result = __is_big_order_deal_enough(code, volume_rate)
|
if not big_order_deal_result[0]:
|
return BUY_MODE_NONE, big_order_deal_result[1]
|
return __get_deal_rate_by(code, huaxin_timestamp)
|
|
|
def __is_big_order_deal_enough(code, volume_rate):
|
"""
|
大单成交是否足够
|
@param code:
|
@param volume_rate:
|
@return:
|
"""
|
limit_up_price = gpcode_manager.get_limit_up_price_as_num(code)
|
refer_volume = code_volumn_manager.CodeVolumeManager().get_max_volume_in_5days(code)
|
if refer_volume is None:
|
refer_volume = 0
|
|
money_y = int(refer_volume * limit_up_price / 1e8)
|
money_y = min(money_y, 50)
|
money_y = max(money_y, 5)
|
# 计算大单参考数量
|
threshold_count = int(round(0.4 * money_y))
|
current_big_order_deal_count = EveryLimitupBigDealOrderManager.get_big_buy_deal_order_count(code)
|
if volume_rate >= 0.5 or True:
|
# 按量大于50%算
|
# 当换手量>50%时,则,不需要每次扫入时需要≥2笔大单,而是累计需要≥2笔大单即可
|
deal_big_order_count = BigOrderDealManager().get_total_buy_count(code)
|
if deal_big_order_count >= threshold_count:
|
return True, f"量比-{volume_rate}, 总大单成交数量({deal_big_order_count})>={threshold_count}"
|
else:
|
return False, f"量比-{volume_rate}, 总大单成交数量({deal_big_order_count})<{threshold_count}"
|
else:
|
if current_big_order_deal_count >= threshold_count:
|
return True, f"量比-{volume_rate}, 本次大单成交数量({current_big_order_deal_count})>={threshold_count}"
|
else:
|
return False, f"量比-{volume_rate}, 本次大单成交数量({current_big_order_deal_count})<{threshold_count}"
|