"""
代码信息对外输出
"""
# score_info 得分信息
# 下单参数信息
# 选股宝
# 市场热度
import code_volumn_manager
import global_data_loader
import global_util
import gpcode_manager
import juejin
import limit_up_time_manager
import tool
from l2 import l2_data_manager, l2_data_util, transaction_progress
from third_data import hot_block_data_process
from trade import first_code_score_manager, l2_trade_factor
from trade.l2_trade_factor import L2TradeFactorUtil
def __format_data(code_info, score_info, buy_params_info, xgb_code_info, xgb_infos):
html = ""
html += f"
{code_info[1]} {code_info[0]}
"
if score_info:
html += "-----买前评分-------
"
score_types = ["换手量能", "竞价强度", "资金力度", "日线形态", "历史股性", "板块热度", "上板时间", "市值大小", "股价大小"]
html += ""
for i in range(0, len(score_info[1])):
html += f"{score_types[i]} | {score_info[1][i]} | {score_info[2][i]} |
"
html += f"评分求和: | {score_info[0]} | |
"
html += f"
"
if buy_params_info:
html += "
-----交易参数-------
"
titles = ["买入意愿", "安全笔数", "动态M值", "买前大单", "成交进度", "买入信号", "买入执行位"]
for i in range(0, len(titles)):
html += f"{titles[i]}: | {buy_params_info[i]} |
"
html += "
"
if xgb_code_info:
html += "
-----选股宝---------
"
xgb_code_info_dates = ["今天", "昨天", "前天", "之前"]
for i in range(0, len(xgb_code_info)):
html += f"{xgb_code_info_dates[i]}:
"
if xgb_code_info[i]:
for info in xgb_code_info[i]:
if i == 0:
html += f"【{info[0]}】,共【{info[1]}】只票涨停
第【{info[2]}】涨停,现价【{info[3]}】元,涨幅【{info[4]}】
"
else:
html += f"【{info[0]}】,共【{info[1]}】只票涨停
第【{info[2]}】涨停,现价【{info[3]}】元,涨幅【{info[4]}】
"
else:
html += f"无
"
if xgb_infos:
html += "
-----市场热度-------
"
for info in xgb_infos:
html += f"{info} |
"
html += ""
return html
def get_output_html(code):
day = tool.get_now_date_str()
is_target_code = gpcode_manager.FirstCodeManager.is_in_first_record(code)
code_info = [code, gpcode_manager.get_code_name(code)]
score_info = None
buy_params_info = None
xgb_infos = None
if is_target_code:
limit_up_price = gpcode_manager.get_limit_up_price(code)
limit_up_time = limit_up_time_manager.get_limit_up_time(code)
volume_rate, volume_info = code_volumn_manager.get_volume_rate(code, True)
(score, score_list), score_source_list = first_code_score_manager.get_score(code, volume_rate, limit_up_time,
True)
################################买前评分################################
# ["换手量能", "竞价强度", "资金力度", "K线形态", "历史股性", "板块热度", "上板时间", "市值大小","股价大小"]
score_list_new = []
score_source_list_new = []
# 换手量能
score_list_new.append(score_list[6])
# 获取当前量信息
max_60, yest = code_volumn_manager.get_histry_volumn(code)
today = code_volumn_manager.get_today_volumn(code)
score_source_list_new.append(f"实时量【{round(int(today)/10000,2)}万手】÷前高量【{round(max_60[0]/10000,2)}万手-{max_60[1]}】=【{round(score_source_list[6]*100,2)}%】")
# 竞价强度
score_list_new.append(score_list[2])
score_source_list_new.append(f"开盘啦今日委停【{score_source_list[2] if score_source_list[2] else 0}万】")
# 资金力度
score_list_new.append(score_list[8])
score_source_list_new.append(f"累计金额【{score_source_list[8][0] / 10000}万】&固定m值【{score_source_list[8][1] / 10000}万】")
# K线形态
k_score = 0
k_source = []
for k in score_list[3]:
k_score += k
# (15个交易日是否涨幅24.9%,是否破前高,是否超跌,是否接近前高,是否N,是否V)
for k in range(0, len(score_source_list[3])):
if k == 0:
if score_source_list[3][k][0]:
k_source.append("【涨幅过高】")
elif k == 1:
if score_source_list[3][k][0]:
k_source.append("【突破前高】")
elif k == 2:
if score_source_list[3][k][0]:
k_source.append("【超跌补涨】")
elif k == 3:
if score_source_list[3][k][0]:
k_source.append(f"【逼近前高-{score_source_list[3][k][1]}】")
elif k == 4:
if score_source_list[3][k][0]:
k_source.append("【N字型】")
elif k == 5:
if score_source_list[3][k][0]:
k_source.append("【V字型】")
if not score_source_list[3][1][0] and not score_source_list[3][2][0] and not score_source_list[3][4][0] and not \
score_source_list[3][5][0]:
k_source.append("【不满足任何形态】")
score_list_new.append(k_score)
score_source_list_new.append("/".join(k_source))
# 历史股性
nature_score = 0
nature_source = []
for k in score_list[4]:
nature_score += k
for n in range(0, len(score_source_list[4])):
if n == 0:
if not score_source_list[4][n]:
nature_source.append("无涨停")
else:
nature_source.append("有涨停")
if n == 1:
nature_source.append(f"首板溢价率【{score_source_list[4][2]}】")
score_list_new.append(nature_score)
score_source_list_new.append(",".join(nature_source))
# 板块热度
hot_block_score = 0
hot_block_source = []
for k in score_list[5]:
hot_block_score += k
for n in range(0, len(score_source_list[5])):
if n == 1:
hot_block_source.append(f"【{score_source_list[5][0]}】共{score_source_list[5][n]}个涨停")
elif n == 2:
hot_block_source.append(f"共{score_source_list[5][n]}个炸板")
score_list_new.append(hot_block_score)
score_source_list_new.append(",".join(hot_block_source))
# 上板时间
score_list_new.append(score_list[7])
score_source_list_new.append(f"上板时间【{score_source_list[7]}】")
# 市值大小
score_list_new.append(score_list[0])
score_source_list_new.append(f"自由市值【{round(score_source_list[0] / 100000000, 2)}亿】")
# 股价大小
score_list_new.append(score_list[1])
score_source_list_new.append(f"现价【{score_source_list[1]}】元")
score_info = (score, score_list_new, score_source_list_new)
# zyltgb, limit_price, bidding, k_form, code_nature, hot_block, volume_rate, limit_up_time,
# deal_big_money
###############################下单信息###############################
# 获取买入意愿
volume_rate = score_source_list[6]
__L2PlaceOrderParamsManager = l2_trade_factor.L2PlaceOrderParamsManager(code, True, volume_rate,
code_volumn_manager.get_volume_rate_index(
volume_rate),
(score, score_list))
__base_L2PlaceOrderParamsManager = l2_trade_factor.L2PlaceOrderParamsManager(code, False, volume_rate,
code_volumn_manager.get_volume_rate_index(
volume_rate),
(score, score_list))
buy_params_info = []
if -1 < __L2PlaceOrderParamsManager.score_index < 3:
buy_params_info.append("【主动买入】")
elif __L2PlaceOrderParamsManager.score_index < 0:
buy_params_info.append("【不执行买入】")
else:
buy_params_info.append("【被动买入】")
# 安全笔数
safe_count = __L2PlaceOrderParamsManager.get_safe_count()
base_safe_count, min_count, max_count = L2TradeFactorUtil.get_safe_buy_count(code, True)
buy_params_info.append(f"固定安全笔数【{base_safe_count}】笔,衰减后安全笔数【{safe_count}】笔")
# 动态M值
m = __L2PlaceOrderParamsManager.get_m_val()
zyltgb = global_util.zyltgb_map.get(code)
if zyltgb is None:
global_data_loader.load_zyltgb()
zyltgb = global_util.zyltgb_map.get(code)
base_m = L2TradeFactorUtil.get_base_safe_val(zyltgb)
buy_params_info.append(f"固定M值【{base_m / 10000}万】,动态M值【{m[0] / 10000}万】 ")
# 买前大单
big_num = __L2PlaceOrderParamsManager.get_big_num_count()
base_big_num = __base_L2PlaceOrderParamsManager.get_big_num_count()
buy_params_info.append(f"固定买前大单【{base_big_num}】笔,衰减后买前大单【{big_num}】笔")
# 成交进度
total_datas = l2_data_util.local_today_datas.get(code)
if total_datas is None:
l2_data_util.load_l2_data(code)
total_datas = l2_data_util.local_today_datas.get(code)
trade_progress, is_default = transaction_progress.TradeBuyQueue().get_traded_index(code)
if trade_progress is None or trade_progress < 0 or is_default:
buy_params_info.append("未识别")
else:
data = total_datas[trade_progress]
buy_params_info.append(
f"【{data['val']['time']}】、【{data['val']['num']}手】、【{round(data['val']['num'] * float(data['val']['price']) * 100 / 10000, 1)}万】")
# 买入信号
buy_single_index, buy_exec_index, compute_index, num, count, max_num_set, volume_rate = l2_data_manager.TradePointManager.get_buy_compute_start_data(
code)
if buy_single_index is None:
buy_params_info.append("无信号")
else:
data = total_datas[buy_single_index]
buy_params_info.append(
f"【{data['val']['time']}】、【{data['val']['num']}手】、【{round(data['val']['num'] * float(data['val']['price']) * 100 / 10000, 1)}万】")
if buy_exec_index is None or buy_exec_index < 0:
buy_params_info.append("未下单")
else:
data = total_datas[buy_exec_index]
buy_params_info.append(
f"【{data['val']['time']}】、【{data['val']['num']}手】、【{round(data['val']['num'] * float(data['val']['price']) * 100 / 10000, 1)}万】")
##############################选股宝##################################
xgb_code_info = []
for i in range(0, 4):
xgb_datas = hot_block_data_process.XGBHotBlockDataManager.list_by_code(code, day)
datas = []
if xgb_datas:
for data in xgb_datas:
block = data[2]
block_datas = hot_block_data_process.XGBHotBlockDataManager.list_by_block(block, day)
block_datas = list(block_datas)
limit_up_count = 0
limit_up_time = None
for d in block_datas:
if len(d[4]) > 6:
limit_up_count += 1
if d[3] == code:
limit_up_time = d[4]
# 根据涨停时间排序
block_datas.sort(key=lambda d: (d[4] if len(d[4]) > 6 else '15:00:00'))
for i in range(len(block_datas)):
if block_datas[i][3] == code:
datas.append(
(block, limit_up_count, (i + 1) if limit_up_time is not None else (limit_up_count + 1),
block_datas[i][5], block_datas[i][6]))
break
xgb_code_info.append(datas)
day = juejin.JueJinManager.get_previous_trading_date(day)
##############################热门风口##################################
xgb_infos = []
xgb_latest_datas = hot_block_data_process.XGBHotBlockDataManager.latest_datas
if not xgb_latest_datas:
xgb_infos.append('暂未获取到数据')
else:
for block in xgb_latest_datas:
limit_up_count = 0
for code_data in block[2]:
if len(code_data[4]) > 6:
limit_up_count += 1
xgb_infos.append(f"【{block[0]}】,涨幅【{block[1]}】,共【{limit_up_count}】个涨停")
return __format_data(code_info, score_info, buy_params_info, xgb_code_info, xgb_infos)
if __name__ == '__main__':
code = "002410"
day = '2023-03-27'
xgb_datas = hot_block_data_process.XGBHotBlockDataManager.list_by_code(code, day)
datas = []
if xgb_datas:
for data in xgb_datas:
block = data[2]
block_datas = hot_block_data_process.XGBHotBlockDataManager.list_by_block(block, day)
block_datas = list(block_datas)
limit_up_count = 0
limit_up_time = None
for d in block_datas:
if len(d[4]) > 6:
limit_up_count += 1
if d[3] == code:
limit_up_time = d[4]
# 根据涨停时间排序
block_datas.sort(key=lambda d: (d[4] if len(d[4]) > 6 else '15:00:00'))
for i in range(len(block_datas)):
if block_datas[i][3] == code:
datas.append((block, limit_up_count, (i + 1) if limit_up_time is not None else (limit_up_count + 1),
block_datas[i][5], block_datas[i][6]))
break