admin
2025-02-27 8d151575d6fa5696545eba6555badbdc6a544dc4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
"""
该模块为全局化变量的模块
不要试图把所有数据都全局化了
"""
 
import datetime
import json
import logging
import os
 
import constant
# 引入掘金API
import utils.juejin_api
from log_module.log import logger_common
# from logging_config import get_logger
from utils import tool, hx_qc_value_util
 
# 获取logger实例
logger = logger_common
 
# 全局日志配置   如果不想用就把 logging.ERROR  如果要打就=logging.INFO
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
 
 
@tool.singleton
class DataCache:
    """
    数据缓存
    """
    # ---定义变量---
    today_date = None
    pre_trading_day = None
    double_pre_trading_day = None
    next_trading_day = None
    all_stocks = None
    filtered_stocks = None
    min_instruments = None
    min_stocks = None
    code_name_dict = {}
 
    def __init__(self):
        logging.info("全局初始化数据  开始》》》")
        '''
        设定基本日期
        '''
        # 今日时间初始化
        now = datetime.datetime.now()  # 获取本机时间
        print(f"本机时间::{now}")
        # 本机启动时间初始化
        Local_startup_time = datetime.datetime.now().strftime("%H:%M:%S")
        print(f"本机启动时间==={Local_startup_time}")
        logger.info(f"本机启动时间==={Local_startup_time}")
        # 全局化 【今日日期 上一个交易日期 上上个交易日期 下一个交易日期】
        self.today_date = now.strftime('%Y-%m-%d')  # 获取今日日期参数
        print(f"今日日期{self.today_date}")
        self.pre_trading_day = hx_qc_value_util.get_previous_trading_date(self.today_date)  # 获取前一个交易日
        print(f"上一个交易日{self.pre_trading_day}")
        self.double_pre_trading_day = hx_qc_value_util.get_previous_trading_date(self.pre_trading_day)  # 获取上上一个交易日
        print(f"上上一个交易日{self.double_pre_trading_day}")
        self.next_trading_day = hx_qc_value_util.get_next_trading_date(self.today_date)  # 获取下一个交易日
        print(f"下一个交易日{self.next_trading_day}")
        '''
        设定基本时间点
        '''
        # 获取A股市场(包含沪深两市)的股票列表跳过停牌,跳过ST    上交所 SHSE.600000   深交所 SZSE.000000    target = ['SHSE.603839', 'SZSE.002855']
        self.all_stocks = utils.juejin_api.JueJinApi.get_target_codes()
        # self.all_stocks = [{'sec_level': 1, 'symbol': 'SZSE.301633','pre_close': 78.72000122070312, 'is_suspended': 0, 'sec_name': '港迪技术', 'listed_date': datetime.datetime(2024, 11, 7, 0, 0,tzinfo=datetime.timezone(datetime.timedelta(seconds=28800))), 'sec_type': 1, 'sec_id': '301633'}]
 
        # self.all_stocks = self.all_stocks[:10]
        # 缓存代码的名称
        self.code_name_dict = {x['symbol']: x['sec_name'] for x in self.all_stocks}
 
        print("A股所有代码数量:", len(self.all_stocks))
        # 只要上证A股和深证A股
        # self.filtered_stocks = [stock for stock in self.all_stocks if
        #                         stock.startswith('SHSE.60') or (stock.startswith('SZSE.00'))]
        self.filtered_stocks = [stock['symbol'] for stock in self.all_stocks if
                                isinstance(stock.get('symbol'), str) and (
                                        stock['symbol'].startswith('SHSE.60') or stock['symbol'].startswith(
                                    'SZSE.00'))]
        # self.filtered_stocks =  self.filtered_stocks[:10]
        print(f"过滤后上证A股和深证A股数量filtered_stocks:{len(self.filtered_stocks)}")
        # 获取上证A股和深证A股 基本信息
        instruments = [stock for stock in self.all_stocks if stock['symbol'] in self.filtered_stocks]
        # 将获取到的上证A股和深证A股 基本信息 汇编为一个字典
        basic_info_symbols_dict = {}
        # 初始化没有K线的股票
        no_k_line_stocks = []
        for i in instruments:
            basic_info_symbols_dict[i["symbol"]] = i
            # print(f"basic_info_symbols_dict ====={basic_info_symbols_dict}")
            # basic_info_symbols_dict  ===== 'SHSE.600611': {'symbol': 'SHSE.600611', 'sec_name': '大众交通', 'pre_close': 2.809999942779541},
            # if ['sec_name']
            # 如果公司名称中不包含["ST", "退市", "退", "XD", "XR", "DR", "N"] 则继续逻辑判断
            if any(keyword in i['sec_name'] for keyword in ["ST", "退市", "退", "N", "C"]):
                # print(f"非ST, 退市, 退, XD, N==={basic_info['sec_name']} 继续判断")
                no_k_line_stocks.append(i['symbol'])
        # 将列表推导式移出循环 过滤出昨日收盘价在2-30元的股票
        min_instruments = [stock for stock in instruments if 2 < stock['pre_close'] < 30]
        # print(f"min_instruments  数量==={len(min_instruments)}")
        # 使用 get 方法安全地获取 symbol 字段的值
        self.min_stocks = [stock.get('symbol') for stock in min_instruments if stock.get('symbol') is not None]
        print(f"min_stocks==={len(self.min_stocks)}")
        logging.info(f"全局初始化数据  完成《《《 - {os.getpid()}")
        # 获取当前进程的PID
 
 
'''
设定基本时间点
'''
Local_startup_time = datetime.datetime.now().strftime("%H:%M:%S")
server_restart_time = datetime.time(9, 00, 00).strftime("%H:%M:%S")  # 定义9:00
L1_data_start_time = datetime.time(9, 15, 00).strftime("%H:%M:%S")  # 定义9:15
before_open_bidding_time = datetime.time(9, 20, 00).strftime("%H:%M:%S")  # 定义9:20
open_bidding_time = datetime.time(9, 25, 00).strftime("%H:%M:%S")  # 定义 盘前 集合竞价 时间
later_open_bidding_time = datetime.time(9, 25, 30).strftime("%H:%M:%S")  # 定义 盘前 集合竞价 时间
after_open_bidding_time = datetime.time(9, 26, 00).strftime("%H:%M:%S")  # 定义 集合竞价 开始后 时间
opening_time = datetime.time(9, 30, 00).strftime("%H:%M:%S")  # 定义开盘时间
morn_market_time = datetime.time(9, 35, 00).strftime("%H:%M:%S")  # 定义早盘时间
noon_market_time = datetime.time(13, 5, 00).strftime("%H:%M:%S")  # 定义午盘时间
close_position_time = datetime.time(14, 55, 00).strftime("%H:%M:%S")  # 定义平仓时间
watch_disk_end_time = datetime.time(14, 56, 00).strftime("%H:%M:%S")  # 定义 板上盯结束时间
close_bidding_time = datetime.time(14, 57, 00).strftime("%H:%M:%S")  # 定义 盘后 集合竞价 时间
closing_time = datetime.time(15, 00, 00).strftime("%H:%M:%S")  # 定义 收盘时间
after_closing_time = datetime.time(15, 1, 00).strftime("%H:%M:%S")  # 定义 收盘后时间
checking_data_time = datetime.time(17, 00, 00).strftime("%H:%M:%S")  # 定义 检查数据时间
update_data_time = datetime.time(18, 31, 00).strftime("%H:%M:%S")  # 定义更新数据时间
program_sleep_time = datetime.time(23, 00, 00).strftime("%H:%M:%S")  # 定义程序休眠时间
 
# 读取已经获取到并存储在本地的目标范围的个股的板块概念
# 读取JSON文件并解析为字典
if os.path.exists(constant.ALL_STOCKS_PLATE_PATH):
    with open(constant.ALL_STOCKS_PLATE_PATH, 'r',
              encoding='utf-8') as f:
        json_data = f.read()
else:
    json_data = "{}"
all_stocks_plate_dict = json.loads(json_data)
logger.info(f"all_stocks_plate_dict的数量={len(all_stocks_plate_dict)}")
 
# 初始化当日当时最高价
high_price = 0
# 初始化当日当时最低价
low_price = 0
 
# 初始化每日涨停信息
daily_limit_up_info = []
# 初始化开盘啦涨停昨日信息涨停代码
yesterday_limit_up_code_list = []
# 初始化开盘啦昨日炸板但通过K线数据计算涨停的股票代码列表
yesterday_frying_plate_last_minute_list = []
# 初始化每日涨停信息方法被执行记录
execution = False
# 初始化实时涨停概念板块
limit_up_block_names = []
# 初始化板块强度下的个股强度
market_sift_plate_stock_dict = {}
# 初始化实时大盘行情情绪综合强度[分数]
real_time_market_strong = 0
# 初始化实时大盘行情情绪综合强度分时列表
time_sharing_market_strong_dirt = {}
 
# 为K线属性指标字典初始化
all_stocks_all_K_line_property_dict = {}
# 声明K线属性中所有涨停类型
limit_up_type = ['one_line_limit_up', 'limit_down_then_limit_up', 'limit_up_then_limit_down_then_limit_up',
                 'limit_up']
# 声明K线属性中所有跌停类型
limit_down_type = ['limit_up_then_limit_down', 'one_line_limit_down', 'limit_down', 'touch_limit_down']
# 声明K线属性中所有炸板类型
frying_plate_type = ['frying_plate', 'first_frying_plate', 'one_line_limit_up_then_frying_plate',
                     'one_line_limit_up_then_frying_plate_then_limit_down', 'not_first_frying_plate']
 
# 定义一个当日分时内所有个股的开盘价字典
all_stocks_current_open = {}
# 定义一个当日分时内所有个股的实时最高价和最低价字典
all_stocks_current_high_and_low = {}
# 定义一个当日分时内所有个股的上一个实时总成交量字典
all_stocks_last_volume = {}
# 定义一个当前最新价初始化缓存
current_new_price = 0
 
# 为当前账户全部【资金信息】创建字典
account_finance_dict = {}
# 为当前账户可用资金创建一个变量
usefulMoney = 0
# 为当前账户全部【持仓信息】创建列表
account_positions_dict = {}
# 为持仓代码创建一个初始集合
position_symbols_set = set()
# 为当日可用持仓代码创建一个初始集合
available_symbols_set = set()
# 为当日新增加持仓代码创建一个初始集合   买入策略中会用到 判断是否成功买了三支票
addition_position_symbols_set = set()
 
# 定义一个记录开盘价(开盘时最新价)是否记录
record_current_open_execution = False
# 定义一个实时计算最高价和最低价的函数是否在规定时间内启动
record_high_and_low_execution = False
# 定义一个集合竞价后开盘前的逻辑是否只进入判断一次
# later_open_bidding_time_is_entered = False ##################
# 定义一个集合竞价时间段条件分支逻辑的初始执行次数
execution_times = 0
# 定义一个有概念逻辑分支买入进入执行的初始化次数
have_plate_buy_times = 0
# 定义一个有强度逻辑分支买入进入执行的初始化次数
have_strength_buy_times = 0
# 定义一个有小量换大涨幅逻辑分支买入进入执行的初始化次数
have_small_turn_large_buy_times = 0
# 创建一个已买板块列表
bought_plate = []
# 持仓金额自动管理开关
position_automatic_management_switch = True
# 初始化有概念买入金额
have_plate_buy_money = 3000
# 初始化有强度买入金额
have_strength_buy_money = 3000
# 今日计划下单金额
today_planned_order_amount = 0
 
# 最新的市场行情数据
# {"code":(代码,昨日收盘价,最新价,总成交量,总成交额,买五档(价格,成交额),卖五档(价格,成交额),更新时间)}
latest_code_market_info_dict = {}
 
# 股票指数字典 例如:{"000001":(指数, 量, 额)}
stock_index_dict = {}
 
logging.info(f"全局初始化数据  完成《《《 - {os.getpid()}")
# 获取当前进程的PID