"""
|
首板目标代码处理器
|
"""
|
|
# 处理首板代码信息
|
|
import constant
|
from code_attribute import gpcode_manager, gpcode_first_screen_manager, code_nature_analyse, \
|
code_volumn_manager
|
from code_attribute.code_data_util import ZYLTGBUtil
|
from code_attribute.code_nature_analyse import HighIncreaseCodeManager
|
from log_module.log import logger_first_code_record, logger_l2_codes_subscript
|
from third_data.code_plate_key_manager import CodesHisReasonAndBlocksManager
|
from third_data.history_k_data_util import HistoryKDatasUtils
|
from ths import l2_code_operate
|
from trade import trade_data_manager, l2_trade_util
|
from utils import global_util, tool, init_data_util
|
|
__CodesPlateKeysManager = CodesHisReasonAndBlocksManager()
|
|
|
def process_first_codes_datas(dataList, request_id=None):
|
logger_l2_codes_subscript.info(f"{request_id}加载l2代码相关数据")
|
print("首板代码数量:", len(dataList))
|
limit_up_price_dict = {}
|
temp_codes = []
|
codes = []
|
tick_datas = []
|
if dataList:
|
for data in dataList:
|
code = data["code"]
|
codes.append(code)
|
|
# ---查询想买单,如果没有在列表中就需要强行加入列表
|
want_codes = gpcode_manager.WantBuyCodesManager().list_code_cache()
|
if want_codes:
|
# 没有在现价采集中的想买代码
|
diff_codes = set(want_codes) - set(codes)
|
if diff_codes:
|
# 想买单的代码还没有在目标代码中
|
zyltgb_list = []
|
for code in diff_codes:
|
# 获取涨停价
|
_limit_up_price = gpcode_manager.get_limit_up_price(code)
|
if not _limit_up_price:
|
init_data_util.re_set_price_pres([code], True)
|
# 再次获取涨停价
|
_limit_up_price = gpcode_manager.get_limit_up_price(code)
|
if _limit_up_price:
|
# 成功获取到了涨停价,构造虚拟的现价信息
|
codes.append(code)
|
dataList.append({"code": code, "price": f"{_limit_up_price}", "volume": "0",
|
"volumeUnit": 0, "time": "00:00:00", "zyltgb": "100",
|
"zyltgbUnit": 0})
|
# 强制更新自由流通股本
|
if zyltgb_list:
|
ZYLTGBUtil.save_list(zyltgb_list)
|
# 将保存的数据更新到内存中
|
for z in zyltgb_list:
|
val = ZYLTGBUtil.get(z["code"])
|
if val:
|
global_util.zyltgb_map[z["code"]] = val
|
|
# ---保存未筛选的首板代码
|
new_add_codes = gpcode_first_screen_manager.set_target_no_screen_codes(codes)
|
# 保存自由流通股本,暂时不保存
|
# if dataList:
|
# zyltgb_list = []
|
# for data in dataList:
|
# code = data["code"]
|
# if code in global_util.zyltgb_map:
|
# continue
|
# zyltgb_list.append(
|
# {"code": code, "zyltgb": data["zyltgb"], "zyltgb_unit": data["zyltgbUnit"]})
|
# if zyltgb_list:
|
# ZYLTGBUtil.save_list(zyltgb_list)
|
# global_data_loader.load_zyltgb()
|
|
# 获取昨日收盘价
|
for code in codes:
|
# 如果涨停价是空值就需要设置昨日收盘价格
|
if gpcode_manager.get_limit_up_price(code) is None:
|
init_data_util.re_set_price_pres([code], True)
|
|
# 板块关键字准备 暂时删除
|
# for code in codes:
|
# if __CodesPlateKeysManager.get_history_limit_up_reason(code) is None:
|
# # 从数据库加载历史涨停原因
|
# __CodesPlateKeysManager.set_history_limit_up_reason(code,
|
# KPLLimitUpDataRecordManager.get_latest_blocks_set(
|
# code))
|
# if __CodesPlateKeysManager.get_blocks(code) is None:
|
# try:
|
# results = kpl_api.getStockIDPlate(code)
|
# bs = [r[1] for r in results]
|
# __CodesPlateKeysManager.set_blocks(code, bs)
|
# except Exception as e:
|
# logging.exception(e)
|
# pass
|
|
# 获取60天最大记录
|
for code in codes:
|
need_get_volumn = False
|
if code not in global_util.max60_volumn or global_util.max60_volumn.get(code) is None:
|
need_get_volumn = True
|
# if not need_get_volumn and code_nature_analyse.CodeNatureRecordManager.get_nature_cache(
|
# code) is None:
|
# need_get_volumn = True
|
if need_get_volumn:
|
limit_up_price = gpcode_manager.get_limit_up_price(code)
|
if limit_up_price is None:
|
continue
|
try:
|
volumes_data = init_data_util.get_volumns_by_code(code, 150)
|
volumes = init_data_util.parse_max_volume(volumes_data[:90],
|
code_nature_analyse.is_new_top(
|
limit_up_price,
|
volumes_data[:90]))
|
logger_first_code_record.info("{} 获取到首板60天最大量:{}", code, volumes)
|
code_volumn_manager.set_histry_volumn(code, volumes[0], volumes[1], volumes[2])
|
|
# 保存K线形态
|
k_format = code_nature_analyse.get_k_format(limit_up_price, volumes_data)
|
code_nature_analyse.CodeNatureRecordManager().save_k_format(code, k_format)
|
|
if code_nature_analyse.is_up_too_high_in_10d_with_limit_up(volumes_data):
|
# 判断是否太高
|
l2_trade_util.forbidden_trade(code, "股价长得太高(5天内有3个涨停)")
|
HighIncreaseCodeManager().add_code(code)
|
|
if code_nature_analyse.is_up_too_high_in_120d(volumes_data):
|
# 判断是否太高
|
l2_trade_util.forbidden_trade(code, "120天内股价长得太高")
|
HighIncreaseCodeManager().add_code(code)
|
|
if code_nature_analyse.is_price_too_high_in_days(volumes_data, limit_up_price):
|
# 判断是否太高
|
l2_trade_util.forbidden_trade(code, "6天内股价长得太高")
|
HighIncreaseCodeManager().add_code(code)
|
|
if code_nature_analyse.is_have_latest_max_volume(volumes_data, 2):
|
# 最近2天是否是最高量
|
code_nature_analyse.LatestMaxVolumeManager().set_has_latest_max_volume(code)
|
|
# 判断K线形态
|
# is_has_k_format, msg = code_nature_analyse.is_has_k_format(
|
# gpcode_manager.get_limit_up_price(code), volumes_data)
|
# if not is_has_k_format:
|
# logger_first_code_record.info("{}首板K线形态不好,{}", code, msg)
|
# # 股性不好,就不要加入
|
# bad_codes.add(code)
|
# # 加入禁止交易代码
|
# l2_trade_util.forbidden_trade(code)
|
# 暂时不保存K线形态
|
# code_nature_analyse.set_record_datas(code,
|
# gpcode_manager.get_limit_up_price(code),
|
# volumes_data)
|
except Exception as e:
|
logger_first_code_record.error(f"{code}:{str(e)}")
|
gpcode_manager.FirstCodeManager().add_record(codes)
|
# 初始化板块信息,暂时删除
|
# for code in codes:
|
# block_info.init_code(code)
|
|
if new_add_codes:
|
gpcode_manager.FirstGPCodesManager().set_first_gp_codes_with_data(HistoryKDatasUtils.get_gp_latest_info(codes,
|
fields="symbol,sec_name,sec_type,sec_level"))
|
# 加入首板历史记录
|
logger_first_code_record.info("新增首板:{}", new_add_codes)
|
|
# 移除代码
|
if constant.L2_SOURCE_TYPE == constant.L2_SOURCE_TYPE_THS:
|
listen_codes = gpcode_manager.get_listen_codes()
|
for lc in listen_codes:
|
if not gpcode_manager.is_in_gp_pool(lc):
|
# 移除代码
|
l2_code_operate.L2CodeOperate.get_instance().add_operate(0, lc, "代码被移除")
|
# 保存现价
|
if dataList:
|
for data in dataList:
|
code = data["code"]
|
codes.append(code)
|
limit_up_price = gpcode_manager.get_limit_up_price(code)
|
if limit_up_price is not None:
|
limit_up_price_dict[code] = limit_up_price
|
else:
|
temp_codes.append(code)
|
tick_datas.append({"code": code, "price": data["price"], "volume": data["volume"],
|
"volumeUnit": data["volumeUnit"]})
|
# 获取涨停价
|
if temp_codes:
|
# 获取涨停价
|
init_data_util.re_set_price_pres(temp_codes)
|
# 重新获取涨停价
|
for code in temp_codes:
|
limit_up_price = gpcode_manager.get_limit_up_price(code)
|
if limit_up_price is not None:
|
limit_up_price_dict[code] = limit_up_price
|
|
# 首板数据加工
|
prices = []
|
for data in dataList:
|
code = data["code"]
|
price = data["price"]
|
limit_up_time = data["time"]
|
if limit_up_time == "00:00:00":
|
limit_up_time = None
|
if code not in limit_up_price_dict:
|
continue
|
is_limit_up = abs(float(limit_up_price_dict[code]) - float(price)) < 0.01
|
# 纠正数据
|
if is_limit_up and limit_up_time is None:
|
limit_up_time = tool.get_now_time_str()
|
if is_limit_up:
|
# 加入首板涨停
|
gpcode_manager.FirstCodeManager().add_limited_up_record([code])
|
pricePre = gpcode_manager.CodePrePriceManager.get_price_pre_cache(code)
|
if pricePre is None:
|
init_data_util.re_set_price_pres([code])
|
|
rate = round((float(price) - pricePre) * 100 / pricePre, 1)
|
prices.append(
|
{"code": code, "time": limit_up_time, "rate": rate,
|
"limit_up": is_limit_up})
|
|
gpcode_first_screen_manager.process_ticks(prices)
|
logger_l2_codes_subscript.info(f"({request_id})l2代码相关数据加载完成")
|
return tick_datas
|