mns-scheduler 1.4.4.5__py3-none-any.whl → 1.4.6.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mns-scheduler might be problematic. Click here for more details.

@@ -17,6 +17,7 @@ import mns_common.component.trade_date.trade_date_common_service_api as trade_da
17
17
 
18
18
  mongodb_util = MongodbUtil('27017')
19
19
 
20
+
20
21
  # 固定的选择
21
22
  # fixed_optional_list = ['USDCNH', 'XAUUSD',
22
23
  # '881279',
@@ -37,17 +38,16 @@ mongodb_util = MongodbUtil('27017')
37
38
  # ]
38
39
 
39
40
  # 固定的选择
40
- fixed_optional_list = ['899050', '881157']
41
-
41
+ # fixed_optional_list = ['899050', '881157']
42
42
 
43
- def add_fixed_optional():
44
- ths_cookie = cookie_info_service.get_ths_cookie()
45
- for symbol in fixed_optional_list:
46
- ths_self_choose_api.add_stock_to_account(symbol, ths_cookie)
43
+ #
44
+ # def add_fixed_optional():
45
+ # ths_cookie = cookie_info_service.get_ths_cookie()
46
+ # for symbol in fixed_optional_list:
47
+ # ths_self_choose_api.add_stock_to_account(symbol, ths_cookie)
47
48
 
48
-
49
- def delete_all_self_choose_stocks():
50
- ths_cookie = cookie_info_service.get_ths_cookie()
49
+ # 删除所有自选股票
50
+ def delete_all_self_choose_stocks(ths_cookie):
51
51
  all_self_choose_stock_list = ths_self_choose_api.get_all_self_choose_stock_list(ths_cookie)
52
52
  for stock_one in all_self_choose_stock_list.itertuples():
53
53
  symbol = stock_one.code
@@ -55,8 +55,7 @@ def delete_all_self_choose_stocks():
55
55
 
56
56
 
57
57
  # 添加固定自选股票
58
- def add_self_choose_symbol():
59
- ths_cookie = cookie_info_service.get_ths_cookie()
58
+ def add_self_choose_symbol(ths_cookie):
60
59
  # 固定自选
61
60
  self_choose_symbol_df = mongodb_util.find_all_data(db_name_constant.SELF_CHOOSE_STOCK)
62
61
  if data_frame_util.is_not_empty(self_choose_symbol_df):
@@ -66,8 +65,7 @@ def add_self_choose_symbol():
66
65
 
67
66
 
68
67
  # 添加今日选择股票
69
- def add_today_choose_symbol():
70
- ths_cookie = cookie_info_service.get_ths_cookie()
68
+ def add_today_choose_symbol(ths_cookie):
71
69
  now_date = datetime.now()
72
70
  str_day = now_date.strftime('%Y-%m-%d')
73
71
  last_trade_day = trade_date_common_service_api.get_last_trade_day(str_day)
@@ -81,8 +79,7 @@ def add_today_choose_symbol():
81
79
 
82
80
 
83
81
  # 添加同花顺概念
84
- def add_self_choose_concept():
85
- ths_cookie = cookie_info_service.get_ths_cookie()
82
+ def add_self_choose_concept(ths_cookie):
86
83
  query_plate = {'self_type': {
87
84
  "$in": [self_choose_constant.SELF_CHOOSE_THS_CONCEPT,
88
85
  self_choose_constant.SELF_CHOOSE_THS_INDUSTRY]}}
@@ -95,7 +92,7 @@ def add_self_choose_concept():
95
92
 
96
93
 
97
94
  # 添加最近交易股票
98
- def add_trade_stocks():
95
+ def add_trade_stocks(ths_cookie):
99
96
  now_date = datetime.now()
100
97
  str_day = now_date.strftime('%Y-%m-%d')
101
98
  last_trade_day = trade_date_common_service_api.get_last_trade_day(str_day)
@@ -109,15 +106,13 @@ def add_trade_stocks():
109
106
  trade_stocks_df = mongodb_util.find_query_data(db_name_constant.BUY_STOCK_NAME, query)
110
107
  if data_frame_util.is_not_empty(trade_stocks_df):
111
108
  stock_list = stock_list.union(set(trade_stocks_df['symbol']))
112
- ths_cookie = cookie_info_service.get_ths_cookie()
113
109
  if len(stock_list) > 0:
