admin
2025-04-07 400efb993a97e2aaacb3442d46178a125b26bea6
strategy/market_sentiment_analysis.py
@@ -5,18 +5,17 @@
# import decimal
import datetime
import json
import time
import constant
from log_module.log import logger_common
from log_module import async_log_util
from log_module.log import logger_common, logger_Overall_market_strength_score
# import time
# 引入掘金API
# from gm.api import *
from strategy import basic_methods
from strategy import basic_methods, kpl_api
from strategy import data_cache
# import account_management
from strategy import order_methods
from strategy.all_K_line import k_line_history
from utils import tool, juejin_api
# 获取logger实例
@@ -562,9 +561,95 @@
    logger.info(f"加属性的指数k线写完了!{tool.get_now_time_str()}")
# 获取实时大盘行情情绪综合强度 [分数] 函数 并 计算当日计划持仓数量
def get_real_time_market_strong():
    while True:
        try:
            if data_cache.position_automatic_management_switch is True:
                now_time = tool.get_now_time_str()
                if data_cache.L1_DATA_START_TIME < now_time < data_cache.CLOSING_TIME:
                    # 获取大盘综合强度分数
                    data_cache.real_time_market_strong = kpl_api.get_market_strong()
                    # 获取市场情绪字典【完整】,并整理
                    data_cache.real_time_market_sentiment_dirt = kpl_api.changeStatistics()
                    date_today = data_cache.real_time_market_sentiment_dirt.get(['Day'], None)
                    significant_drawdown = data_cache.real_time_market_sentiment_dirt.get(['df_num'], None)
                    sentiment_indicators = data_cache.real_time_market_sentiment_dirt.get(['ztjs'], None)
                    limit_up_amount = data_cache.real_time_market_sentiment_dirt.get(['ztjs'], None)
                    connecting_board_height = data_cache.real_time_market_sentiment_dirt.get(['lbgd'], None)
                    # 获取市场情绪-涨跌统计
                    data_cache.rise_and_fall_statistics_dirt = kpl_api.getMarketFelling()
                    limit_up_numbers = data_cache.rise_and_fall_statistics_dirt.get(['ZT', None])
                    actual_limit_up_numbers = data_cache.rise_and_fall_statistics_dirt.get(['SJZT', None])
                    ST_limit_up_numbers = data_cache.rise_and_fall_statistics_dirt.get(['STZT', None])
                    limit_down_numbers = data_cache.rise_and_fall_statistics_dirt.get(['DT', None])
                    actual_limit_down_numbers = data_cache.rise_and_fall_statistics_dirt.get(['SJDT', None])
                    ST_limit_down_numbers = data_cache.rise_and_fall_statistics_dirt.get(['STDT', None])
                    rise_numbers = data_cache.rise_and_fall_statistics_dirt.get(['SZJS', None])
                    fall_numbers = data_cache.rise_and_fall_statistics_dirt.get(['XDJS', None])
                    # 该logger.info的的日志不再需要打印,后续将转入到GUI客户端上直接显示,该数据的打印交由下方的打印机制异步执行单独存储,以便后续可视化呈现后进行更高效的数据分析
                    # logger.info(f"大盘行情情绪综合强度 [分数]==={data_cache.real_time_market_strong}分")
                    if data_cache.MORN_MARKET_CLOSING_TIME < now_time < data_cache.NOON_MARKET_OPENING_TIME:
                        pass
                        logger.info(f"午间休市时间内 不打印大盘综合强度分数")
                    else:
                        # 大盘综合强度分数 的 异步日志
                        # logger_Overall_market_strength_score.info(data_cache.real_time_market_strong)
                        async_log_util.info(logger_Overall_market_strength_score, f"{data_cache.real_time_market_strong}")
                        logger.info(f"日期:{date_today},情绪指标:{sentiment_indicators}分,大幅回撤:{significant_drawdown},涨停家数:{limit_up_amount},连板高度:{connecting_board_height}")
                        logger.info(f"上涨家数:{rise_numbers}分,下跌家数:{fall_numbers},实际涨停家数:{actual_limit_up_numbers},实际跌停家数:{actual_limit_down_numbers}")
                        logger.info(f"涨跌统计字典{data_cache.rise_and_fall_statistics_dirt}")
                    usefulMoney = data_cache.account_finance_dict[0].get('usefulMoney', 0)
                    logger.info(f"账户可用资金==={usefulMoney}元")
                    # 低迷情绪比例
                    low_emotion_mood_ratio = 1
                    # 33分是个两级分化阶梯不好,目前不好拿捏,暂时不用
                    # if data_cache.real_time_market_strong <= 33:
                    if data_cache.real_time_market_strong < 30:
                        # 如果大盘综合强度分数小于30,将低迷情绪分数比例设置为0.01,可用资金缩小一百倍
                        low_emotion_mood_ratio = 0.01
                        if data_cache.real_time_market_strong <= 10:
                            low_emotion_mood_ratio = 0
                    logger.info(f"极端低迷情绪比例===={low_emotion_mood_ratio * 100}%")
                    data_cache.index_trend_expectation_score = index_trend_expectation()
                    logger.info(f"大盘指数情绪预期分数==={data_cache.index_trend_expectation_score}分")
                    # # 目前大盘指数情绪预期分数 尚不科学 强制设置为初始0值
                    # index_trend_expectation_score = 0
                    # 获取计算今天新增的持仓数量
                    addition_position_number = len(data_cache.addition_position_symbols_set)
                    # 定义一个今日的剩余新增持仓数量的变量
                    Unfinished_opening_plan_number = 3 - addition_position_number
                    logger.info(f"今日的剩余新增持仓数量==={Unfinished_opening_plan_number}")
                    if Unfinished_opening_plan_number != 0:
                        # 如果GUI看盘上没有手动设置具体的下单金额,就按照评分策略的金额下单,否则就按照GUI设置的金额下单。
                        if data_cache.BUY_MONEY_PER_CODE < 0:
                            # 根据账户可用金额 计算今日计划下单金额
                            # 账户可用金额 默认乘以0.9,永远留一点钱,一方面也冗余一些计算误差
                            #  ((大盘综合强度分数 + 大盘指数情绪预期分数) * 0.01) * (账户可用金额 * 0.9 * 极端低迷情绪比例 / 今日最大新增持仓票数)
                            # data_cache.today_planned_order_amount = ((data_cache.real_time_market_strong + data_cache.index_trend_expectation_score) * 0.01) * (
                            #                                                 usefulMoney * 0.9 * low_emotion_mood_ratio / Unfinished_opening_plan_number)
                            data_cache.today_planned_order_amount = (usefulMoney * 0.95 * low_emotion_mood_ratio / Unfinished_opening_plan_number)
                            logger.info(f"采用开仓策略计算方式=》今日计划下单金额:{data_cache.today_planned_order_amount},")
                        else:
                            data_cache.today_planned_order_amount = data_cache.BUY_MONEY_PER_CODE
                            logger.info(f"采用GUI设置方式=》今日计划下单金额:{data_cache.today_planned_order_amount}")
        except Exception as error:
            logger.error(f"获取实时大盘行情情绪综合强度[分数] 函数报错: {error}")
        finally:
            time.sleep(3)
if __name__ == '__main__':
    market_strong = kpl_api.get_market_strong()
    print(f"{market_strong}")
    # all_index_K_line_dict = get_index_K_line()
    # all_index_k_line_dict_write()
    # print(f"指数K线{data_cache.all_index_k_line_property_dict}")
    all_index_k_line_dict_write()
    # all_index_k_line_dict_write()