| | |
| | | import log |
| | | import tool |
| | | from l2 import l2_data_manager, l2_data_util, transaction_progress, l2_data_manager_new, code_price_manager |
| | | from third_data import hot_block_data_process |
| | | from third_data import kpl_data_manager, kpl_util |
| | | from trade import first_code_score_manager, l2_trade_factor, trade_manager, l2_trade_util |
| | | from trade.l2_trade_factor import L2TradeFactorUtil |
| | | import trade.deal_big_money_manager |
| | | from jinja2 import Environment, FileSystemLoader |
| | | |
| | | base_output_content = {} |
| | | |
| | | __kplDataManager = kpl_data_manager.KPLDataManager() |
| | | |
| | | |
| | | def __get_base_html_content(): |
| | |
| | | return f"<head><style>{base_output_content['css']}</style></head>" |
| | | |
| | | |
| | | def __format_data(code_info, score_info, buy_params_info, xgb_code_info, xgb_infos, codes_score, trade_info): |
| | | html = __get_base_html_content() |
| | | html += "<body>" |
| | | html += f"<h2>{code_info[1]} {code_info[0]} ({code_info[2]})</h2><br>" |
| | | |
| | | if score_info: |
| | | html += "<b>-----买前评分-------</b><br>" |
| | | score_types = ["换手量能", "竞价强度", "资金力度", "日线形态", "历史股性", "板块热度", "上板时间", "市值大小", "股价大小"] |
| | | html += "<table>" |
| | | for i in range(0, len(score_info[1])): |
| | | html += f"<tr><td>{score_types[i]}</td><td>{score_info[1][i]}</td><td>{score_info[2][i]}</td></tr>" |
| | | html += f"<tr><td><b>评分求和:</td><td>{score_info[0]}</b></td><td></td></tr>" |
| | | html += f"</table><br>" |
| | | html += "\n" |
| | | if buy_params_info: |
| | | html += "<b><br>-----交易参数-------<br></b><table>" |
| | | titles = ["买入意愿", "安全笔数", "动态M值", "买前大单", "成交进度", "买入信号", "买入执行位"] |
| | | for i in range(0, len(titles)): |
| | | html += f"<tr><td>{titles[i]}:</td><td>{buy_params_info[i]}</td></tr>" |
| | | html += "</table><br>" |
| | | html += "\n" |
| | | if xgb_code_info: |
| | | html += "<b><br>-----选股宝---------<br></b>" |
| | | xgb_code_info_dates = ["今天", "昨天", "前天", "之前"] |
| | | for i in range(0, len(xgb_code_info)): |
| | | if xgb_code_info[i]: |
| | | html += f"{xgb_code_info_dates[i]}:<br>" |
| | | for info in xgb_code_info[i]: |
| | | if i == 0: |
| | | html += f"【<font color='red'>{info[0]}</font>】,共【<font color='red'>{info[1]}</font>】只票涨停<br>第【<font color='red'>{info[2]}</font>】涨停,现价【<font color='red'>{info[3]}</font>】元,涨幅【<font color='red'>{info[4]}</font>】<br><br>" |
| | | else: |
| | | html += f"【{info[0]}】,共【{info[1]}】只票涨停<br>第【{info[2]}】涨停,现价【{info[3]}】元,涨幅【{info[4]}】<br><br>" |
| | | html += "\n" |
| | | if codes_score[0]: |
| | | html += "<b>-----主动买入-------</b><br>" |
| | | html += "<table>" |
| | | for i in range(0, len(codes_score[0])): |
| | | if i % 3 == 0: |
| | | html += "<tr>" |
| | | html += f"<td><font color='red'>{'*' if codes_score[0][i][3] else ''}{codes_score[0][i][1]}({codes_score[0][i][0]}):{codes_score[0][i][2]}</font></td>" |
| | | if i % 3 == 2 or i == len(codes_score[0]) - 1: |
| | | html += "</tr>" |
| | | html += "</table><br>\n" |
| | | |
| | | if codes_score[1]: |
| | | html += "<b>-----被动买入-------</b><br>" |
| | | html += "<table>" |
| | | for i in range(0, len(codes_score[1])): |
| | | if i % 3 == 0: |
| | | html += "<tr>" |
| | | html += f"<td><font color='#000080'>{'*' if codes_score[1][i][3] else ''}{codes_score[1][i][1]}({codes_score[1][i][0]}):{codes_score[1][i][2]}</font></td>" |
| | | if i % 3 == 2 or i == len(codes_score[1]) - 1: |
| | | html += "</tr>" |
| | | html += "</table><br>\n" |
| | | |
| | | if codes_score[2] and False: |
| | | html += "<b>-----不买入-------</b><br>" |
| | | html += "<table>" |
| | | for i in range(0, len(codes_score[2])): |
| | | if i % 4 == 0: |
| | | html += "<tr>" |
| | | html += f"<td>{codes_score[2][i][1]}:{codes_score[2][i][2]}</td>" |
| | | if i % 4 == 3 or i == len(codes_score[1]) - 1: |
| | | html += "</tr>" |
| | | html += "</table><br>\n" |
| | | |
| | | if trade_info: |
| | | html += "<b>-----今日挂撤记录-------</b><br>" |
| | | html += "<br>今日是否炸板:" |
| | | if trade_info[0] is not None: |
| | | html += f"炸板-{trade_info[0]}" |
| | | else: |
| | | html += f"未炸板" |
| | | if trade_info[1]: |
| | | html += "<table>" |
| | | for i in range(0, len(trade_info[1])): |
| | | if i % 2 == 0: |
| | | html += "<tr>" |
| | | html += f"<td>{trade_info[1][i]}</td>" |
| | | if i % 2 == 1 or i == len(codes_score[0]) - 1: |
| | | html += "</tr>" |
| | | html += "</table><br>" |
| | | html += "<br>\n" |
| | | |
| | | if xgb_infos: |
| | | html += "<b><br>-----市场热度-------<br></b><table>" |
| | | for info in xgb_infos: |
| | | html += f"<tr><td>{info[0]}<br><div style=''>{info[1]}</div></td></tr>" |
| | | html += "</table>" |
| | | html += "<br><br>" |
| | | html += "</body>" |
| | | return html |
| | | def render(params): |
| | | env = Environment(loader=FileSystemLoader('D:/workspace/trade/output')) |
| | | css = env.get_template('css/index.css') |
| | | params["css"] = css.render() |
| | | template = env.get_template('index.html') |
| | | html_content = template.render(params) |
| | | return html_content |
| | | |
| | | |
| | | def get_output_html(code): |
| | | def money_desc(money): |
| | | if money > 100000000: |
| | | return f"{round(money / 100000000, 2)}亿" |
| | | else: |
| | | return f"{round(money / 10000, 2)}万" |
| | | |
| | | params = { |
| | | "base_url": "http://192.168.3.252/kp/", |
| | | } |
| | | |
| | | day = tool.get_now_date_str() |
| | | is_target_code = gpcode_manager.FirstCodeManager.is_in_first_record(code) |
| | | code_extra_infos=[] |
| | |
| | | # 获取白名单,黑名单 |
| | | if trade_manager. gpcode_manager.WantBuyCodesManager.is_in(code): |
| | | code_extra_infos.append("想买单") |
| | | params["code_name"] = f"{gpcode_manager.get_code_name(code)} {code} ({','.join(code_extra_infos)})" |
| | | |
| | | code_info = [code, gpcode_manager.get_code_name(code),",".join(code_extra_infos)] |
| | | score_info = None |
| | | buy_params_info = None |
| | | xgb_infos = None |
| | |
| | | l2_data_util.load_l2_data(code) |
| | | total_datas = l2_data_util.local_today_datas.get(code) |
| | | if is_target_code: |
| | | params["score_data"] = {} |
| | | 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) |
| | |
| | | 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) / 1000000, 2)}万手】÷前高量【{round(max_60[0] / 1000000, 2)}万手-{max_60[1]}】=【{round(score_source_list[6] * 100, 2)}%】") |
| | | params["score_data"]["volume"] = {"score": score_list[6], "now": f"{round(int(today) / 1000000, 2)}", |
| | | "high": {"num": round(max_60[0] / 1000000, 2), "date": max_60[1]}, |
| | | "rate": 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}万】") |
| | | params["score_data"]["bidding"] = {"score": score_list[2], |
| | | "money": (score_source_list[2] if score_source_list[2] else 0)} |
| | | |
| | | # 资金力度 |
| | | deal_indexes = trade.deal_big_money_manager.get_traded_indexes(code) |
| | | deal_info = "" |
| | | params["score_data"]["deal_big_money"] = {"score": score_list[8], "money": score_source_list[8][0] // 10000, |
| | | "base_money": score_source_list[8][1] // 10000} |
| | | if deal_indexes: |
| | | temps = [] |
| | | for index in deal_indexes: |
| | |
| | | start_index = temps[0] |
| | | end_index = temps[-1] |
| | | deal_info = f"【{total_datas[start_index]['val']['time']}&{total_datas[start_index]['val']['num']}手-{total_datas[end_index]['val']['time']}&{total_datas[end_index]['val']['num']}手】," |
| | | params["score_data"]["deal_big_money"]["start"] = {"time": total_datas[start_index]['val']['time'], |
| | | "num": total_datas[start_index]['val']['num']} |
| | | params["score_data"]["deal_big_money"]["end"] = {"time": total_datas[end_index]['val']['time'], |
| | | "num": total_datas[end_index]['val']['num']} |
| | | |
| | | score_list_new.append(score_list[8]) |
| | | score_source_list_new.append( |
| | | f"{deal_info}<br>累计金额【{score_source_list[8][0] // 10000}万】&固定m值【{score_source_list[8][1] // 10000}万】") |
| | | # K线形态 |
| | | k_score = 0 |
| | | k_source = [] |
| | |
| | | for k in range(0, len(score_source_list[3])): |
| | | if k == 0: |
| | | if score_source_list[3][k][0]: |
| | | k_source.append("【涨幅过高】") |
| | | k_source.append("涨幅过高") |
| | | elif k == 1: |
| | | if score_source_list[3][k][0]: |
| | | k_source.append("【突破前高】") |
| | | k_source.append("突破前高") |
| | | elif k == 2: |
| | | if score_source_list[3][k][0]: |
| | | k_source.append("【超跌补涨】") |
| | | k_source.append("超跌补涨") |
| | | elif k == 3: |
| | | if score_source_list[3][k][0]: |
| | | k_source.append(f"【逼近前高-{score_source_list[3][k][1]}】") |
| | | k_source.append(f"逼近前高-{score_source_list[3][k][1]}】") |
| | | elif k == 4: |
| | | if score_source_list[3][k][0]: |
| | | k_source.append("【N字型】") |
| | | k_source.append("N字型") |
| | | elif k == 5: |
| | | if score_source_list[3][k][0]: |
| | | k_source.append("【V字型】") |
| | | k_source.append("V字型") |
| | | elif k == 6: |
| | | if not score_source_list[3][k][0]: |
| | | k_source.append("【不满足任何形态】") |
| | | k_source.append("不满足任何形态") |
| | | elif k == 7: |
| | | if score_source_list[3][k][0]: |
| | | k_source.append("【天量大阳】") |
| | | k_source.append("天量大阳") |
| | | |
| | | score_list_new.append(k_score) |
| | | score_source_list_new.append("/".join(k_source)) |
| | | params["score_data"]["k_form"] = {"score": k_score, "datas": k_source} |
| | | |
| | | # 历史股性 |
| | | nature_score = 0 |
| | | nature_source = [] |
| | |
| | | else: |
| | | nature_source.append(f"无首板炸板") |
| | | |
| | | score_list_new.append(nature_score) |
| | | score_source_list_new.append(",".join(nature_source)) |
| | | params["score_data"]["code_nature"] = {"score": nature_score, "data_desc": ",".join(nature_source)} |
| | | |
| | | # 板块热度 |
| | | hot_block_score = 0 |
| | | hot_block_source = [] |
| | | for k in score_list[5]: |
| | | hot_block_score += k |
| | | hot_block_source_data = score_source_list[5] |
| | |
| | | # 高位版信息 |
| | | "high_block_infos": [], |
| | | } |
| | | if k == "block_codes_rates_info": |
| | | hot_block_source.append(f"平均涨幅:【{round(hot_block_source_data[k][0]/hot_block_source_data[k][1],2)}%】") |
| | | elif k == "limit_up_codes_count": |
| | | hot_block_source.append(f"板块涨停数量:【{hot_block_source_data[k]}】") |
| | | elif k == "target_block_info": |
| | | hot_block_source.append(f"板块涨幅:【{hot_block_source_data[k][1]}%】") |
| | | elif k == "limit_up_index": |
| | | hot_block_source.append(f"第【{hot_block_source_data[k]+1}】只涨停") |
| | | elif k == "high_block_infos": |
| | | for info in hot_block_source_data[k]: |
| | | hot_block_source.append(f"{info[0][1]}{info[1]}") |
| | | if k == "target_block_info": |
| | | hot_block_source.append(f"【{hot_block_source_data[k][0]}】概念出现【{hot_block_source_data[k][2]}】次") |
| | | score_list_new.append(hot_block_score) |
| | | score_source_list_new.append(",".join(hot_block_source)) |
| | | params["score_data"]["hot_block"] = {"score": hot_block_score,"limit_up_index":hot_block_source_data['limit_up_index']+1, |
| | | "block_name": hot_block_source_data['target_block_info'][0], |
| | | "limit_up_count": hot_block_source_data['limit_up_codes_count'], |
| | | "open_limit_up_count": hot_block_source_data['break_size']} |
| | | |
| | | # 上板时间 |
| | | score_list_new.append(score_list[7]) |
| | | score_source_list_new.append(f"上板时间【{score_source_list[7]}】") |
| | | params["score_data"]["limit_up_time"] = {"score": score_list[7], "time": score_source_list[7]} |
| | | # 市值大小 |
| | | score_list_new.append(score_list[0]) |
| | | score_source_list_new.append(f"自由市值【{round(score_source_list[0] / 100000000, 2)}亿】") |
| | | params["score_data"]["zyltgb"] = {"score": score_list[0], "value": round(score_source_list[0] / 100000000, 2)} |
| | | # 股价大小 |
| | | score_list_new.append(score_list[1]) |
| | | score_source_list_new.append(f"现价【{score_source_list[1]}】元") |
| | | params["score_data"]["limit_up_price"] = {"score": score_list[1], "price": score_source_list[1]} |
| | | |
| | | score_info = (score, score_list_new, score_source_list_new) |
| | | params["score_data"]["total_score"] = score |
| | | |
| | | # zyltgb, limit_price, bidding, k_form, code_nature, hot_block, volume_rate, limit_up_time, |
| | | # deal_big_money |
| | | |
| | | ###############################下单信息############################### |
| | | params["score_data"]["trade_data"] = {} |
| | | |
| | | # 获取买入意愿 |
| | | volume_rate = score_source_list[6] |
| | | __L2PlaceOrderParamsManager = l2_trade_factor.L2PlaceOrderParamsManager(code, True, volume_rate, |
| | |
| | | volume_rate), |
| | | ((score, score_list), |
| | | score_source_list)) |
| | | buy_params_info = [] |
| | | if -1 < __L2PlaceOrderParamsManager.score_index < 3: |
| | | temp = "<font color='red'>【主动买入】" |
| | | params["score_data"]["trade_data"]["start"] = {"desc": "主动买入"} |
| | | if __L2PlaceOrderParamsManager.score_index == 0: |
| | | temp += "***" |
| | | params["score_data"]["trade_data"]["start"]["count"] = 3 |
| | | elif __L2PlaceOrderParamsManager.score_index == 1: |
| | | temp += "**" |
| | | params["score_data"]["trade_data"]["start"]["count"] = 2 |
| | | else: |
| | | temp += "*" |
| | | temp += "</font>" |
| | | buy_params_info.append(temp) |
| | | params["score_data"]["trade_data"]["start"]["count"] = 1 |
| | | |
| | | elif __L2PlaceOrderParamsManager.score_index < 0: |
| | | buy_params_info.append("【不执行买入】") |
| | | params["score_data"]["trade_data"]["start"] = {"desc": "不执行买入", "count": 0} |
| | | else: |
| | | buy_params_info.append("【被动买入】") |
| | | params["score_data"]["trade_data"]["start"] = {"desc": "被动买入", "count": 0} |
| | | # 安全笔数 |
| | | 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}】笔") |
| | | params["score_data"]["trade_data"]["safe_count"] = {"base": base_safe_count, "now": safe_count} |
| | | # 动态M值 |
| | | m = __L2PlaceOrderParamsManager.get_m_val() |
| | | zyltgb = global_util.zyltgb_map.get(code) |
| | |
| | | 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}万】 ") |
| | | params["score_data"]["trade_data"]["m"] = {"base": base_m // 10000, "now": 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}】笔") |
| | | params["score_data"]["trade_data"]["big_num"] = {"base": base_big_num, "now": big_num} |
| | | # 成交进度 |
| | | 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("未识别") |
| | | # buy_params_info.append("未识别") |
| | | pass |
| | | 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)}万】") |
| | | params["score_data"]["trade_data"]["trade_progress"] = {"time": data['val']['time'], |
| | | "num": data['val']['num'], "money": 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("无信号") |
| | | # buy_params_info.append("无信号") |
| | | pass |
| | | 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)}万】") |
| | | params["score_data"]["trade_data"]["buy_single"] = {"time": data['val']['time'], "num": data['val']['num'], |
| | | "money": 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("未下单") |
| | | # buy_params_info.append("未下单") |
| | | pass |
| | | 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)}万】") |
| | | params["score_data"]["trade_data"]["buy_exec"] = {"time": data['val']['time'], "num": data['val']['num'], |
| | | "money": 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) |
| | | params["xgb_code_infos"] = [] |
| | | |
| | | ##############################热门风口################################## |
| | | xgb_infos = [] |
| | | xgb_latest_datas = hot_block_data_process.XGBHotBlockDataManager.latest_datas |
| | | if not xgb_latest_datas: |
| | | xgb_infos.append('暂未获取到数据') |
| | | else: |
| | | # 获取今日的所有数据 |
| | | datas_record = hot_block_data_process.XGBHotBlockDataManager.list_all(tool.get_now_date_str()) |
| | | datas_record_dict = {} |
| | | for data in datas_record: |
| | | block = data[2] |
| | | if block not in datas_record_dict: |
| | | datas_record_dict[block] = [] |
| | | # 代码,代码名称,涨停时间,首次涨停时间 |
| | | datas_record_dict[block].append((data[3], data[9], data[4], data[8], block)) |
| | | |
| | | for block in xgb_latest_datas: |
| | | limit_up_count = 0 |
| | | codes = datas_record_dict.get(block[0]) |
| | | for code_data in block[2]: |
| | | if len(code_data[4]) > 6: |
| | | limit_up_count += 1 |
| | | # 获取板块中的代码 |
| | | block_codes_set = set() |
| | | for d in block[2]: |
| | | _code = d[0][1].split(".")[0] |
| | | block_codes_set.add(_code) |
| | | params["xgb_infos"] = [] |
| | | |
| | | if codes: |
| | | codes_data_html = "<table><tr>" |
| | | count = 0 |
| | | for code_data in codes: |
| | | if code_data[4] != block[0]: |
| | | # 不是该板块数据 |
| | | continue |
| | | count += 1 |
| | | codes_data_html += "<td style = 'text-decoration:underline;'>" |
| | | # 如果代码涨停时间或者没有在最新的代码中 |
| | | if (len(code_data[2]) < 6 or code_data[0] not in block_codes_set) and len(code_data[3]) > 6: |
| | | # 炸板 |
| | | codes_data_html += f"<font color='#000080'>{code_data[1]}:{code_data[0]} </font>" |
| | | elif len(code_data[2]) > 6: |
| | | # 涨停 |
| | | codes_data_html += f"<font color='#FF3232'>{code_data[1]}:{code_data[0]} </font>" |
| | | else: |
| | | codes_data_html += f"{code_data[1]}:{code_data[0]} " |
| | | codes_data_html += "</td>" |
| | | if count % 4 == 0: |
| | | codes_data_html += "</tr><tr>" |
| | | codes_data_html += "</tr></table>" |
| | | _info = (f"***【{block[0]}】,涨幅【{block[1]}】,共【{limit_up_count}】个涨停", codes_data_html) |
| | | is_target_block = False |
| | | if xgb_code_info: |
| | | for _code_info in xgb_code_info[0]: |
| | | if len(_code_info) > 0 and _code_info[0] == block[0]: |
| | | is_target_block = True |
| | | break |
| | | if is_target_block: |
| | | xgb_infos.insert(0, _info) |
| | | else: |
| | | xgb_infos.append(_info) |
| | | |
| | | # 返回主动买,被动买,不买的列表(代码, 名称, 得分, 是否涨停) |
| | | codes_score = __load_codes_scores() |
| | | params["initiative_buy_codes"] = [] |
| | | for d in codes_score[0]: |
| | | params["initiative_buy_codes"].append( |
| | | {"name": d[1], "code": d[0], "score": d[2], "limit_up": d[3], "open_limit_up": d[4]}) |
| | | |
| | | params["passive_buy_codes"] = [] |
| | | for d in codes_score[1]: |
| | | params["passive_buy_codes"].append( |
| | | {"name": d[1], "code": d[0], "score": d[2], "limit_up": d[3], "open_limit_up": d[4]}) |
| | | |
| | | trade_info = __load_trade_record(code, total_datas) |
| | | return __format_data(code_info, score_info, buy_params_info, xgb_code_info, xgb_infos, codes_score, trade_info) |
| | | params["trade_record"] = {"open_limit_up": trade_info[0], "records": trade_info[2]} |
| | | |
| | | ##############################开盘啦相关信息################################## |
| | | params["kpl_industry_rank"] = [] |
| | | params["kpl_best_feng_kou"] = [] |
| | | params["kpl_feng_kou"] = [] |
| | | params["kpl_feng_xiang"] = [] |
| | | best_fengkou = __kplDataManager.get_data(kpl_util.KPLDataType.BEST_FENG_KOU) |
| | | fengkou = __kplDataManager.get_data(kpl_util.KPLDataType.FENG_KOU) |
| | | fengxiang = __kplDataManager.get_data(kpl_util.KPLDataType.FENG_XIANG) |
| | | rank_infos = __kplDataManager.get_data(kpl_util.KPLDataType.INDUSTRY_RANK) |
| | | # (代码,名称,强度,涨幅,热门板块,所有板块) |
| | | if best_fengkou: |
| | | for r in best_fengkou: |
| | | hot_block = "、".join(r[4].split("、")[:2]) |
| | | params["kpl_best_feng_kou"].append( |
| | | {"name": r[1], "weight": r[2], "money": money_desc(r[2]), "rate": r[3], "hot_block": hot_block, |
| | | "hot_block_all": r[5]}) |
| | | if fengkou: |
| | | fengkou = fengkou[:30] |
| | | for r in fengkou: |
| | | # 市场风口 |
| | | # (代码,名称,涨幅,主力净额,风口概念) |
| | | params["kpl_feng_kou"].append( |
| | | {"name": r[1], "money": money_desc(r[3]), "rate": r[2], "block": r[4]}) |
| | | if fengxiang: |
| | | for r in fengxiang: |
| | | # 风向标 |
| | | # (代码, 名称, 现价, 涨幅, 板块, 300万大单净额, 主力净额, 自由市值) |
| | | params["kpl_feng_xiang"].append( |
| | | {"name": r[1], "money_300w": money_desc(r[5]), "money_main": money_desc(r[6]), "rate": r[3], |
| | | "block": r[4]}) |
| | | |
| | | if rank_infos: |
| | | for r in rank_infos: |
| | | params["kpl_industry_rank"].append({"name": r[1], "money": money_desc(r[2]), "rate": r[3]}) |
| | | |
| | | return render(params) |
| | | |
| | | |
| | | def __load_codes_scores(): |
| | |
| | | code_name = gpcode_manager.get_code_name(code) |
| | | # 获取现价,判断是否涨停 |
| | | current_price_info = global_util.cuurent_prices.get(code) |
| | | limit_up_info = code_price_manager.Buy1PriceManager.get_limit_up_info(code) |
| | | is_limit_up = True |
| | | open_limit_up = limit_up_info[0] and limit_up_info[1] |
| | | if current_price_info is not None and not current_price_info[1]: |
| | | is_limit_up = False |
| | | else: |
| | | is_limit_up = True |
| | | scores_list.append((code, code_name, scores[code], is_limit_up)) |
| | | scores_list.append((code, code_name, scores[code], is_limit_up, open_limit_up)) |
| | | scores_list.sort(key=lambda x: x[2], reverse=True) |
| | | fscores_list = [[], [], []] |
| | | for score in scores_list: |
| | |
| | | except: |
| | | pass |
| | | records_new = [] |
| | | records_new_data = [] |
| | | index = 0 |
| | | if records: |
| | | try: |
| | |
| | | index += 1 |
| | | temp = f"第{index}次下单:【{time_}】&【{data['score']}分】,{data.get('desc')}" |
| | | records_new.append(temp) |
| | | records_new_data.append({"type": 1, "index": index, "time": time_, "score": data['score']}) |
| | | elif type == 'S撤': |
| | | # index':378 , 'rate':0.51 , 'target_rate':0.49 |
| | | pass |
| | |
| | | elif type == '撤单': |
| | | temp = f"第{index}次撤单:【{time_}】{data['msg']}" |
| | | records_new.append(temp) |
| | | records_new_data.append({"type": 0, "time": time_, "desc": data['msg']}) |
| | | |
| | | except: |
| | | pass |
| | | |
| | | return break_time, records_new |
| | | return break_time, records_new, records_new_data |
| | | |
| | | |
| | | if __name__ == '__main__': |
| | | st="8天3板" |
| | | print(st[-2:-1]) |
| | | datas = { |
| | | "base_url": "http://192.168.3.122/kp/", |
| | | "code_name": "天域生态 002255", |
| | | "score_data": {"volume": {"score": 20, "now": "12", "high": {"num": "56", "date": "2023-04-13"}}, |
| | | "bidding": {"score": 10, "money": "4563"}, |
| | | "deal_big_money": {"score": 10, "money": 0, "base_money": 456.5, |
| | | "start": {"time": "09:00:00", "num": 1456}, |
| | | "end": {"time": "09:00:00", "num": 1456}}, |
| | | "k_form": {"score": 10, "datas": ["破前高", "超跌补涨", "涨幅过高"]}, |
| | | "code_nature": {"score": 10, "data_desc": "涨停次数2次"}, |
| | | "hot_block": {"score": 10, "block_name": "影视", "limit_up_count": 10, "open_limit_up_count": 2}, |
| | | "limit_up_time": {"score": 10, "time": "09:56:00"}, |
| | | "zyltgb": {"score": 10, "value": "12.5"}, |
| | | "limit_up_price": {"score": 10, "price": "6.35"}, |
| | | "total_score": "210" |
| | | }, |
| | | "trade_data": {"star": {"desc": "被动买入", "count": 0}, |
| | | "safe_count": {"base": 12, "now": 2}, |
| | | "m": {"base": 1200, "now": 1000}, |
| | | "big_num": {"base": 10, "now": 2}, |
| | | "trade_progress": {"time": "09:12:12", "num": 1111, "money": "12.56"}, |
| | | "buy_single": {"time": "09:12:12", "num": 1111, "money": "12.56"}, |
| | | "buy_exec": {"time": "09:12:12", "num": 1111, "money": "12.56"} |
| | | }, |
| | | "xgb_code_infos": [{"date": "今天", "blocks": [ |
| | | {"name": "影视", "limit_up_count": 2, "index": 1, "price": "12.00", "rate": "+10.00%"}, |
| | | {"name": "文旅", "limit_up_count": 3, "index": 2, "price": "12.00", "rate": "+10.00%"}, |
| | | ]}], |
| | | "initiative_buy_codes": [ |
| | | {"name": "测试1", "code": "000123", "score": 125, "limit_up": True, "open_limit_up": True}, |
| | | {"name": "测试2", "code": "000123", "score": 125, "limit_up": False, "open_limit_up": True}, |
| | | {"name": "测试2", "code": "000123", "score": 125, "limit_up": False, "open_limit_up": True}, |
| | | {"name": "测试2", "code": "000123", "score": 125, "limit_up": False, "open_limit_up": False} |
| | | ], |
| | | "passive_buy_codes": [{"name": "测试1", "code": "000123", "score": 125}, |
| | | {"name": "测试2", "code": "000123", "score": 125}, |
| | | {"name": "测试2", "code": "000123", "score": 125}, |
| | | {"name": "测试2", "code": "000123", "score": 125} |
| | | ], |
| | | "trade_record": {"open_limit_up": "10:00:03", "records": [ |
| | | {"type": 1, "index": 1, "time": "11:00:00", "score": 12}, |
| | | {"type": 0, "time": "11:26:00", "desc": "H撤撤单"} |
| | | ]}, |
| | | "xgb_infos": [{"block": {"name": "测试1", "rate": "+12.00%", "limit_up_count": 10}, |
| | | "codes": [ |
| | | {"limit_up": True, "name": "测试代码", "code": "000654"}, |
| | | {"limit_up": True, "name": "测试代码", "code": "000654"}, |
| | | {"limit_up": True, "name": "测试代码", "code": "000654"}, |
| | | {"limit_up": False, "name": "测试代码", "code": "000654"}, |
| | | ]}] |
| | | } |
| | | print(render(datas)) |