114
110
  for symbol in stock_list:
115
111
  ths_self_choose_api.add_stock_to_account(symbol, ths_cookie)
116
112
 
117
113
 
118
114
  # 添加连板到自选
119
- def add_continue_boards_zt_stocks():
120
- ths_cookie = cookie_info_service.get_ths_cookie()
115
+ def add_continue_boards_zt_stocks(ths_cookie):
121
116
  now_date = datetime.now()
122
117
  str_day = now_date.strftime('%Y-%m-%d')
123
118
  if trade_date_common_service_api.is_trade_day(str_day):
@@ -138,19 +133,52 @@ def add_continue_boards_zt_stocks():
138
133
  ths_self_choose_api.add_stock_to_account(stock_one.symbol, ths_cookie)
139
134
 
140
135
 
136
+ # 添加主线龙头
137
+ def add_main_line_leader(ths_cookie):
138
+ main_line_leader_df = mongodb_util.find_query_data('main_line_leader', {})
139
+ if data_frame_util.is_not_empty(main_line_leader_df):
140
+ main_line_leader_df = count_main_line_number(main_line_leader_df)
141
+
142
+ main_line_leader_df = main_line_leader_df.sort_values(
143
+ by=['main_line_number', 'main_line_leader_grade'],
144
+ ascending=[False, False,]
145
+ )
146
+ for stock_one in main_line_leader_df.itertuples():
147
+ ths_self_choose_api.add_stock_to_account(stock_one.symbol, ths_cookie)
148
+
149
+
150
+ # 统计主线的数量
151
+ def count_main_line_number(main_line_detail_df):
152
+ # 统计主线的数量
153
+ main_line_detail_df['main_line_number'] = main_line_detail_df.groupby('main_line')['main_line'].transform(
154
+ 'count')
155
+ # 相同主线数量 数量加1
156
+ main_line_detail_df['main_line_number'] = (
157
+ main_line_detail_df.groupby('main_line_number')['main_line']
158
+ .transform('rank', method='dense') - 1
159
+ ) * 0.1 + main_line_detail_df['main_line_number']
160
+
161
+ return main_line_detail_df
162
+
163
+
141
164
  # 自选股操作 删除当天自选股 增加新的连板股票 添加固定选择自选
142
165
  def self_choose_stock_handle():
143
- delete_all_self_choose_stocks()
166
+ ths_cookie = cookie_info_service.get_ths_cookie()
167
+
168
+ delete_all_self_choose_stocks(ths_cookie)
144
169
  # 固定自选板块
145
- add_fixed_optional()
170
+ # add_fixed_optional()
146
171
  # 添加同花顺概念
147
- add_self_choose_concept()
172
+ add_self_choose_concept(ths_cookie)
173
+ # 添加主线龙头
174
+ add_main_line_leader(ths_cookie)
148
175
  # 连板股票
149
- add_continue_boards_zt_stocks()
176
+ add_continue_boards_zt_stocks(ths_cookie)
177
+
150
178
  # 自己买入的股票
151
- add_trade_stocks()
179
+ add_trade_stocks(ths_cookie)
152
180
  # 添加自选股票
153
- add_self_choose_symbol()
181
+ add_self_choose_symbol(ths_cookie)
154
182
 
155
183
 
156
184
  if __name__ == '__main__':
@@ -52,5 +52,5 @@ def sync_stock_tfp(str_day):
52
52
 
53
53
 
54
54
  if __name__ == '__main__':
55
- df = sync_stock_tfp('2025-07-30')
55
+ df = sync_stock_tfp('2025-12-25')
56
56
  print(df)
@@ -18,13 +18,11 @@ import mns_common.api.ths.zt.ths_stock_zt_pool_v2_api as ths_stock_zt_pool_v2_ap
18
18
  import mns_common.component.zt.zt_common_service_api as zt_common_service_api
19
19
  import mns_common.component.em.em_real_time_quotes_api as em_real_time_quotes_api
20
20
  from datetime import datetime
21
- import mns_common.api.ths.zt.ths_stock_zt_pool_api as ths_stock_zt_pool_api
22
21
  import mns_common.constant.db_name_constant as db_name_constant
23
22
  import mns_common.component.deal.deal_service_api as deal_service_api
24
23
  import mns_common.component.company.company_common_service_new_api as company_common_service_new_api
