Administrator
2025-06-03 ea44e1fddfb7a663802ca6dcd33f2350c805ec61
utils/init_data_util.py
@@ -2,6 +2,7 @@
import decimal
from code_attribute import gpcode_manager
from log_module.log import logger_debug
from third_data.history_k_data_util import HistoryKDatasUtils
from utils import tool
@@ -12,25 +13,29 @@
def re_set_price_pres(codes, force=False):
    result = HistoryKDatasUtils.get_gp_latest_info(codes)
    for item in result:
        symbol = item['symbol']
        symbol = symbol.split(".")[1]
        pre_close = tool.to_price(decimal.Decimal(str(item['pre_close'])))
        gpcode_manager.CodePrePriceManager.set_price_pre(symbol, pre_close, force)
    # 通过历史数据缓存获取
    for code in codes:
        result = HistoryKDatasUtils.get_history_tick_n(code, 1)
        for item in result:
            symbol = item['symbol']
            symbol = symbol.split(".")[1]
            pre_close = tool.to_price(decimal.Decimal(str(item['close'])))
            gpcode_manager.CodePrePriceManager.set_price_pre(symbol, pre_close, force)
# 获取近90天的最大量与最近的量
# 获取最近一次涨停/涨停下一个交易日的最大值
def get_volumns_by_code(code, count=60) -> object:
def get_volumns_by_code(code, count=60):
    datas = HistoryKDatasUtils.get_history_tick_n(code, count, "open,high,low,close,volume,pre_close,bob,amount")
    if not datas:
        return None
    # 计算
    datas.sort(key=lambda x: x["bob"], reverse=True)
    return datas
def parse_max_volume(datas, is_new_or_near_top=False):
    result = __parse_max_volume(datas, is_new_or_near_top)
def parse_max_volume(code, datas, is_new_or_near_top=False):
    result = __parse_max_volume(code, datas, is_new_or_near_top)
    refer_index = result[3]
    # 计算最低价
    refer_price = datas[refer_index]["high"]
@@ -54,11 +59,75 @@
        if datas[refer_index - 1]["volume"] > datas[refer_index]["volume"]:
            refer_index -= 1
    return datas[refer_index]["volume"], datas[refer_index]["volume"], datas[refer_index]['bob'].strftime("%Y-%m-%d"), refer_index
    return datas[refer_index]["volume"], datas[refer_index]["volume"], datas[refer_index]['bob'].strftime(
        "%Y-%m-%d"), refer_index
def parse_max_volume_new(code, datas):
    """
    计算远高量
    @param code:
    @param datas:
    @return: [高量,高量,高量日期,高量索引]
    """
    def __is_limited_up(item):
        limit_up_price = float(gpcode_manager.get_limit_up_price_by_preprice(code, item["pre_close"]))
        if abs(limit_up_price - item["high"]) < 0.001:
            return True
        return False
    # 取最近60个交易日
    datas = datas[:60]
    # 判断是否涨停过
    target_index = None
    for i in range(len(datas)):
        data = datas[i]
        if __is_limited_up(data):
            next_data = None
            if i > 0:
                next_data = datas[i - 1]
            # max(涨停这一天, 后一天)的量
            if next_data and next_data['volume'] > data['volume']:
                target_index = i - 1
            else:
                target_index = i
            break
    if target_index is None:
        # 60天未涨停,获取60天内的最高量
        for i in range(len(datas)):
            data = datas[i]
            if target_index is None:
                target_index = i
            if data['volume'] > datas[target_index]['volume']:
                target_index = i
    return datas[target_index]['volume'], datas[target_index]['volume'], datas[target_index]['bob'].strftime(
        "%Y-%m-%d"), target_index
def parse_max_volume_in_days(datas, max_day):
    """
    解析最近几天最大的量
    @param datas:
    @param max_day:
    @return:
    """
    # 解析最近几天的最大量
    datas = datas[:max_day]
    max_volume_info = None
    for d in datas:
        if max_volume_info is None:
            max_volume_info = (d["volume"], d)
        if d["volume"] > max_volume_info[0]:
            max_volume_info = (d["volume"], d)
    if max_volume_info:
        return max_volume_info[0]
    return None
# 返回:(60天最大量,昨日量,量参考日期,参考量据今交易日数)
def __parse_max_volume(datas, is_new_or_near_top=False):
def __parse_max_volume(code, datas, is_new_or_near_top=False):
    max_volume = 0
    max_volume_date = None
    max_volume_index = None
@@ -70,7 +139,7 @@
            if i >= len(datas):
                break
            item = datas[i]
            limit_up_price = float(gpcode_manager.get_limit_up_price_by_preprice(item["pre_close"]))
            limit_up_price = float(gpcode_manager.get_limit_up_price_by_preprice(code, item["pre_close"]))
            if abs(limit_up_price - item["high"]) < 0.001:
                latest_limit_up_index = i
                break
@@ -104,9 +173,9 @@
                max_volume = volume
                max_volume_date = item['bob']
            # 是否有涨停
            limit_up_price = float(gpcode_manager.get_limit_up_price_by_preprice(item["pre_close"]))
            limit_up_price = float(gpcode_manager.get_limit_up_price_by_preprice(code, item["pre_close"]))
            # 不看超过60天的涨停
            if abs(limit_up_price - item["high"]) < 0.01 and i <= 59:
            if abs(limit_up_price - item["high"]) < 0.001 and i <= 59:
                # 涨停
                next_volume = 0
                if i > 0: