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
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
"""
该模块为全局化变量的模块
不要试图把所有数据都全局化了
"""
 
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)}")
        # 声明一下需要拉取K线的列表
        self.main_index_stocks = ['SHSE.000001', 'SZSE.399001', 'SZSE.399006', 'SHSE.000300']
        # 获取上证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 3 < 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)}")
        # logger.info(f"min_stocks==={self.min_stocks}")
        logging.info(f"全局初始化数据  完成《《《 - {os.getpid()}")
        # 获取当前进程的PID
 
 
'''
设定常用当前时间函数方法,为什么这里不是一个函数方法????
'''
now_time = datetime.datetime.now().strftime("%H:%M:%S")  # 定义并实时获取 当前时间
'''
设定常用时间点【常量】
字符串格式=="09:25:12"
'''
 
SERVER_RESTART_TIME = "09:00:00"  # 服务器重启时间
L1_DATA_START_TIME = "09:15:00"  # L1数据开始时间
BEFORE_OPEN_BIDDING_TIME = "09:20:00"  # 【盘前】集合竞价开始前时间
OPEN_BIDDING_TIME = "09:25:00"  # 【盘前】集合竞价开始时间
LATER_OPEN_BIDDING_TIME = "09:25:06"  # 【盘前】集合竞价开始后瞬间
AFTER_OPEN_BIDDING_TIME = "09:25:12"  # 【盘前】集合竞价开始后一会
OPENING_TIME = "09:30:00"  # 上午开盘时间
MORN_MARKET_TIME = "09:35:00"  # 早盘黄金五分钟
MORN_MARKET_CLOSING_TIME = "11:30:00"  # 上午收盘时间
NOON_MARKET_OPENING_TIME = "13:00:00"  # 下午开盘时间
NOON_MARKET_TIME = "13:05:00"  # 午盘黄金五分钟
CLOSE_POSITION_TIME = "14:55:00"  # 尾盘平仓时间
WATCH_DISK_END_TIME = "14:56:00"  # 板上盯结束时间
CLOSE_BIDDING_TIME = "14:57:00"  # 【盘后】集合竞价开始
CLOSING_TIME = "15:00:00"  # 定义 收盘时间
AFTER_CLOSING_TIME = "15:01:00"  # 下午收盘后时间
CHECKING_DATA_TIME = "17:00:00"  # 检查数据时间
UPDATE_DATA_TIME = "18:31:00"  # 更新数据时间
PROGRAM_SLEEP_TIME = "22:00:00"  # 程序休眠时间【不能在23点之后仍运行,获取到的数据可能有谬误】
 
# 初始化当日当时最高价
high_price = 0
# 初始化当日当时最低价
low_price = 0
 
# 初始化每日涨停信息
daily_limit_up_info = []
# 初始化开盘啦涨停昨日信息涨停代码
yesterday_limit_up_code_list = []
# 初始化开盘啦昨日炸板但通过K线数据计算涨停的股票代码列表
yesterday_frying_plate_last_minute_list = []
# 初始化每日涨停信息方法 和 获取所有个股的板块概念 是否被执行
execution = False
# 初始化 写入带属性指数K线的方法 是否被执行
index_K_line_write_execution = False
# 初始化实时涨停概念板块
limit_up_block_names = []
# 初始化板块强度下的个股强度
market_sift_plate_stock_dict = {}
# 初始化实时大盘行情市场情绪综合强度【完整】字典
rise_and_fall_statistics_dirt = {}
# 初始化实时大盘行情情绪综合强度[分数]
real_time_market_strong = 0
# 初始化实时大盘行情市场情绪 涨跌统计 字典
real_time_market_sentiment_dirt = {}
 
# 为所有个股的带属性K线 字典初始化
all_stocks_all_K_line_property_dict = {}
# 为指数的带属性K线 字典初始化
all_index_k_line_property_dict = {}
# 为所有个股的所属板块概念字典初始化
all_stocks_plate_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
# 定义一个集合竞价时间段条件分支逻辑的初始执行次数
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
# GUI手动设置的每次买入的金额
BUY_MONEY_PER_CODE = -1
# 初始化有概念买入金额
have_plate_buy_money = 3000
# 初始化有强度买入金额
have_strength_buy_money = 3000
# 开仓策略计算金额
opening_strategy_results = 0
# 今日第一次下单的金额
today_first_planned_order_amount = 0
# 今日计划下单金额
today_planned_order_amount = 0
 
# 最新的市场行情数据
# {"code":(代码,昨日收盘价,最新价,总成交量,总成交额,买五档(价格,成交额),卖五档(价格,成交额),更新时间)}
latest_code_market_info_dict = {}
 
# 主要指数 掘金代码 列表:[上证指数,深证成指,创业扳指,沪深300]
INDEX_SYMBOL_LIST = ['SHSE.000001', 'SZSE.399001', 'SZSE.399006', 'SHSE.000300']
# 股票指数字典 例如:{"000001":(指数, 量, 额, 昨日收盘价)}
stock_index_dict = {}
# 上证指数 瞬时涨幅
Shanghai_tick_growth = 0
# 上证指数 当日涨幅
Shanghai_today_growth = 0
# 上证指数 开盘涨幅
Shanghai_open_growth = 0
 
# 深证指数 瞬时涨幅
Shenzhen_tick_growth = 0
# 深证指数 当日涨幅
Shenzhen_today_growth = 0
# 深证指数 开盘涨幅
Shenzhen_open_growth = 0
 
# 创业板指 瞬时涨幅
TSXV_tick_growth = 0
# 创业板指 当日涨幅
TSXV_today_growth = 0
# 创业板指 开盘涨幅
TSXV_open_growth = 0
# 大盘指数情绪预期分数
index_trend_expectation_score = 0
# 理想交易行情比率分 满分=1
ideal_trading_market_score = 1
 
# 可以板上盯卖的代码
LIMIT_UP_SELL_CODES = set()
# L2炸板数据
L2_explosion_data = {}
 
# 最新的L1数据: {代码: L1数据}
current_l1_dict = {}
 
# 最新成交价格
latest_deal_price_dict = {}
 
logging.info(f"全局初始化数据  完成《《《 - {os.getpid()}")
 
# 大单成交数据: {"代码":[大单数据1,大单数据2,...]}
big_order_deal_dict = {}