25
- import mns_common.api.ths.company.ths_company_info_api as ths_company_info_api
26
- import mns_common.component.cookie.cookie_info_service as cookie_info_service
27
- import time
24
+ import mns_common.component.main_line.main_line_zt_reason_service as main_line_zt_reason_service
25
+ from mns_common.utils.async_fun import async_fun
28
26
 
29
27
  '''
30
28
  东方财富涨停池
@@ -70,6 +68,8 @@ def save_zt_info(str_day):
70
68
  ths_zt_pool_df_data = pd.DataFrame()
71
69
 
72
70
  stock_em_zt_pool_df_data = handle_ths_em_diff_data(ths_zt_pool_df_data, stock_em_zt_pool_df_data)
71
+ # 更新涨停分析和原因数据
72
+ update_zt_reason_analysis(stock_em_zt_pool_df_data, str_day)
73
73
 
74
74
  stock_em_zt_pool_df_data = common_service_fun_api.total_mv_classification(stock_em_zt_pool_df_data.copy())
75
75
 
@@ -79,21 +79,18 @@ def save_zt_info(str_day):
79
79
 
80
80
  stock_em_zt_pool_df_data = company_common_service_api.amendment_industry(stock_em_zt_pool_df_data.copy())
81
81
 
82
- # 主线标记 复盘用
83
- stock_em_zt_pool_df_data['main_line'] = ''
84
- stock_em_zt_pool_df_data['sub_main_line'] = ''
85
- stock_em_zt_pool_df_data['zt_reason'] = ''
86
- stock_em_zt_pool_df_data['zt_analysis'] = ''
87
-
88
82
  # 上个交易交易日涨停股票
89
83
  last_trade_day_zt_df = zt_common_service_api.get_last_trade_day_zt(str_day)
90
84
  # 设置连板
91
85
  stock_em_zt_pool_df_data = set_connected_boards_numbers(stock_em_zt_pool_df_data.copy(),
92
86
  last_trade_day_zt_df.copy())
93
- # 同步今日主线数据
94
- stock_em_zt_pool_df_data = sync_main_line_data(stock_em_zt_pool_df_data.copy(), str_day)
95
- # 保存今日主线数据
96
- stock_em_zt_pool_df_data = save_today_main_line(stock_em_zt_pool_df_data, str_day)
87
+
88
+ # 添加主线信息
89
+ stock_em_zt_pool_df_data = main_line_zt_reason_service.merge_main_line_info(str_day,
90
+ stock_em_zt_pool_df_data.copy())
91
+ # 添加涨停原因和分析信息
92
+ stock_em_zt_pool_df_data = main_line_zt_reason_service.merge_zt_reason_info(str_day,
93
+ stock_em_zt_pool_df_data.copy())
97
94
 
98
95
  stock_em_zt_pool_df_data['first_closure_time'] = stock_em_zt_pool_df_data['first_closure_time'].str.strip()
99
96
  stock_em_zt_pool_df_data['list_date'] = stock_em_zt_pool_df_data['list_date'].apply(
@@ -130,6 +127,9 @@ def save_zt_info(str_day):
130
127
 
131
128
  mongodb_util.save_mongo(today_new_zt_pool_df, db_name_constant.STOCK_ZT_POOL)
132
129
  stock_em_zt_pool_df_data = pd.concat([stock_exist_zt_pool_df, today_new_zt_pool_df])
130
+ # 保存连板股票主线
131
+ main_line_zt_reason_service.save_last_trade_day_main_line(str_day, stock_em_zt_pool_df_data)
132
+
133
133
  stock_em_zt_pool_df_data.fillna('', inplace=True)
134
134
  stock_em_zt_pool_df_data = stock_em_zt_pool_df_data[ZT_FIELD]
135
135
  return stock_em_zt_pool_df_data
@@ -340,192 +340,19 @@ def query_company_info_with_share():
340
340
  return company_info_df
341
341
 
342
342
 
343
- def sync_main_line_data(stock_em_zt_pool_df_data, str_day):
344
- # 主线标记 复盘用
345
- stock_em_zt_pool_df_data['main_line'] = ''
346
- stock_em_zt_pool_df_data['sub_main_line'] = ''
347
- stock_em_zt_pool_df_data['zt_reason'] = ''
348
- stock_em_zt_pool_df_data['zt_analysis'] = ''
349
-
350
- last_trade_day = trade_date_common_service_api.get_last_trade_day(str_day)
351
-
352
- last_trade_day_main_line_df = mongodb_util.find_query_data(db_name_constant.MAIN_LINE_DETAIL,
353
- {'str_day': last_trade_day, 'symbol': {
354
- "$in": list(stock_em_zt_pool_df_data['symbol'])}})
355
- if data_frame_util.is_not_empty(last_trade_day_main_line_df):
356
- symbol_mapping_main_line = dict(
357
- zip(last_trade_day_main_line_df['symbol'], last_trade_day_main_line_df['main_line']))
358
-
359
- symbol_mapping_sub_main_line = dict(
360
- zip(last_trade_day_main_line_df['symbol'], last_trade_day_main_line_df['sub_main_line']))
361
-
362
- stock_em_zt_pool_df_data['main_line'] = (stock_em_zt_pool_df_data['symbol']
363
- .map(symbol_mapping_main_line).fillna(
364
- stock_em_zt_pool_df_data['main_line']))
365
-
366
- stock_em_zt_pool_df_data['sub_main_line'] = stock_em_zt_pool_df_data['symbol'].map(
367
- symbol_mapping_sub_main_line).fillna(
368
- stock_em_zt_pool_df_data['sub_main_line'])
369
-
370
- today_zt_reason_analysis = mongodb_util.find_query_data(db_name_constant.MAIN_REASON_ANALYSIS,
371
- {'str_day': str_day, 'symbol': {
372
- "$in": list(stock_em_zt_pool_df_data['symbol'])}})
373
- if data_frame_util.is_not_empty(today_zt_reason_analysis):
374
- # 创建一个映射字典
375
- symbol_mapping_zt_reason = dict(zip(today_zt_reason_analysis['symbol'], today_zt_reason_analysis['zt_reason']))
376
-
377
- symbol_mapping_zt_analysis = dict(
378
- zip(today_zt_reason_analysis['symbol'], today_zt_reason_analysis['zt_analysis']))
379
-
380
- symbol_mapping_main_line = dict(zip(today_zt_reason_analysis['symbol'], today_zt_reason_analysis['main_line']))
381
-
382
- symbol_mapping_sub_main_line = dict(
383
- zip(today_zt_reason_analysis['symbol'], today_zt_reason_analysis['sub_main_line']))
384
-
385
- # 使用map进行替换,不匹配的保持原值
386
- stock_em_zt_pool_df_data['zt_reason'] = stock_em_zt_pool_df_data['symbol'].map(symbol_mapping_zt_reason).fillna(
387
- stock_em_zt_pool_df_data['zt_reason'])
388
-
389
- stock_em_zt_pool_df_data['zt_analysis'] = stock_em_zt_pool_df_data['symbol'].map(
390
- symbol_mapping_zt_analysis).fillna(
391
- stock_em_zt_pool_df_data['zt_analysis'])
392
-
393
- stock_em_zt_pool_df_data['main_line'] = stock_em_zt_pool_df_data['symbol'].map(symbol_mapping_main_line).fillna(
394
- stock_em_zt_pool_df_data['main_line'])
395
-
396
- stock_em_zt_pool_df_data['sub_main_line'] = stock_em_zt_pool_df_data['symbol'].map(
397
- symbol_mapping_sub_main_line).fillna(
398
- stock_em_zt_pool_df_data['sub_main_line'])
399
-
400
- return stock_em_zt_pool_df_data
401
-
402
-
403
- def save_today_main_line(stock_em_zt_pool_df_data, str_day):
404
- for stock_one in stock_em_zt_pool_df_data.itertuples():
405
- try:
406
- zt_reason = stock_one.zt_reason
407
- zt_analyse_detail = stock_one.zt_analysis
408
- reason_tag = False
409
- if data_frame_util.is_string_empty(zt_reason) or data_frame_util.is_string_empty(zt_analyse_detail):
410
-
411
- # 问财获取
412
- if bool(1 - reason_tag):
413
- try:
414
- # 问财获取涨停分析
415
- zt_result_dict = ths_stock_zt_pool_api.zt_analyse_reason(stock_one.symbol)
416
- zt_analyse_detail = zt_result_dict['zt_analyse_detail']
417
- zt_reason = zt_result_dict['zt_reason']
418
- time.sleep(2)
419
- reason_tag = True
420
- except BaseException as e:
421
- time.sleep(2)
422
- logger.error("问财获取涨停详情异常:{},{}", stock_one.symbol, e)
423
-
424
- if bool(1 - reason_tag):
425
- # 网页获取
426
- try:
427
- ths_cookie = cookie_info_service.get_ths_cookie()
428
- # 问财获取涨停分析
429
- zt_analyse_detail = ths_company_info_api.get_company_hot_info(stock_one.symbol, ths_cookie)
430
- zt_reason = zt_analyse_detail.split("\n")[0]
431
-
432
- time.sleep(2)
433
- except BaseException as e:
434
- time.sleep(2)
435
- logger.error("网页获取涨停详情异常:{},{}", stock_one.symbol, e)
436
-
437
- stock_em_zt_pool_df_data.loc[
438
- stock_em_zt_pool_df_data['symbol'] == stock_one.symbol, 'zt_reason'] = zt_reason
439
-
440
- stock_em_zt_pool_df_data.loc[
441
- stock_em_zt_pool_df_data['symbol'] == stock_one.symbol, 'zt_analysis'] = zt_analyse_detail
442
-
443
- main_line = stock_one.main_line
444
- sub_main_line = stock_one.sub_main_line
445
- connected_boards_numbers = stock_one.connected_boards_numbers
446
-
447
- if data_frame_util.is_string_empty(zt_reason):
448
- continue
449
-
450
- if data_frame_util.is_string_empty(zt_analyse_detail):
451
- continue
452
-
453
- key_id = stock_one.symbol + "_" + str_day
454
- # 更新临时表
455
- query_zt = {"_id": key_id}
456
- if mongodb_util.exist_data_query(db_name_constant.MAIN_REASON_ANALYSIS, query_zt):
457
-
458
- if data_frame_util.is_string_not_empty(zt_reason):
459
- new_values_reason = {"$set": {
460
- 'zt_reason': zt_reason}}
461
-
462
- mongodb_util.update_many(query_zt, new_values_reason, db_name_constant.MAIN_REASON_ANALYSIS)
463
-
464
- if data_frame_util.is_string_not_empty(zt_analyse_detail):
465
- new_values_zt_analysis = {"$set": {
466
- 'zt_analysis': zt_analyse_detail}}
467
-
468
- mongodb_util.update_many(query_zt, new_values_zt_analysis, db_name_constant.MAIN_REASON_ANALYSIS)
469
- else:
470
- main_dict = {'_id': key_id,
471
- 'symbol': stock_one.symbol,
472
- 'name': stock_one.name,
473
- 'zt_analysis': zt_analyse_detail,
474
- 'zt_reason': zt_reason,
475
- 'main_line': main_line,
476
- 'sub_main_line': sub_main_line,
477
- 'str_day': str_day,
478
- 'update_time': str_now_date,
479
- 'connected_boards_numbers': connected_boards_numbers
480
- }
481
-
482
- main_line_df = pd.DataFrame(main_dict, index=[1])
483
- mongodb_util.insert_mongo(main_line_df, db_name_constant.MAIN_REASON_ANALYSIS)
484
-
485
- if data_frame_util.is_string_empty(main_line):
486
- continue
487
-
488
- if data_frame_util.is_string_empty(sub_main_line):
489
- continue
490
-
491
- # 去除开头和结尾空格
492
- if data_frame_util.is_string_not_empty(main_line):
493
- main_line = main_line.strip()
494
- if data_frame_util.is_string_not_empty(sub_main_line):
495
- sub_main_line = sub_main_line.strip()
496
- now_date = datetime.now()
497
- str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
498
- hour = now_date.hour
499
-
500
- main_dict = {'_id': key_id,
501
- 'symbol': stock_one.symbol,
502
- 'name': stock_one.name,
503
- 'zt_analysis': zt_analyse_detail,
504
- 'zt_reason': zt_reason,
505
- 'main_line': main_line,
506
- 'sub_main_line': sub_main_line,
507
- 'str_day': str_day,
508
- 'update_time': str_now_date,
509
- 'connected_boards_numbers': connected_boards_numbers
510
- }
511
-
512
- main_line_df = pd.DataFrame(main_dict, index=[1])
513
-
514
- # 更新主线表
515
- is_no_update_main_line = trade_date_common_service_api.is_trade_day(str_day) and 8 < hour < 15
516
- if is_no_update_main_line:
517
- continue
518
-
519
- if mongodb_util.exist_data_query(db_name_constant.MAIN_LINE_DETAIL, query_zt):
520
- continue
521
- else:
522
- mongodb_util.insert_mongo(main_line_df, db_name_constant.MAIN_LINE_DETAIL)
523
-
524
- except BaseException as e:
525
- logger.error("同步涨停信息出现异常:{},{}", stock_one.symbol, e)
343
+ # 异步更新涨停分析和数据
344
+ @async_fun
345
+ def update_zt_reason_analysis(stock_em_zt_pool_df_data, str_day):
346
+ if data_frame_util.is_empty(stock_em_zt_pool_df_data):
347
+ return
348
+ now_date = datetime.now()
349
+ now_str_day = now_date.strftime('%Y-%m-%d')
350
+ if now_str_day != str_day:
351
+ return
526
352
 
527
- return stock_em_zt_pool_df_data
353
+ stock_em_zt_pool_df_data['str_day'] = str_day
354
+ main_line_zt_reason_service.update_symbol_list_zt_reason_analysis(stock_em_zt_pool_df_data, True)
528
355
 
529
356
 
530
357
  if __name__ == '__main__':
531
- save_zt_info('2025-12-03')
358
+ save_zt_info('2025-12-29')
@@ -8,10 +8,10 @@ sys.path.append(project_path)
8
8
  from mns_common.db.MongodbUtil import MongodbUtil
9
9
 
10
10
  mongodb_util = MongodbUtil('27017')
11
- import mns_common.api.ths.zt.ths_stock_zt_pool_api as ths_stock_zt_pool_api
12
11
  import mns_common.utils.data_frame_util as data_frame_util
13
12
  from loguru import logger
14
13
  import time
14
+ import mns_common.component.main_line.main_line_zt_reason_service as main_line_zt_reason_service
15
15
 
16
16
 
17
17
  def update_null_zt_reason(str_day):
@@ -25,37 +25,55 @@ def update_null_zt_reason(str_day):
25
25
 
26
26
  ]}
27
27
  stock_zt_pool_df_null_zt_reason = mongodb_util.find_query_data('stock_zt_pool', query)
28
- if data_frame_util.is_empty(stock_zt_pool_df_null_zt_reason):
29
- return None
30
- no_reason_list = list(stock_zt_pool_df_null_zt_reason['symbol'])
31
- repeat_number = 0
32
- # 循环10次
33
- while len(no_reason_list) > 0 and repeat_number < 10:
34
-
35
- for stock_zt_one in stock_zt_pool_df_null_zt_reason.itertuples():
36
- try:
37
- # 涨停原因
38
- stock_zt_pool_df_one_df = stock_zt_pool_df_null_zt_reason.loc[
39
- stock_zt_pool_df_null_zt_reason['symbol'] == stock_zt_one.symbol]
40
- # 涨停分析
41
- zt_result_dict = ths_stock_zt_pool_api.zt_analyse_reason(stock_zt_one.symbol)
42
- time.sleep(5)
43
-
44
- zt_analysis = zt_result_dict['zt_analyse_detail']
45
- zt_reason = zt_result_dict['zt_reason']
46
-
47
- stock_zt_pool_df_one_df['zt_analysis'] = zt_analysis
48
- stock_zt_pool_df_one_df['zt_reason'] = zt_reason
49
-
50
- mongodb_util.save_mongo(stock_zt_pool_df_one_df, 'stock_zt_pool')
51
- if stock_zt_one.symbol in no_reason_list:
52
- no_reason_list.remove(stock_zt_one.symbol)
53
- except BaseException as e:
54
- logger.error("出现异常:{},{}", stock_zt_one.symbol, e)
28
+ no_reason_list = []
29
+ if data_frame_util.is_not_empty(stock_zt_pool_df_null_zt_reason):
30
+ no_reason_list = list(stock_zt_pool_df_null_zt_reason['symbol'])
31
+
32
+ # 比较两个表
33
+ query_zt_reason_analysis = {"str_day": str_day}
34
+ stock_zt_pool_df_exist = mongodb_util.find_query_data('stock_zt_pool', query_zt_reason_analysis)
35
+ stock_zt_reason_df = mongodb_util.find_query_data('zt_reason_analysis', query_zt_reason_analysis)
36
+ if data_frame_util.is_not_empty(stock_zt_pool_df_exist):
37
+ if data_frame_util.is_empty(stock_zt_reason_df):
38
+ no_reason_list.extend(list(stock_zt_pool_df_exist['symbol']))
39
+ else:
40
+ not_in_zt_reason_zf = stock_zt_pool_df_exist.loc[~stock_zt_pool_df_exist['symbol']
41
+ .isin(stock_zt_reason_df['symbol'])]
42
+ if data_frame_util.is_not_empty(not_in_zt_reason_zf):
43
+ no_reason_list.extend(list(not_in_zt_reason_zf['symbol']))
44
+
45
+ null_zt_reason_df = stock_zt_reason_df.loc[(stock_zt_reason_df['zt_reason'] == '')
46
+ | (stock_zt_reason_df['zt_analysis'] == '')]
47
+ if data_frame_util.is_empty(null_zt_reason_df):
48
+ no_reason_list.extend(list(null_zt_reason_df['symbol']))
49
+
50
+ for symbol in no_reason_list:
51
+ try:
52
+
53
+ need_update_zt_pool_df = stock_zt_pool_df_exist.loc[
54
+ stock_zt_pool_df_exist['symbol'].isin([symbol])]
55
+ main_line_zt_reason_service.update_symbol_list_zt_reason_analysis(need_update_zt_pool_df, True)
56
+ time.sleep(2)
57
+
58
+ query_zt = {'symbol': symbol, 'str_day': str_day}
59
+ zt_reason_analysis_one_df = mongodb_util.find_query_data('zt_reason_analysis', query_zt)
60
+ if data_frame_util.is_empty(zt_reason_analysis_one_df):
55
61
  continue
56
- repeat_number = repeat_number + 1
57
- return stock_zt_pool_df_null_zt_reason
62
+ zt_analysis = list(zt_reason_analysis_one_df['zt_analysis'])[0]
63
+ zt_reason = list(zt_reason_analysis_one_df['zt_reason'])[0]
64
+ new_values = {'$set': {
65
+ 'zt_analysis': zt_analysis,
66
+ 'zt_reason': zt_reason
67
+ }}
68
+ mongodb_util.update_many(query_zt, new_values, 'stock_zt_pool')
69
+ mongodb_util.update_many(query_zt, new_values, 'main_line_detail')
70
+
71
+ if symbol in no_reason_list:
72
+ no_reason_list.remove(symbol)
73
+ except BaseException as e:
74
+ logger.error("出现异常:{},{}", symbol, e)
75
+ continue
58
76
 
59
77
 
60
78
  if __name__ == '__main__':
61
- update_null_zt_reason('2025-12-08')
79
+ update_null_zt_reason('2026-01-07')
@@ -20,7 +20,7 @@ import mns_scheduler.zt.high_chg.sync_high_chg_pool_service as sync_high_chg_poo
20
20
  import mns_scheduler.zt.high_chg.sync_high_chg_real_time_quotes_service as sync_high_chg_real_time_quotes_service
21
21
  import mns_scheduler.zt.zt_pool.ths_zt_pool_sync_api as ths_zt_pool_sync_api
22
22
  import mns_scheduler.trade.tfp.stock_tfp_info_sync as stock_tfp_info_sync
23
-
23
+ from datetime import datetime
24
24
 
25
25
  # 定时同步每日交易行情数据(前复权)
26
26
  def stock_daily_sync_qfq():
@@ -18,7 +18,7 @@ import mns_scheduler.zt.high_chg.sync_high_chg_pool_service as sync_high_chg_poo
18
18
  import mns_scheduler.zt.high_chg.sync_high_chg_real_time_quotes_service as sync_high_chg_real_time_quotes_service
19
19
  import mns_scheduler.zt.zt_pool.ths_zt_pool_sync_api as ths_zt_pool_sync_api
20
20
  import mns_scheduler.trade.tfp.stock_tfp_info_sync as stock_tfp_info_sync
21
-
21
+ from datetime import datetime
22
22
 
23
23
  # 定时同步每日交易行情数据(前复权)
24
24
  def stock_daily_sync_qfq():
@@ -134,9 +134,9 @@ def col_data_move():
134
134
 
135
135
  if __name__ == '__main__':
136
136
  # todo 修改日期
137
- str_day = '2025-11-20'
137
+ str_day = '2026-01-05'
138
138
  # col_data_move()
139
- sync_daily_data_info()
140
- sync_stock_zt_pool()
141
- sync_stock_dt_pool()
142
- sync_stock_zb_pool()
139
+ generate_new_day_k_line_info()
140
+ # sync_stock_zt_pool()
141
+ # sync_stock_dt_pool()
142
+ # sync_stock_zb_pool()
@@ -60,6 +60,9 @@ import mns_scheduler.industry.ths.ths_industry_sync_service as ths_industry_sync
60
60
  import mns_scheduler.k_line.year_quarter.year_quarter_line_sync as year_quarter_line_sync
61
61
  import mns_scheduler.k_line.sync_status.k_line_sync_status_check as k_line_sync_status_check
62
62
  import mns_scheduler.company_info.task.company_total_task as company_total_task
63
+ import mns_scheduler.irm.stock_question_id_service as stock_question_id_service
64
+ import mns_scheduler.auto_da_ban.auto_da_ban_service as auto_da_ban_service
65
+ import mns_scheduler.kpl.theme.kpl_theme_sync_service as kpl_theme_sync_service
63
66
 
64
67
 
65
68
  # 同步交易日期任务完成
@@ -355,7 +358,11 @@ def sync_all_interactive_questions():
355
358
  # 非交易日同步
356
359
  # tag = bool(1 - trade_date_common_service_api.is_trade_day(str_day))
357
360
  # if tag:
361
+
358
362
  logger.info('同步互动回答')
363
+ stock_question_id_service.sync_sz_stock_uid([])
364
+ stock_question_id_service.sync_sh_stock_uid()
365
+
359
366
  stock_irm_cninfo_service.sync_symbols_interactive_questions([])
360
367
 
361
368
 
@@ -443,17 +450,32 @@ def check_k_line_sync_count():
443
450
  k_line_sync_status_check.check_k_line_sync_count()
444
451
 
445
452
 
453
+ # 全量同步公司信息
446
454
  def sync_all_company_info_task():
447
455
  logger.info("全量同步公司信息")
448
456
  company_total_task.sync_all_company_task()
449
457
 
450
458
 
459
+ # 自动打板
460
+ def auto_da_ban_task():
461
+ auto_da_ban_service.auto_da_ban_task()
462
+
463
+
464
+ # 同步开盘啦题材
465
+ def sync_kpl_theme():
466
+ logger.info("同步开盘啦题材")
467
+ # 同步新的开盘啦题材
468
+ kpl_theme_sync_service.sync_new_kpl_theme_info()
469
+ # 更新所有开盘啦题材
470
+ kpl_theme_sync_service.update_all_kpl_theme_info()
471
+
472
+
451
473
  # # 定义BlockingScheduler
452
474
  blockingScheduler = BlockingScheduler()
453
475
 
454
476
  # 同步东方财富a,etf,kzz,us,hk信息
455
477
  blockingScheduler.add_job(sync_all_em_stock_info, 'cron', hour='07', minute='31')
456
- blockingScheduler.add_job(sync_all_em_stock_info, 'cron', hour='15', minute='20')
478
+ blockingScheduler.add_job(sync_all_em_stock_info, 'cron', hour='16', minute='20')
457
479
 
458
480
  # 开盘前同步当天交易需要的k线数据
459
481
  blockingScheduler.add_job(sync_today_trade_k_line_info, 'cron', hour='07', minute='50')
@@ -565,6 +587,11 @@ blockingScheduler.add_job(check_k_line_sync_count, 'cron', hour='6,23', minute='
565
587
  # 同步公司产品区域信息
566
588
  blockingScheduler.add_job(sync_all_company_info_task, 'cron', day_of_week='sat,sun', hour='09',
567
589
  minute='10')
590
+ # 自动打板任务
591
+ blockingScheduler.add_job(auto_da_ban_task, 'cron', hour='19', minute='29')
592
+
593
+ # # 同步开盘啦题材
594
+ blockingScheduler.add_job(sync_kpl_theme, 'cron', hour='08,09,12,16', minute='20')
568
595
 
569
596
  print('定时任务启动成功')
570
597
  blockingScheduler.start()
@@ -1,4 +1,4 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mns-scheduler
3
- Version: 1.4.4.5
3
+ Version: 1.4.6.4
4
4