mns-scheduler 1.0.3.3__py3-none-any.whl → 1.0.3.6__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.
- mns_scheduler/backup/__init__.py +7 -0
- mns_scheduler/{concept → backup}/em/em_new_concept_his_sync.py +1 -1
- mns_scheduler/{concept → backup}/em/em_new_concept_sync_web.py +1 -1
- mns_scheduler/concept/clean/{ths_effective_concept_clean_api.py → ths_concept_clean_api.py} +1 -0
- mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +6 -88
- mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +56 -1
- mns_scheduler/concept/ths/{symbol/sync_symbol_all_concepts_api.py → update_concept_info/sync_one_symbol_all_concepts_api.py} +1 -1
- mns_scheduler/kpl/selection/index/sync_best_choose_his_index.py +4 -9
- mns_scheduler/real_time/realtime_quotes_now_sync.py +6 -2
- mns_scheduler/{ipo → trade}/auto_ipo_buy_api.py +2 -5
- mns_scheduler/trade/auto_sell_service_api.py +116 -0
- mns_scheduler/trade/sync_position_api.py +56 -0
- mns_scheduler/zz_task/data_sync_task.py +52 -25
- {mns_scheduler-1.0.3.3.dist-info → mns_scheduler-1.0.3.6.dist-info}/METADATA +1 -1
- {mns_scheduler-1.0.3.3.dist-info → mns_scheduler-1.0.3.6.dist-info}/RECORD +29 -26
- /mns_scheduler/{concept/em → backup/app}/__init__.py +0 -0
- /mns_scheduler/{concept/ths → backup}/app/ths_new_concept_sync_app.py +0 -0
- /mns_scheduler/{concept/ths/app → backup/em}/__init__.py +0 -0
- /mns_scheduler/{concept → backup}/em/em_new_concept_sync_common_api.py +0 -0
- /mns_scheduler/{concept/ths/symbol → backup/wen_cai}/__init__.py +0 -0
- /mns_scheduler/{concept/ths → backup}/wen_cai/wen_cai_concept_sync.py +0 -0
- /mns_scheduler/concept/ths/{web → sync_new_index}/__init__.py +0 -0
- /mns_scheduler/concept/ths/{web → sync_new_index}/sync_ths_concept_by_ak_api.py +0 -0
- /mns_scheduler/concept/ths/{web → sync_new_index}/sync_ths_new_concept_by_web_api.py +0 -0
- /mns_scheduler/concept/ths/{wen_cai → update_concept_info}/__init__.py +0 -0
- /mns_scheduler/concept/ths/{symbol/sync_concept_all_symbols_api.py → update_concept_info/sync_one_concept_all_symbols_api.py} +0 -0
- /mns_scheduler/{ipo → trade}/__init__.py +0 -0
- {mns_scheduler-1.0.3.3.dist-info → mns_scheduler-1.0.3.6.dist-info}/WHEEL +0 -0
- {mns_scheduler-1.0.3.3.dist-info → mns_scheduler-1.0.3.6.dist-info}/top_level.txt +0 -0
|
@@ -11,7 +11,7 @@ from loguru import logger
|
|
|
11
11
|
from datetime import datetime
|
|
12
12
|
import mns_common.utils.date_handle_util as date_handle_util
|
|
13
13
|
import mns_common.db.MongodbUtil as MongodbUtil
|
|
14
|
-
import mns_scheduler.
|
|
14
|
+
import mns_scheduler.backup.em.em_new_concept_sync_common_api as em_new_concept_sync_common_api
|
|
15
15
|
import mns_common.api.em.em_concept_index_api as em_concept_index_api
|
|
16
16
|
|
|
17
17
|
mongodb_util = MongodbUtil('27017')
|
|
@@ -9,7 +9,7 @@ sys.path.append(project_path)
|
|
|
9
9
|
import datetime
|
|
10
10
|
import time
|
|
11
11
|
from loguru import logger
|
|
12
|
-
import mns_scheduler.
|
|
12
|
+
import mns_scheduler.backup.em.em_new_concept_sync_common_api as em_new_concept_sync_common_api
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
# 同步东财新概念
|
|
@@ -2,9 +2,7 @@ import sys
|
|
|
2
2
|
import os
|
|
3
3
|
|
|
4
4
|
import pandas as pd
|
|
5
|
-
import time
|
|
6
5
|
import mns_common.api.ths.ths_stock_api as ths_stock_api
|
|
7
|
-
import datetime
|
|
8
6
|
from mns_common.db.MongodbUtil import MongodbUtil
|
|
9
7
|
import mns_common.component.company.company_common_service_api as company_common_service_api
|
|
10
8
|
|
|
@@ -15,7 +13,7 @@ sys.path.append(project_path)
|
|
|
15
13
|
mongodb_util = MongodbUtil('27017')
|
|
16
14
|
import mns_common.api.msg.push_msg_api as push_msg_api
|
|
17
15
|
import mns_scheduler.company_info.company_info_sync_api as company_info_sync_api
|
|
18
|
-
|
|
16
|
+
|
|
19
17
|
max_concept_code = 886110
|
|
20
18
|
|
|
21
19
|
order_fields = [
|
|
@@ -31,6 +29,7 @@ order_fields = [
|
|
|
31
29
|
]
|
|
32
30
|
|
|
33
31
|
|
|
32
|
+
# 推送到手机
|
|
34
33
|
def push_msg_to_we_chat_web(concept_code, concept_name, url):
|
|
35
34
|
msg = "概念代码:" + str(concept_code) + "," + "概念名称:" + concept_name + "," + "url: " + url
|
|
36
35
|
title = "新增同花顺概念:" + str(concept_code) + "-" + concept_name
|
|
@@ -100,7 +99,8 @@ def save_ths_concept_detail(new_concept_symbol_df,
|
|
|
100
99
|
|
|
101
100
|
if bool(1 - ('way' in new_concept_symbol_df.columns)):
|
|
102
101
|
new_concept_symbol_df['way'] = 'symbol_sync'
|
|
103
|
-
|
|
102
|
+
if "long" not in new_concept_symbol_df.columns:
|
|
103
|
+
new_concept_symbol_df['long'] = ''
|
|
104
104
|
new_concept_symbol_df = new_concept_symbol_df[[
|
|
105
105
|
"_id",
|
|
106
106
|
"index",
|
|
@@ -120,7 +120,8 @@ def save_ths_concept_detail(new_concept_symbol_df,
|
|
|
120
120
|
"total_mv_sp",
|
|
121
121
|
"company_type",
|
|
122
122
|
"concept_create_day",
|
|
123
|
-
"way"
|
|
123
|
+
"way",
|
|
124
|
+
"long"
|
|
124
125
|
]]
|
|
125
126
|
|
|
126
127
|
exist_concept_detail = mongodb_util.find_query_data('ths_stock_concept_detail', query)
|
|
@@ -150,92 +151,9 @@ def update_company_info(new_concept_symbol_df):
|
|
|
150
151
|
company_common_service_api.company_info_industry_cache_clear()
|
|
151
152
|
|
|
152
153
|
|
|
153
|
-
def update_null_name():
|
|
154
|
-
query = {"_id": {'$gte': 886025}}
|
|
155
|
-
ths_concept_list = mongodb_util.find_query_data('ths_concept_list', query)
|
|
156
|
-
ths_concept_list = ths_concept_list.sort_values(by=['_id'], ascending=False)
|
|
157
|
-
|
|
158
|
-
for concept_one in ths_concept_list.itertuples():
|
|
159
|
-
concept_code = concept_one.symbol
|
|
160
|
-
name = concept_one.name
|
|
161
|
-
exist_url = concept_one.url
|
|
162
|
-
|
|
163
|
-
if name == '':
|
|
164
|
-
concept_name = ths_stock_api.get_concept_name(concept_code)
|
|
165
|
-
query_concept = {"symbol": concept_code}
|
|
166
|
-
new_values = {'$set': {"name": concept_name}}
|
|
167
|
-
mongodb_util.update_one_query(query_concept, new_values, 'ths_concept_list')
|
|
168
|
-
|
|
169
|
-
new_values_detail = {'$set': {"concept_name": concept_name}}
|
|
170
|
-
|
|
171
|
-
query_concept_detail = {"concept_code": concept_code}
|
|
172
|
-
|
|
173
|
-
mongodb_util.update_many(query_concept_detail, new_values_detail, 'ths_stock_concept_detail')
|
|
174
|
-
time.sleep(10)
|
|
175
|
-
|
|
176
|
-
if exist_url == '' or pd.isna(exist_url):
|
|
177
|
-
url = 'http://q.10jqka.com.cn/thshy/detail/code/' + str(concept_code)
|
|
178
|
-
str_now_time = concept_one.str_day + " " + "00:00:00"
|
|
179
|
-
query_concept = {"symbol": concept_code}
|
|
180
|
-
new_values = {'$set': {"url": url, "str_now_time": str_now_time}}
|
|
181
|
-
mongodb_util.update_one_query(query_concept, new_values, 'ths_concept_list')
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
# 更新概念数量
|
|
185
|
-
def update_concept_number():
|
|
186
|
-
query = {}
|
|
187
|
-
ths_concept_list = mongodb_util.find_query_data('ths_concept_list', query)
|
|
188
|
-
ths_concept_list = ths_concept_list.sort_values(by=['_id'], ascending=False)
|
|
189
|
-
for concept_one in ths_concept_list.itertuples():
|
|
190
|
-
try:
|
|
191
|
-
query_detail = {'concept_code': concept_one.symbol}
|
|
192
|
-
concept_number = mongodb_util.count(query_detail, 'ths_stock_concept_detail')
|
|
193
|
-
query_update = {"symbol": concept_one.symbol}
|
|
194
|
-
new_values = {'$set': {"concept_number": concept_number}}
|
|
195
|
-
mongodb_util.update_one_query(query_update, new_values, 'ths_concept_list')
|
|
196
|
-
except BaseException as e:
|
|
197
|
-
print(e)
|
|
198
|
-
|
|
199
|
-
|
|
200
154
|
def get_concept_detail_info_web(concept_code):
|
|
201
155
|
new_concept_symbol_list = ths_stock_api.ths_stock_concept(concept_code)
|
|
202
156
|
if new_concept_symbol_list is None or new_concept_symbol_list.shape[0] == 0:
|
|
203
157
|
return None
|
|
204
158
|
new_concept_symbol_list['_id'] = str(concept_code) + '-' + new_concept_symbol_list['symbol']
|
|
205
159
|
return new_concept_symbol_list
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
def update_nan_data():
|
|
209
|
-
query = {"concept_code": float('NaN')}
|
|
210
|
-
ths_stock_concept_detail = mongodb_util.find_query_data('ths_stock_concept_detail', query)
|
|
211
|
-
|
|
212
|
-
ths_stock_concept_detail['concept_code'] = ths_stock_concept_detail['_id']
|
|
213
|
-
for stock_one in ths_stock_concept_detail.itertuples():
|
|
214
|
-
query = {"symbol": stock_one.symbol}
|
|
215
|
-
company_info = mongodb_util.find_query_data('company_info', query)
|
|
216
|
-
|
|
217
|
-
concept_code = stock_one.concept_code
|
|
218
|
-
concept_code = int(concept_code[0:6])
|
|
219
|
-
|
|
220
|
-
new_values = {'$set': {"concept_code": concept_code,
|
|
221
|
-
"flow_mv_sp": list(company_info['flow_mv_sp'])[0],
|
|
222
|
-
"total_mv_sp": list(company_info['total_mv_sp'])[0],
|
|
223
|
-
"company_type": list(company_info['company_type'])[0]
|
|
224
|
-
|
|
225
|
-
}}
|
|
226
|
-
query_update = {"_id": stock_one.concept_code}
|
|
227
|
-
mongodb_util.update_many(query_update, new_values, 'ths_stock_concept_detail')
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
def update_concept_create_day():
|
|
231
|
-
query = {"symbol": {'$exists': True}}
|
|
232
|
-
new_concept_list = mongodb_util.descend_query(query, "ths_concept_list", "_id", 500)
|
|
233
|
-
|
|
234
|
-
if new_concept_list.shape[0] > 0:
|
|
235
|
-
for one_concept in new_concept_list.itertuples():
|
|
236
|
-
concept_create_day = one_concept.str_day
|
|
237
|
-
query_update = {"concept_code": one_concept.symbol}
|
|
238
|
-
|
|
239
|
-
new_values = {'$set': {"concept_create_day": concept_create_day}}
|
|
240
|
-
|
|
241
|
-
mongodb_util.update_many(query_update, new_values, 'ths_stock_concept_detail')
|
|
@@ -11,11 +11,16 @@ from mns_common.db.MongodbUtil import MongodbUtil
|
|
|
11
11
|
from loguru import logger
|
|
12
12
|
import mns_common.utils.data_frame_util as data_frame_util
|
|
13
13
|
import mns_common.constant.db_name_constant as db_name_constant
|
|
14
|
+
import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
import mns_common.api.ths.ths_stock_api as ths_stock_api
|
|
17
|
+
import pandas as pd
|
|
14
18
|
|
|
15
19
|
mongodb_util = MongodbUtil('27017')
|
|
16
20
|
|
|
17
21
|
|
|
18
|
-
|
|
22
|
+
# 更新概念入选理由
|
|
23
|
+
def update_ths_concept_choose_reason(ths_symbol_all_concepts, symbol):
|
|
19
24
|
all_ths_concept = ths_concept_common_service_api.get_all_ths_concept()
|
|
20
25
|
for concept_one in ths_symbol_all_concepts.itertuples():
|
|
21
26
|
try:
|
|
@@ -32,3 +37,53 @@ def update_ths_concept_detail(ths_symbol_all_concepts, symbol):
|
|
|
32
37
|
mongodb_util.update_many(query, new_values, db_name_constant.THS_STOCK_CONCEPT_DETAIL)
|
|
33
38
|
except BaseException as e:
|
|
34
39
|
logger.error("更新ths概念入选理由异常{},{},{}", symbol, concept_one.title, e)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# 更新空的入选概念
|
|
43
|
+
def update_ths_concept_choose_null_reason():
|
|
44
|
+
now_date = datetime.now()
|
|
45
|
+
str_day = now_date.strftime('%Y-%m-%d')
|
|
46
|
+
last_trade_day = trade_date_common_service_api.get_last_trade_day(str_day)
|
|
47
|
+
query = {"$and": [{"str_day": {"$gte": last_trade_day}},
|
|
48
|
+
{"str_day": {"$lte": str_day}}],
|
|
49
|
+
"$or": [{"long": ""},
|
|
50
|
+
{"long": {"$exists": False}}]}
|
|
51
|
+
nan_reason_df = mongodb_util.find_query_data(db_name_constant.TODAY_NEW_CONCEPT_LIST, query)
|
|
52
|
+
update_null_reason(nan_reason_df)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# 更新空入选理由
|
|
56
|
+
def update_null_reason(nan_reason_df):
|
|
57
|
+
# 所有概念
|
|
58
|
+
all_ths_concept = ths_concept_common_service_api.get_all_ths_concept()
|
|
59
|
+
for nan_one in nan_reason_df.itertuples():
|
|
60
|
+
try:
|
|
61
|
+
concept_code = nan_one.concept_code
|
|
62
|
+
ths_concept_one_df = all_ths_concept.loc[
|
|
63
|
+
(all_ths_concept['symbol'] == concept_code)
|
|
64
|
+
| (all_ths_concept['web_concept_code'] == concept_code)]
|
|
65
|
+
if data_frame_util.is_empty(ths_concept_one_df):
|
|
66
|
+
continue
|
|
67
|
+
web_concept_code = list(ths_concept_one_df['web_concept_code'])[0]
|
|
68
|
+
|
|
69
|
+
ths_concept_json = ths_stock_api.get_symbol_add_new_concept(nan_one.symbol)
|
|
70
|
+
symbol_ths_concept_all_df = pd.DataFrame(ths_concept_json)
|
|
71
|
+
|
|
72
|
+
symbol_ths_concept_one_df = symbol_ths_concept_all_df[
|
|
73
|
+
symbol_ths_concept_all_df['cid'] == web_concept_code]
|
|
74
|
+
if data_frame_util.is_empty(symbol_ths_concept_one_df):
|
|
75
|
+
continue
|
|
76
|
+
|
|
77
|
+
query = {"$or": [{'symbol': nan_one.symbol, "concept_code": int(concept_code)},
|
|
78
|
+
{'symbol': nan_one.symbol, "concept_code": int(web_concept_code)}]}
|
|
79
|
+
short = list(symbol_ths_concept_one_df['short'])[0]
|
|
80
|
+
long = list(symbol_ths_concept_one_df['long'])[0]
|
|
81
|
+
new_values = {"$set": {"short": short, "long": long}}
|
|
82
|
+
mongodb_util.update_many(query, new_values, db_name_constant.THS_STOCK_CONCEPT_DETAIL)
|
|
83
|
+
mongodb_util.update_many(query, new_values, db_name_constant.TODAY_NEW_CONCEPT_LIST)
|
|
84
|
+
except BaseException as e:
|
|
85
|
+
logger.error("更新概念入选理由异常:{},{}", nan_one.symbol, e)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
if __name__ == '__main__':
|
|
89
|
+
update_ths_concept_choose_null_reason()
|
|
@@ -95,7 +95,7 @@ def update_symbol_new_concept(symbol_df, page_number):
|
|
|
95
95
|
now_date = datetime.now()
|
|
96
96
|
# 开盘交易前不同步 资源开销过大
|
|
97
97
|
if date_handle_util.is_close_time(now_date):
|
|
98
|
-
ths_concept_update_common_api.
|
|
98
|
+
ths_concept_update_common_api.update_ths_concept_choose_reason(symbol_ths_concept_all_df, stock_one.symbol)
|
|
99
99
|
|
|
100
100
|
str_day = now_date.strftime('%Y-%m-%d')
|
|
101
101
|
str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
|
|
@@ -51,7 +51,7 @@ def sync_best_choose_his_index(str_day):
|
|
|
51
51
|
for end_time in KPL_MINUTE_LIST:
|
|
52
52
|
while page_number <= page_max_number:
|
|
53
53
|
index = page_number * kpl_common_api.HIS_PAGE_MAX_COUNT
|
|
54
|
-
kpl_plate_best_index_df = kpl_common_api.get_plate_index_his(index,
|
|
54
|
+
kpl_plate_best_index_df = kpl_common_api.get_plate_index_his(index, kpl_common_api.BEST_CHOOSE,
|
|
55
55
|
str_day, KPL_MINUTE_BEGIN,
|
|
56
56
|
end_time)
|
|
57
57
|
|
|
@@ -59,11 +59,6 @@ def sync_best_choose_his_index(str_day):
|
|
|
59
59
|
continue
|
|
60
60
|
kpl_plate_best_index_df['number'] = number
|
|
61
61
|
kpl_plate_best_index_df['str_day'] = str_day
|
|
62
|
-
hour = end_time[0:2]
|
|
63
|
-
minute = end_time[2:4]
|
|
64
|
-
kpl_plate_best_index_df['str_day'] = str_day
|
|
65
|
-
|
|
66
|
-
kpl_plate_best_index_df['str_now_date'] = str_day + " " + hour + ":" + minute + ":00"
|
|
67
62
|
kpl_plate_best_index_df = kpl_plate_best_index_df[[
|
|
68
63
|
"plate_code",
|
|
69
64
|
"plate_name",
|
|
@@ -83,7 +78,7 @@ def sync_best_choose_his_index(str_day):
|
|
|
83
78
|
"ava_pe_next",
|
|
84
79
|
"number",
|
|
85
80
|
"str_day",
|
|
86
|
-
|
|
81
|
+
|
|
87
82
|
]]
|
|
88
83
|
save_kpl_his_index(kpl_plate_best_index_df, str_day, end_time)
|
|
89
84
|
if end_time == KPL_MINUTE_END:
|
|
@@ -96,7 +91,7 @@ def sync_best_choose_his_index(str_day):
|
|
|
96
91
|
|
|
97
92
|
def save_kpl_his_index(kpl_plate_best_index_df, str_day, end_time):
|
|
98
93
|
kpl_plate_best_index_df['_id'] = str_day + '-' + end_time + '-' + kpl_plate_best_index_df['plate_code']
|
|
99
|
-
mongodb_util.
|
|
94
|
+
mongodb_util.insert_mongo(kpl_plate_best_index_df, db_name_constant.KPL_BEST_CHOOSE_HIS)
|
|
100
95
|
|
|
101
96
|
|
|
102
97
|
def save_kpl_his_daily(kpl_plate_best_index_df, str_day, end_time):
|
|
@@ -105,7 +100,7 @@ def save_kpl_his_daily(kpl_plate_best_index_df, str_day, end_time):
|
|
|
105
100
|
|
|
106
101
|
|
|
107
102
|
def sync_all_days():
|
|
108
|
-
query = {"_id": {"$gte": '2022-07-
|
|
103
|
+
query = {"_id": {"$gte": '2022-07-22'}, 'trade_date': {"$lte": "2024-04-21"}}
|
|
109
104
|
trade_date_list = mongodb_util.find_query_data('trade_date_list', query)
|
|
110
105
|
trade_date_list = trade_date_list.sort_values(by=['trade_date'], ascending=False)
|
|
111
106
|
for trade_one in trade_date_list.itertuples():
|
|
@@ -18,7 +18,7 @@ import mns_scheduler.real_time.realtime_quotes_now_create_db_index as realtime_q
|
|
|
18
18
|
import pandas as pd
|
|
19
19
|
from mns_common.db.MongodbUtil import MongodbUtil
|
|
20
20
|
from mns_common.utils.async_fun import async_fun
|
|
21
|
-
|
|
21
|
+
import mns_scheduler.trade.auto_sell_service_api as auto_sell_service_api
|
|
22
22
|
import mns_common.constant.db_name_constant as db_name_constant
|
|
23
23
|
|
|
24
24
|
mongodb_util = MongodbUtil('27017')
|
|
@@ -174,13 +174,17 @@ def sync_realtime_quotes():
|
|
|
174
174
|
now_date = datetime.datetime.now()
|
|
175
175
|
|
|
176
176
|
str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
|
|
177
|
-
if bool(date_util.is_trade_time(now_date)):
|
|
177
|
+
if True or bool(date_util.is_trade_time(now_date)):
|
|
178
178
|
try:
|
|
179
179
|
real_time_quotes_now = east_money_stock_api.get_real_time_quotes_all_stocks()
|
|
180
180
|
real_time_quotes_now = handle_init_real_time_quotes_data(real_time_quotes_now.copy(),
|
|
181
181
|
str_now_date, number)
|
|
182
182
|
save_real_time_quotes(real_time_quotes_now.copy(), now_date, db_name_constant.REAL_TIME_QUOTES_NOW,
|
|
183
183
|
number)
|
|
184
|
+
try:
|
|
185
|
+
auto_sell_service_api.auto_sell_stock(real_time_quotes_now.copy())
|
|
186
|
+
except Exception as e:
|
|
187
|
+
logger.error("自动卖出执行异常:{}", e)
|
|
184
188
|
|
|
185
189
|
if date_util.is_call_auction(str_now_date) or date_util.is_afternoon_time(now_date):
|
|
186
190
|
if number % 3 == 0:
|
|
@@ -6,15 +6,12 @@ end = file_path.index('mns') + 17
|
|
|
6
6
|
project_path = file_path[0:end]
|
|
7
7
|
sys.path.append(project_path)
|
|
8
8
|
|
|
9
|
-
import
|
|
10
|
-
|
|
11
|
-
user = easytrader.use('ths')
|
|
12
|
-
user.connect(r'D:\Program Files\ths\xiadan.exe')
|
|
9
|
+
import mns_common.component.trade.trade_service_api as trade_service_api
|
|
13
10
|
|
|
14
11
|
|
|
15
12
|
## 自动一键打新
|
|
16
13
|
def auto_ipo_buy():
|
|
17
|
-
|
|
14
|
+
trade_service_api.auto_ipo_buy()
|
|
18
15
|
|
|
19
16
|
|
|
20
17
|
if __name__ == '__main__':
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 16
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
|
|
9
|
+
import mns_common.utils.data_frame_util as data_frame_util
|
|
10
|
+
import mns_common.constant.db_name_constant as db_name_constant
|
|
11
|
+
import datetime
|
|
12
|
+
import mns_common.component.cache.cache_service as cache_service
|
|
13
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
14
|
+
import mns_common.component.trade.trade_service_api as trade_service_api
|
|
15
|
+
from loguru import logger
|
|
16
|
+
from mns_common.utils.async_fun import async_fun
|
|
17
|
+
|
|
18
|
+
mongodb_util = MongodbUtil('27017')
|
|
19
|
+
|
|
20
|
+
AUTO_SELL_KEY = "AUTO_SELL_KEY"
|
|
21
|
+
|
|
22
|
+
# 当前跌幅卖出阈值
|
|
23
|
+
AUTO_SELL_CHG = -8
|
|
24
|
+
# 收益率阈值
|
|
25
|
+
AUTO_SELL_PROFIT_LOSS_CHG = -11.0
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# 自动卖出
|
|
29
|
+
@async_fun
|
|
30
|
+
def auto_sell_stock(realtime_quotes_now):
|
|
31
|
+
sell_flag = cache_service.get_cache(AUTO_SELL_KEY)
|
|
32
|
+
if sell_flag is not None and bool(1 - sell_flag):
|
|
33
|
+
return
|
|
34
|
+
now_date = datetime.datetime.now()
|
|
35
|
+
str_day = now_date.strftime('%Y-%m-%d')
|
|
36
|
+
query_exist = {'str_day': str_day, "valid": True}
|
|
37
|
+
position_stock_df = mongodb_util.find_query_data(db_name_constant.POSITION_STOCK, query_exist)
|
|
38
|
+
if data_frame_util.is_empty(position_stock_df):
|
|
39
|
+
cache_service.set_cache(AUTO_SELL_KEY, False)
|
|
40
|
+
return None
|
|
41
|
+
else:
|
|
42
|
+
cache_service.set_cache(AUTO_SELL_KEY, True)
|
|
43
|
+
position_stock_symbol_list = list(position_stock_df['symbol'])
|
|
44
|
+
realtime_quotes_now_position = realtime_quotes_now.loc[
|
|
45
|
+
realtime_quotes_now['symbol'].isin(position_stock_symbol_list)]
|
|
46
|
+
sell_stock_detail(realtime_quotes_now_position, position_stock_df, str_day, now_date)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def sell_stock_detail(realtime_quotes_now_position, position_stock_df, str_day, now_date):
|
|
50
|
+
for stock_one in realtime_quotes_now_position.itertuples():
|
|
51
|
+
try:
|
|
52
|
+
|
|
53
|
+
symbol = stock_one.symbol
|
|
54
|
+
sell_price = trade_service_api.get_last_sell_price(symbol)
|
|
55
|
+
position_stock_df_one = position_stock_df.loc[position_stock_df['symbol'] == symbol]
|
|
56
|
+
available_position = list(position_stock_df_one['available_position'])[0]
|
|
57
|
+
if sell_signal(stock_one, now_date, position_stock_df_one):
|
|
58
|
+
sell_result = trade_service_api.order_sell(symbol, sell_price, available_position)
|
|
59
|
+
if "message" in sell_result:
|
|
60
|
+
result_msg = sell_result['message']
|
|
61
|
+
if result_msg == 'success':
|
|
62
|
+
update_position_status(symbol, None, str_day)
|
|
63
|
+
elif "entrust_no" in sell_result:
|
|
64
|
+
sell_entrust_no = sell_result['entrust_no']
|
|
65
|
+
if sell_entrust_no is not None:
|
|
66
|
+
update_position_status(symbol, sell_entrust_no, str_day)
|
|
67
|
+
|
|
68
|
+
except BaseException as e:
|
|
69
|
+
logger.error("自动卖出异常:{},{}", stock_one.symbol, e)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
# 卖出信号 TODO 待优化
|
|
73
|
+
def sell_signal(stock_one, now_date, position_stock_df_one):
|
|
74
|
+
chg = stock_one.chg
|
|
75
|
+
wei_bi = stock_one.wei_bi
|
|
76
|
+
|
|
77
|
+
hour = now_date.hour
|
|
78
|
+
minute = now_date.minute
|
|
79
|
+
# 跌停直接卖出
|
|
80
|
+
if wei_bi == -100:
|
|
81
|
+
return True
|
|
82
|
+
# 开盘五分钟先看看
|
|
83
|
+
if hour == 9 and minute <= 35:
|
|
84
|
+
return False
|
|
85
|
+
# 尾盘卖不出了
|
|
86
|
+
if hour == 14 and minute >= 57:
|
|
87
|
+
return False
|
|
88
|
+
|
|
89
|
+
# 自动卖出涨幅
|
|
90
|
+
if chg < AUTO_SELL_CHG:
|
|
91
|
+
return True
|
|
92
|
+
|
|
93
|
+
cost_price = list(position_stock_df_one['cost_price'])[0]
|
|
94
|
+
now_price = stock_one.now_price
|
|
95
|
+
# 收益率
|
|
96
|
+
profit_loss_chg = round((now_price - cost_price) * 100 / cost_price, 2)
|
|
97
|
+
# 收益卖出阈值
|
|
98
|
+
if profit_loss_chg < AUTO_SELL_PROFIT_LOSS_CHG:
|
|
99
|
+
return True
|
|
100
|
+
return False
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
# 更新持仓状态
|
|
104
|
+
def update_position_status(symbol, sell_entrust_no, str_day):
|
|
105
|
+
update_query = {'symbol': symbol, 'str_day': str_day}
|
|
106
|
+
new_values = {"$set": {"valid": False, "sell_entrust_no": sell_entrust_no}}
|
|
107
|
+
mongodb_util.update_many(update_query, new_values, db_name_constant.POSITION_STOCK)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
import mns_common.api.em.east_money_stock_api as east_money_stock_api
|
|
111
|
+
|
|
112
|
+
if __name__ == '__main__':
|
|
113
|
+
sell_price_01 = trade_service_api.get_last_sell_price('002336')
|
|
114
|
+
while True:
|
|
115
|
+
real_time_quotes_now = east_money_stock_api.get_real_time_quotes_all_stocks()
|
|
116
|
+
auto_sell_stock(real_time_quotes_now)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 16
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
import mns_common.component.trade.trade_service_api as trade_service_api
|
|
9
|
+
import pandas as pd
|
|
10
|
+
import mns_common.utils.data_frame_util as data_frame_util
|
|
11
|
+
import mns_common.constant.db_name_constant as db_name_constant
|
|
12
|
+
import datetime
|
|
13
|
+
|
|
14
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
15
|
+
|
|
16
|
+
mongodb_util = MongodbUtil('27017')
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# 同步持仓
|
|
20
|
+
def sync_position():
|
|
21
|
+
now_date = datetime.datetime.now()
|
|
22
|
+
str_day = now_date.strftime('%Y-%m-%d')
|
|
23
|
+
query_exist = {'str_day': str_day}
|
|
24
|
+
if mongodb_util.exist_data_query(db_name_constant.POSITION_STOCK, query_exist):
|
|
25
|
+
return None
|
|
26
|
+
position_list = trade_service_api.get_position()
|
|
27
|
+
position_df = pd.DataFrame(position_list)
|
|
28
|
+
position_df = position_df.rename(columns={"明细": "detail",
|
|
29
|
+
"序号": "index",
|
|
30
|
+
"证券代码": "symbol",
|
|
31
|
+
"证券名称": "name",
|
|
32
|
+
"持仓数量": "open_position",
|
|
33
|
+
"可用数量": "available_position",
|
|
34
|
+
"冻结数量": "frozen_position",
|
|
35
|
+
"参考成本价": "cost_price",
|
|
36
|
+
"当前价": "now_price",
|
|
37
|
+
"浮动盈亏": "floating_profit_loss",
|
|
38
|
+
"盈亏比例(%)": "profit_loss_percent",
|
|
39
|
+
"最新市值": "flow_mv",
|
|
40
|
+
"当日盈亏": "today_profit_loss",
|
|
41
|
+
"当日盈亏比(%)": "today_profit_loss_percent",
|
|
42
|
+
"仓位占比(%)": "position_ratio",
|
|
43
|
+
"持股天数": "holding_days",
|
|
44
|
+
"当日买入": "day_buy",
|
|
45
|
+
"当日卖出": "day_sell",
|
|
46
|
+
"交易市场": "market"
|
|
47
|
+
})
|
|
48
|
+
if data_frame_util.is_not_empty(position_df):
|
|
49
|
+
position_df["_id"] = position_df['symbol'] + '-' + str_day
|
|
50
|
+
position_df["str_day"] = str_day
|
|
51
|
+
position_df["valid"] = True
|
|
52
|
+
mongodb_util.save_mongo(position_df, db_name_constant.POSITION_STOCK)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
if __name__ == '__main__':
|
|
56
|
+
sync_position()
|
|
@@ -24,17 +24,20 @@ import mns_scheduler.zt.zt_five_boards_sync_api as zt_five_boards_sync_api
|
|
|
24
24
|
import mns_scheduler.zt.zt_pool_sync_api as zt_pool_sync_api
|
|
25
25
|
import mns_scheduler.zt.today_high_chg_pool_sync_api as today_high_chg_pool_sync_api
|
|
26
26
|
import mns_scheduler.k_line.clean.k_line_info_clean_service as k_line_info_clean_service
|
|
27
|
-
import mns_scheduler.concept.clean.
|
|
27
|
+
import mns_scheduler.concept.clean.ths_concept_clean_api as ths_concept_choose_api
|
|
28
28
|
import mns_common.api.em.east_money_stock_gdfx_free_top_10_api as east_money_stock_gdfx_free_top_10_api
|
|
29
|
-
import
|
|
30
|
-
|
|
31
|
-
import
|
|
32
|
-
|
|
33
|
-
import mns_scheduler.concept.
|
|
29
|
+
import \
|
|
30
|
+
mns_scheduler.concept.ths.update_concept_info.sync_one_concept_all_symbols_api as sync_one_concept_all_symbols_api
|
|
31
|
+
import \
|
|
32
|
+
mns_scheduler.concept.ths.update_concept_info.sync_one_symbol_all_concepts_api as sync_one_symbol_all_concepts_api
|
|
33
|
+
import mns_scheduler.concept.ths.sync_new_index.sync_ths_new_concept_by_web_api as sync_ths_new_concept_by_web_api
|
|
34
|
+
import mns_scheduler.concept.ths.sync_new_index.sync_ths_concept_by_ak_api as sync_ths_concept_by_ak_api
|
|
34
35
|
import mns_scheduler.kpl.selection.total.sync_kpl_best_total_sync_api as sync_kpl_best_total_sync_api
|
|
35
36
|
import mns_scheduler.company_info.company_info_sync_api as company_info_sync_api
|
|
36
|
-
import mns_scheduler.
|
|
37
|
+
import mns_scheduler.trade.auto_ipo_buy_api as auto_ipo_buy_api
|
|
37
38
|
import mns_scheduler.kpl.selection.index.sync_best_choose_his_index as sync_best_choose_his_index
|
|
39
|
+
import mns_scheduler.concept.ths.common.ths_concept_update_common_api as ths_concept_update_common_api
|
|
40
|
+
import mns_scheduler.trade.sync_position_api as sync_position_api
|
|
38
41
|
|
|
39
42
|
|
|
40
43
|
# 同步交易日期任务完成
|
|
@@ -200,11 +203,6 @@ def sync_today_trade_k_line_info():
|
|
|
200
203
|
logger.info('计算当日k线信息完成:{}', str_day)
|
|
201
204
|
|
|
202
205
|
|
|
203
|
-
# 更新空概念名称
|
|
204
|
-
def update_null_name():
|
|
205
|
-
ths_effective_concept_choose_api.update_null_name()
|
|
206
|
-
|
|
207
|
-
|
|
208
206
|
# 同步所有股票前十大流通股本
|
|
209
207
|
def sync_stock_gdfx_free_top_10_one_day():
|
|
210
208
|
logger.info('同步所有股票前十大流通股本')
|
|
@@ -213,16 +211,26 @@ def sync_stock_gdfx_free_top_10_one_day():
|
|
|
213
211
|
east_money_stock_gdfx_free_top_10_api.sync_stock_gdfx_free_top_10_one_day(str_day)
|
|
214
212
|
|
|
215
213
|
|
|
214
|
+
# 更新同花顺概念信息
|
|
215
|
+
def ths_concept_info_clean():
|
|
216
|
+
# 更新空概念名称
|
|
217
|
+
ths_concept_choose_api.update_null_name()
|
|
218
|
+
# 更新概念包含个数
|
|
219
|
+
ths_concept_choose_api.update_concept_num()
|
|
220
|
+
|
|
221
|
+
|
|
216
222
|
# 同步概念下所有股票组成 by 概念指数
|
|
217
|
-
def
|
|
223
|
+
def update_one_concept_all_symbol_detail():
|
|
218
224
|
logger.info('同步概念下所有股票组成')
|
|
219
|
-
|
|
225
|
+
sync_one_concept_all_symbols_api.update_concept_all_symbol_detail()
|
|
226
|
+
update_ths_concept_choose_null_reason()
|
|
220
227
|
|
|
221
228
|
|
|
222
229
|
# 同步单只股票下所有概念 by 股票代码
|
|
223
|
-
def
|
|
224
|
-
sync_symbol_all_concepts_api.sync_symbol_all_concept(None)
|
|
230
|
+
def update_one_symbol_all_concepts():
|
|
225
231
|
logger.info('同步单只股票所有概念组成')
|
|
232
|
+
sync_one_symbol_all_concepts_api.sync_symbol_all_concept(None)
|
|
233
|
+
update_ths_concept_choose_null_reason()
|
|
226
234
|
|
|
227
235
|
|
|
228
236
|
# 同步同花顺新增概念指数通过web端接口爬取 8开头
|
|
@@ -255,7 +263,14 @@ def sync_new_concept_data_web():
|
|
|
255
263
|
sync_new_concept_data_by_web()
|
|
256
264
|
# 同步同花顺新增概念指数通过ak_share接口爬取
|
|
257
265
|
sync_new_ths_concept_by_ak_api()
|
|
258
|
-
|
|
266
|
+
update_ths_concept_choose_null_reason()
|
|
267
|
+
logger.info("同步新概念web端数据任务完成")
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
# 更新空的入选概念
|
|
271
|
+
def update_ths_concept_choose_null_reason():
|
|
272
|
+
logger.info("更新空的入选概念")
|
|
273
|
+
ths_concept_update_common_api.update_ths_concept_choose_null_reason()
|
|
259
274
|
|
|
260
275
|
|
|
261
276
|
# 清洗公司基本信息
|
|
@@ -273,15 +288,22 @@ def auto_ipo_buy():
|
|
|
273
288
|
auto_ipo_buy_api.auto_ipo_buy()
|
|
274
289
|
|
|
275
290
|
|
|
291
|
+
# 同步持仓
|
|
292
|
+
def sync_position():
|
|
293
|
+
now_date = datetime.now()
|
|
294
|
+
str_day = now_date.strftime('%Y-%m-%d')
|
|
295
|
+
# 同步持仓
|
|
296
|
+
if trade_date_common_service_api.is_trade_day(str_day):
|
|
297
|
+
sync_position_api.sync_position()
|
|
298
|
+
|
|
299
|
+
|
|
276
300
|
# 同步开盘啦当日精选指数行情数据
|
|
277
301
|
|
|
278
302
|
def sync_kpl_best_his_quotes():
|
|
279
303
|
now_date = datetime.now()
|
|
280
304
|
str_day = now_date.strftime('%Y-%m-%d')
|
|
281
305
|
if trade_date_common_service_api.is_trade_day(str_day):
|
|
282
|
-
|
|
283
|
-
# 当天不能获取历史数据
|
|
284
|
-
sync_best_choose_his_index.sync_best_choose_his_index(last_trade_day)
|
|
306
|
+
sync_best_choose_his_index.sync_best_choose_his_index(str_day)
|
|
285
307
|
logger.info('同步开盘啦当日精选指数行情数据任务完成')
|
|
286
308
|
|
|
287
309
|
|
|
@@ -307,8 +329,7 @@ blockingScheduler.add_job(col_data_move, 'cron', hour='15', minute='33')
|
|
|
307
329
|
|
|
308
330
|
# 数据库健康检查
|
|
309
331
|
blockingScheduler.add_job(db_status_check, 'interval', seconds=30, max_instances=4)
|
|
310
|
-
|
|
311
|
-
blockingScheduler.add_job(update_null_name, 'cron', hour='9,18', minute='01')
|
|
332
|
+
|
|
312
333
|
# 同步大单数据
|
|
313
334
|
blockingScheduler.add_job(sync_ths_big_deal, 'cron', hour='09', minute='30', max_instances=4)
|
|
314
335
|
|
|
@@ -323,11 +344,14 @@ blockingScheduler.add_job(sync_today_trade_k_line_info, 'cron', hour='08', minut
|
|
|
323
344
|
# 同步十大流通股东信息
|
|
324
345
|
blockingScheduler.add_job(sync_stock_gdfx_free_top_10_one_day, 'cron', hour='08,22', minute='23')
|
|
325
346
|
|
|
347
|
+
# 更新同花顺概念信息
|
|
348
|
+
blockingScheduler.add_job(ths_concept_info_clean, 'cron', hour='9,18', minute='01')
|
|
349
|
+
|
|
326
350
|
# 更新概念指数下所有股票组成 by 概念代码
|
|
327
|
-
blockingScheduler.add_job(
|
|
351
|
+
blockingScheduler.add_job(update_one_concept_all_symbol_detail, 'cron', hour='08,18,12', minute='30')
|
|
328
352
|
|
|
329
353
|
# 同步单只股票下所有概念 by 股票代码
|
|
330
|
-
blockingScheduler.add_job(
|
|
354
|
+
blockingScheduler.add_job(update_one_symbol_all_concepts, 'cron', hour='09,18,12', minute='15')
|
|
331
355
|
|
|
332
356
|
# 开盘前同步同花顺新概念指数
|
|
333
357
|
blockingScheduler.add_job(sync_new_concept_data_web, 'cron', hour='09', minute='05,10,15,20,25')
|
|
@@ -350,7 +374,10 @@ blockingScheduler.add_job(auto_ipo_buy, 'cron', hour='10', minute='40,50')
|
|
|
350
374
|
blockingScheduler.add_job(update_best_choose_plate_relation, 'cron', hour='09,18', minute='25')
|
|
351
375
|
|
|
352
376
|
# 更新开盘啦指数关系
|
|
353
|
-
blockingScheduler.add_job(sync_kpl_best_his_quotes, 'cron', hour='
|
|
377
|
+
blockingScheduler.add_job(sync_kpl_best_his_quotes, 'cron', hour='18,22', minute='25')
|
|
378
|
+
|
|
379
|
+
# 更新开盘啦指数关系
|
|
380
|
+
blockingScheduler.add_job(sync_position, 'cron', hour='00,08', minute='10')
|
|
354
381
|
|
|
355
382
|
print('定时任务启动成功')
|
|
356
383
|
blockingScheduler.start()
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
mns_scheduler/__init__.py,sha256=ffZXFCLFdIwOsbxnw__u1MbQYh9yz7Bs8UMP6VF0X2M,161
|
|
2
|
+
mns_scheduler/backup/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
|
|
3
|
+
mns_scheduler/backup/app/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
4
|
+
mns_scheduler/backup/app/ths_new_concept_sync_app.py,sha256=yBr3RN24zCWgmRVCKgY6fwm0tdJA5XKliK3CSB-75tY,5148
|
|
5
|
+
mns_scheduler/backup/em/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
6
|
+
mns_scheduler/backup/em/em_new_concept_his_sync.py,sha256=Yqbuz9VE9433o0Z6BvDo5adhj3lK4vmN66XNQBIdC1k,4992
|
|
7
|
+
mns_scheduler/backup/em/em_new_concept_sync_common_api.py,sha256=KnNCf0KXy31GFwF1-wbbkfDM-H7-cEtcVoCwl4QmoVs,7083
|
|
8
|
+
mns_scheduler/backup/em/em_new_concept_sync_web.py,sha256=wVS0yLyPYzpcxfWAuUqmqbYkjw9wjpo48CvLSZFckzw,2334
|
|
9
|
+
mns_scheduler/backup/wen_cai/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
10
|
+
mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py,sha256=boKtgOIXIsRny5n1keZm4luDFCiooudbPDsEFIGImIw,1747
|
|
2
11
|
mns_scheduler/big_deal/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
3
12
|
mns_scheduler/big_deal/ths_big_deal_sync.py,sha256=wezGJWFRnKYBaPP9PVXLqMbHENOXgvJtw3HSGCSlX5c,4555
|
|
4
13
|
mns_scheduler/company_info/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
@@ -6,32 +15,22 @@ mns_scheduler/company_info/company_constant_data.py,sha256=LwyBWLoErAUPXss68ebVj
|
|
|
6
15
|
mns_scheduler/company_info/company_info_sync_api.py,sha256=2sQk197p5qjq2DQlRpVbotSSIN87x43T-RGAtMiXQI4,20332
|
|
7
16
|
mns_scheduler/concept/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
8
17
|
mns_scheduler/concept/clean/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
9
|
-
mns_scheduler/concept/clean/
|
|
10
|
-
mns_scheduler/concept/em/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
11
|
-
mns_scheduler/concept/em/em_new_concept_his_sync.py,sha256=4Z0q4aTB6NMPpgtXu8wBThS3UJQvIFt5a50Icnlzdrc,4993
|
|
12
|
-
mns_scheduler/concept/em/em_new_concept_sync_common_api.py,sha256=KnNCf0KXy31GFwF1-wbbkfDM-H7-cEtcVoCwl4QmoVs,7083
|
|
13
|
-
mns_scheduler/concept/em/em_new_concept_sync_web.py,sha256=q2g2KEFvLFgaSu2G9UJOLR4M-f34tlTgBLNa4xuRB0g,2335
|
|
18
|
+
mns_scheduler/concept/clean/ths_concept_clean_api.py,sha256=SR5NRzh4N2r0ouXX3SRAONJyH44eorJdpaayekbNWCE,2459
|
|
14
19
|
mns_scheduler/concept/ths/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
15
|
-
mns_scheduler/concept/ths/app/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
16
|
-
mns_scheduler/concept/ths/app/ths_new_concept_sync_app.py,sha256=yBr3RN24zCWgmRVCKgY6fwm0tdJA5XKliK3CSB-75tY,5148
|
|
17
20
|
mns_scheduler/concept/ths/common/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
18
|
-
mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py,sha256=
|
|
19
|
-
mns_scheduler/concept/ths/common/ths_concept_update_common_api.py,sha256=
|
|
20
|
-
mns_scheduler/concept/ths/
|
|
21
|
-
mns_scheduler/concept/ths/
|
|
22
|
-
mns_scheduler/concept/ths/
|
|
23
|
-
mns_scheduler/concept/ths/
|
|
24
|
-
mns_scheduler/concept/ths/
|
|
25
|
-
mns_scheduler/concept/ths/
|
|
26
|
-
mns_scheduler/concept/ths/wen_cai/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
27
|
-
mns_scheduler/concept/ths/wen_cai/wen_cai_concept_sync.py,sha256=boKtgOIXIsRny5n1keZm4luDFCiooudbPDsEFIGImIw,1747
|
|
21
|
+
mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py,sha256=x3f6DHMyDCAVYtfmSlTPbeL_Z40ybf3sJHbmyIFTGXA,6542
|
|
22
|
+
mns_scheduler/concept/ths/common/ths_concept_update_common_api.py,sha256=2Sv5lPzTWuma-mtKkgvO0cHJj150U0SDWQGyCJIvCpg,4305
|
|
23
|
+
mns_scheduler/concept/ths/sync_new_index/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
24
|
+
mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_by_ak_api.py,sha256=asZLrVxv2acbheJaI1VMguk4Vu6dqdcHPiJgWbq3b74,5001
|
|
25
|
+
mns_scheduler/concept/ths/sync_new_index/sync_ths_new_concept_by_web_api.py,sha256=Yv3Gp6qwAnpg3qM_MguWNSH7NDpxQkvH_SLWcsJfYo8,3605
|
|
26
|
+
mns_scheduler/concept/ths/update_concept_info/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
27
|
+
mns_scheduler/concept/ths/update_concept_info/sync_one_concept_all_symbols_api.py,sha256=ipRtiihpHlbxuces7YpHfvBtCDxgzrVXjcCKZiFBPaw,1928
|
|
28
|
+
mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py,sha256=Hl5fJ9bVmy8hSawRM1xnBl5u-xbOI6LEa5ALCnQAJM8,8764
|
|
28
29
|
mns_scheduler/db/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
29
30
|
mns_scheduler/db/col_move_service.py,sha256=OyuHGXXWB8VPHkiA2JwXR4y961PLdZeNfgk_5R0f3pA,3952
|
|
30
31
|
mns_scheduler/db/db_status.py,sha256=K1jtYIGZzDV6knpoJLLnXEhN3tyziJp_zY2gSfguHCA,747
|
|
31
32
|
mns_scheduler/dt/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
32
33
|
mns_scheduler/dt/stock_dt_pool_sync.py,sha256=5ivRUOnFtOapZniwTbujf1lVq3y4btm2Cmd5R6JJAVo,3466
|
|
33
|
-
mns_scheduler/ipo/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
34
|
-
mns_scheduler/ipo/auto_ipo_buy_api.py,sha256=7d0xCo5sWgzBKZYrpzLSHsk2Kb3Gg2GHKqUPLD7Jbu0,387
|
|
35
34
|
mns_scheduler/k_line/__init__.py,sha256=ffZXFCLFdIwOsbxnw__u1MbQYh9yz7Bs8UMP6VF0X2M,161
|
|
36
35
|
mns_scheduler/k_line/clean/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
37
36
|
mns_scheduler/k_line/clean/k_line_info_clean_impl.py,sha256=3NPu-bkBw5ARW2yoMAmf_-au6vxQdSjzGlT-l4dqV4w,21833
|
|
@@ -41,7 +40,7 @@ mns_scheduler/k_line/sync/daily_week_month_line_sync.py,sha256=SNKkwGoyE1qzds1o-
|
|
|
41
40
|
mns_scheduler/kpl/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
42
41
|
mns_scheduler/kpl/selection/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
43
42
|
mns_scheduler/kpl/selection/index/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
44
|
-
mns_scheduler/kpl/selection/index/sync_best_choose_his_index.py,sha256=
|
|
43
|
+
mns_scheduler/kpl/selection/index/sync_best_choose_his_index.py,sha256=7z9UPwh6_EnZMOQnpQQksdF_IwV1t7uRRYg1ZrpL3OA,4503
|
|
45
44
|
mns_scheduler/kpl/selection/index/sync_best_choose_index.py,sha256=-34drqAMsx792DxR8P1A8DrGCM5yIVGsop3UzDNzsPw,8016
|
|
46
45
|
mns_scheduler/kpl/selection/symbol/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
47
46
|
mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py,sha256=kUKs0SWCqekhvV0o5A1pDv0Nw4x6VTS-ij0AryzKe8w,4679
|
|
@@ -49,7 +48,11 @@ mns_scheduler/kpl/selection/total/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3Zi
|
|
|
49
48
|
mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py,sha256=WRK-Pu0-7ub9q1n5TK406_sAGQwOEUl2CZLu9suo70k,10461
|
|
50
49
|
mns_scheduler/real_time/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
51
50
|
mns_scheduler/real_time/realtime_quotes_now_create_db_index.py,sha256=qQCjcsG3WYgn3zemS45Ms0AHtbkCwlSVPPCntxVvK8Q,1066
|
|
52
|
-
mns_scheduler/real_time/realtime_quotes_now_sync.py,sha256=
|
|
51
|
+
mns_scheduler/real_time/realtime_quotes_now_sync.py,sha256=nLVt8CCoqjnMgpY0eIwAXUXMSQ7VF9YtKn53JidV-YY,9149
|
|
52
|
+
mns_scheduler/trade/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
53
|
+
mns_scheduler/trade/auto_ipo_buy_api.py,sha256=QXNzFJGNGveVUcXBh0RRJb_HV7abbLYXRljezPJf9ZM,377
|
|
54
|
+
mns_scheduler/trade/auto_sell_service_api.py,sha256=HaauZeOsuLNBrowXT8IKaSgWLR2Huott6mg_AoLhpUY,4423
|
|
55
|
+
mns_scheduler/trade/sync_position_api.py,sha256=HmREr4H-PqlOdlNx3_SN6vRaRnhlaLCI6keSlYuXJHc,2739
|
|
53
56
|
mns_scheduler/zb/__init__.py,sha256=Tyvi_iQlv3jz59EdH67Mycnt9CSixcWPQoJwu55bOq0,165
|
|
54
57
|
mns_scheduler/zb/stock_zb_pool_sync.py,sha256=ky3CNDzpjB6C_frCf4YGNXdidnUo-uUUKsJpY62P4Bk,1936
|
|
55
58
|
mns_scheduler/zt/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
@@ -59,9 +62,9 @@ mns_scheduler/zt/today_high_chg_pool_sync_api.py,sha256=G6FXMH7HnvhyMFoE-RszggkB
|
|
|
59
62
|
mns_scheduler/zt/zt_five_boards_sync_api.py,sha256=HfjPHKD99fU9c37kSenEX2_qNvFAjQGgy8ERuacSxwk,10916
|
|
60
63
|
mns_scheduler/zt/zt_pool_sync_api.py,sha256=tzSCnqAelV7MQBZ3KcpOQQHNYnjFnmvoDFcapBpU_NA,7534
|
|
61
64
|
mns_scheduler/zz_task/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
62
|
-
mns_scheduler/zz_task/data_sync_task.py,sha256=
|
|
65
|
+
mns_scheduler/zz_task/data_sync_task.py,sha256=cVwVhzLnr3LXn9qBGtwrnbbkRO0XBDoWB6GmONCwB3M,15337
|
|
63
66
|
mns_scheduler/zz_task/sync_realtime_quotes_task.py,sha256=DN3bq2XCDZC-PHlbD2NTog48bR44EruIEc2QVGKg7Tk,932
|
|
64
|
-
mns_scheduler-1.0.3.
|
|
65
|
-
mns_scheduler-1.0.3.
|
|
66
|
-
mns_scheduler-1.0.3.
|
|
67
|
-
mns_scheduler-1.0.3.
|
|
67
|
+
mns_scheduler-1.0.3.6.dist-info/METADATA,sha256=oQq-vFt1ZmbonN3c75ZOQhtTeJ11kyu5k-T3O1iKotU,64
|
|
68
|
+
mns_scheduler-1.0.3.6.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
|
69
|
+
mns_scheduler-1.0.3.6.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
|
|
70
|
+
mns_scheduler-1.0.3.6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|