hikyuu 2.3.0__py3-none-win_amd64.whl → 2.5.0__py3-none-win_amd64.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.
- hikyuu/__init__.py +438 -6
- hikyuu/__init__.pyi +791 -0
- hikyuu/analysis/__init__.pyi +487 -0
- hikyuu/analysis/analysis.pyi +517 -0
- hikyuu/core.pyi +482 -0
- hikyuu/cpp/__init__.pyi +3 -0
- hikyuu/cpp/boost_date_time-mt.dll +0 -0
- hikyuu/cpp/boost_serialization-mt.dll +0 -0
- hikyuu/cpp/boost_wserialization-mt.dll +0 -0
- hikyuu/cpp/core310.pyd +0 -0
- hikyuu/cpp/core311.pyd +0 -0
- hikyuu/cpp/core312.pyd +0 -0
- hikyuu/cpp/core312.pyi +12867 -0
- hikyuu/cpp/core313.pyd +0 -0
- hikyuu/cpp/core38.pyd +0 -0
- hikyuu/cpp/core39.pyd +0 -0
- hikyuu/cpp/hikyuu.dll +0 -0
- hikyuu/cpp/hikyuu.lib +0 -0
- hikyuu/cpp/sqlite3.dll +0 -0
- hikyuu/data/common_mysql.py +24 -7
- hikyuu/data/common_pytdx.py +17 -1
- hikyuu/data/em_block_to_mysql.py +3 -2
- hikyuu/data/em_block_to_sqlite.py +8 -3
- hikyuu/data/mysql_upgrade/0025.sql +61 -0
- hikyuu/data/mysql_upgrade/0026.sql +9 -0
- hikyuu/data/sqlite_upgrade/0025.sql +63 -0
- hikyuu/data/sqlite_upgrade/0026.sql +10 -0
- hikyuu/draw/__init__.pyi +35 -0
- hikyuu/draw/drawplot/__init__.py +3 -0
- hikyuu/draw/drawplot/__init__.pyi +134 -0
- hikyuu/draw/drawplot/bokeh_draw.pyi +796 -0
- hikyuu/draw/drawplot/common.pyi +10 -0
- hikyuu/draw/drawplot/echarts_draw.py +219 -24
- hikyuu/draw/drawplot/echarts_draw.pyi +682 -0
- hikyuu/draw/drawplot/matplotlib_draw.py +18 -3
- hikyuu/draw/drawplot/matplotlib_draw.pyi +1101 -0
- hikyuu/draw/elder.pyi +44 -0
- hikyuu/draw/kaufman.pyi +38 -0
- hikyuu/draw/volume.pyi +31 -0
- hikyuu/examples/notebook/Demo/Demo2.ipynb +1 -1
- hikyuu/extend.py +9 -3
- hikyuu/extend.pyi +636 -0
- hikyuu/fetcher/stock/zh_block_em.py +118 -51
- hikyuu/gui/data/EscapetimeThread.py +4 -4
- hikyuu/gui/data/ImportBlockInfoTask.py +3 -2
- hikyuu/gui/data/ImportHistoryFinanceTask.py +2 -0
- hikyuu/gui/data/MainWindow.py +48 -42
- hikyuu/gui/importdata.py +13 -26
- hikyuu/hub.py +2 -4
- hikyuu/hub.pyi +254 -0
- hikyuu/include/hikyuu/DataType.h +5 -0
- hikyuu/include/hikyuu/Stock.h +7 -0
- hikyuu/include/hikyuu/indicator/Indicator.h +8 -1
- hikyuu/include/hikyuu/indicator/Indicator2InImp.h +65 -0
- hikyuu/include/hikyuu/indicator/IndicatorImp.h +4 -3
- hikyuu/include/hikyuu/indicator/build_in.h +12 -0
- hikyuu/include/hikyuu/indicator/crt/ADVANCE.h +3 -1
- hikyuu/include/hikyuu/indicator/crt/CONTEXT.h +2 -2
- hikyuu/include/hikyuu/indicator/crt/CORR.h +4 -2
- hikyuu/include/hikyuu/indicator/crt/COST.h +3 -0
- hikyuu/include/hikyuu/indicator/crt/CYCLE.h +24 -0
- hikyuu/include/hikyuu/indicator/crt/DECLINE.h +3 -1
- hikyuu/include/hikyuu/indicator/crt/DISCARD.h +27 -0
- hikyuu/include/hikyuu/indicator/crt/DMA.h +2 -1
- hikyuu/include/hikyuu/indicator/crt/HSL.h +1 -13
- hikyuu/include/hikyuu/indicator/crt/INBLOCK.h +31 -0
- hikyuu/include/hikyuu/indicator/crt/INDEX.h +60 -0
- hikyuu/include/hikyuu/indicator/crt/INSUM.h +5 -2
- hikyuu/include/hikyuu/indicator/crt/ISINF.h +28 -0
- hikyuu/include/hikyuu/indicator/crt/ISINFA.h +28 -0
- hikyuu/include/hikyuu/indicator/crt/ISNA.h +29 -0
- hikyuu/include/hikyuu/indicator/crt/JUMPDOWN.h +24 -0
- hikyuu/include/hikyuu/indicator/crt/JUMPUP.h +24 -0
- hikyuu/include/hikyuu/indicator/crt/LASTVALUE.h +29 -0
- hikyuu/include/hikyuu/indicator/crt/LIUTONGPAN.h +1 -0
- hikyuu/include/hikyuu/indicator/crt/REPLACE.h +29 -0
- hikyuu/include/hikyuu/indicator/crt/SPEARMAN.h +3 -2
- hikyuu/include/hikyuu/indicator/crt/WINNER.h +38 -0
- hikyuu/include/hikyuu/indicator/imp/IContext.h +1 -1
- hikyuu/include/hikyuu/indicator/imp/ICorr.h +7 -22
- hikyuu/include/hikyuu/indicator/imp/ICost.h +31 -0
- hikyuu/include/hikyuu/indicator/imp/ICycle.h +30 -0
- hikyuu/include/hikyuu/indicator/imp/IDiscard.h +28 -0
- hikyuu/include/hikyuu/indicator/imp/IDma.h +7 -24
- hikyuu/include/hikyuu/indicator/imp/IHsl.h +30 -0
- hikyuu/include/hikyuu/indicator/imp/IInBlock.h +30 -0
- hikyuu/include/hikyuu/indicator/imp/IIndex.h +26 -0
- hikyuu/include/hikyuu/indicator/imp/IIsInf.h +26 -0
- hikyuu/include/hikyuu/indicator/imp/IIsInfa.h +26 -0
- hikyuu/include/hikyuu/indicator/imp/IIsNa.h +26 -0
- hikyuu/include/hikyuu/indicator/imp/IJumpDown.h +24 -0
- hikyuu/include/hikyuu/indicator/imp/IJumpUp.h +24 -0
- hikyuu/include/hikyuu/indicator/imp/ILastValue.h +26 -0
- hikyuu/include/hikyuu/indicator/imp/IReplace.h +26 -0
- hikyuu/include/hikyuu/indicator/imp/ISpearman.h +6 -21
- hikyuu/include/hikyuu/indicator/imp/IWinner.h +26 -0
- hikyuu/include/hikyuu/indicator_talib/imp/TaMavp.h +6 -20
- hikyuu/include/hikyuu/indicator_talib/imp/ta_defines.h +14 -65
- hikyuu/include/hikyuu/indicator_talib/imp/ta_imp.h +54 -90
- hikyuu/include/hikyuu/indicator_talib/ta_crt.h +11 -9
- hikyuu/include/hikyuu/strategy/RunPortfolioInStrategy.h +3 -4
- hikyuu/include/hikyuu/strategy/Strategy.h +4 -5
- hikyuu/include/hikyuu/trade_manage/TradeRecord.h +5 -1
- hikyuu/include/hikyuu/trade_sys/allocatefunds/build_in.h +1 -0
- hikyuu/include/hikyuu/trade_sys/allocatefunds/crt/AF_FixedWeightList.h +22 -0
- hikyuu/include/hikyuu/trade_sys/allocatefunds/imp/FixedWeightListAllocateFunds.h +25 -0
- hikyuu/include/hikyuu/trade_sys/moneymanager/MoneyManagerBase.h +17 -4
- hikyuu/include/hikyuu/trade_sys/moneymanager/build_in.h +2 -0
- hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedCapital.h +6 -0
- hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedCapitalFunds.h +26 -0
- hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedCountTps.h +27 -0
- hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedRisk.h +6 -0
- hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedUnits.h +6 -0
- hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_WilliamsFixedRisk.h +7 -0
- hikyuu/include/hikyuu/trade_sys/moneymanager/imp/FixedCapitalFundsMM.h +28 -0
- hikyuu/include/hikyuu/trade_sys/moneymanager/imp/FixedCountTpsMM.h +44 -0
- hikyuu/include/hikyuu/trade_sys/multifactor/build_in.h +1 -0
- hikyuu/include/hikyuu/trade_sys/multifactor/crt/MF_Weight.h +30 -0
- hikyuu/include/hikyuu/trade_sys/multifactor/imp/WeightMultiFactor.h +41 -0
- hikyuu/include/hikyuu/trade_sys/portfolio/Portfolio.h +38 -37
- hikyuu/include/hikyuu/trade_sys/portfolio/build_in.h +1 -0
- hikyuu/include/hikyuu/trade_sys/portfolio/crt/PF_Simple.h +25 -1
- hikyuu/include/hikyuu/trade_sys/portfolio/crt/PF_WithoutAF.h +50 -0
- hikyuu/include/hikyuu/trade_sys/portfolio/imp/SimplePortfolio.h +53 -0
- hikyuu/include/hikyuu/trade_sys/portfolio/imp/WithoutAFPortfolio.h +57 -0
- hikyuu/include/hikyuu/trade_sys/selector/imp/MultiFactorSelector.h +7 -0
- hikyuu/include/hikyuu/trade_sys/signal/SignalBase.h +51 -5
- hikyuu/include/hikyuu/trade_sys/signal/build_in.h +2 -0
- hikyuu/include/hikyuu/trade_sys/signal/crt/SG_Bool.h +2 -1
- hikyuu/include/hikyuu/trade_sys/signal/crt/SG_Logic.h +37 -0
- hikyuu/include/hikyuu/trade_sys/signal/crt/SG_OneSide.h +28 -0
- hikyuu/include/hikyuu/trade_sys/signal/imp/OneSideSignal.h +46 -0
- hikyuu/include/hikyuu/trade_sys/signal/imp/logic/AddSignal.h +19 -0
- hikyuu/include/hikyuu/trade_sys/signal/imp/logic/AddValueSignal.h +19 -0
- hikyuu/include/hikyuu/trade_sys/signal/imp/logic/DivSignal.h +19 -0
- hikyuu/include/hikyuu/trade_sys/signal/imp/logic/DivValueSignal.h +22 -0
- hikyuu/include/hikyuu/trade_sys/signal/imp/logic/MulSignal.h +19 -0
- hikyuu/include/hikyuu/trade_sys/signal/imp/logic/MulValueSignal.h +19 -0
- hikyuu/include/hikyuu/trade_sys/signal/imp/logic/OperatorSignal.h +68 -0
- hikyuu/include/hikyuu/trade_sys/signal/imp/logic/OperatorValueSignal.h +67 -0
- hikyuu/include/hikyuu/trade_sys/signal/imp/logic/SubSignal.h +19 -0
- hikyuu/include/hikyuu/trade_sys/signal/imp/logic/SubValueSignal.h +22 -0
- hikyuu/include/hikyuu/trade_sys/signal/imp/logic/__init__.py +1 -0
- hikyuu/include/hikyuu/trade_sys/stoploss/crt/ST_Indicator.h +1 -1
- hikyuu/include/hikyuu/trade_sys/stoploss/imp/IndicatorStoploss.h +3 -4
- hikyuu/include/hikyuu/utilities/FilterNode.h +2 -2
- hikyuu/include/hikyuu/utilities/Log.h +42 -15
- hikyuu/include/hikyuu/utilities/datetime/Datetime.h +1 -1
- hikyuu/include/hikyuu/utilities/datetime/TimeDelta.h +2 -2
- hikyuu/include/hikyuu/utilities/db_connect/DBCondition.h +4 -0
- hikyuu/include/hikyuu/utilities/db_connect/SQLResultSet.h +2 -2
- hikyuu/include/hikyuu/utilities/db_connect/mysql/MySQLConnect.h +5 -1
- hikyuu/include/hikyuu/utilities/node/NodeServer.h +4 -4
- hikyuu/include/hikyuu/utilities/thread/MQStealThreadPool.h +2 -2
- hikyuu/include/hikyuu/utilities/thread/MQThreadPool.h +2 -2
- hikyuu/include/hikyuu/utilities/thread/StealThreadPool.h +5 -5
- hikyuu/include/hikyuu/utilities/thread/ThreadPool.h +2 -2
- hikyuu/include/hikyuu/utilities/thread/algorithm.h +16 -10
- hikyuu/include/hikyuu/version.h +4 -4
- hikyuu/indicator/indicator.py +1 -0
- hikyuu/interactive.py +3 -266
- hikyuu/trade_manage/__init__.pyi +584 -0
- hikyuu/trade_manage/broker.pyi +54 -0
- hikyuu/trade_manage/broker_easytrader.pyi +21 -0
- hikyuu/trade_manage/broker_mail.pyi +55 -0
- hikyuu/trade_manage/trade.pyi +590 -0
- hikyuu/util/__init__.pyi +55 -0
- hikyuu/util/check.pyi +59 -0
- hikyuu/util/mylog.pyi +70 -0
- hikyuu/util/notebook.pyi +23 -0
- hikyuu/util/singleton.pyi +18 -0
- hikyuu/util/slice.pyi +8 -0
- {hikyuu-2.3.0.dist-info → hikyuu-2.5.0.dist-info}/METADATA +3 -2
- {hikyuu-2.3.0.dist-info → hikyuu-2.5.0.dist-info}/RECORD +178 -95
- {hikyuu-2.3.0.dist-info → hikyuu-2.5.0.dist-info}/top_level.txt +1 -0
- hikyuu/deprecated.py +0 -651
- {hikyuu-2.3.0.dist-info → hikyuu-2.5.0.dist-info}/LICENSE +0 -0
- {hikyuu-2.3.0.dist-info → hikyuu-2.5.0.dist-info}/WHEEL +0 -0
- {hikyuu-2.3.0.dist-info → hikyuu-2.5.0.dist-info}/entry_points.txt +0 -0
|
@@ -5,26 +5,77 @@
|
|
|
5
5
|
# Author: fasiondog
|
|
6
6
|
|
|
7
7
|
import requests
|
|
8
|
+
import math
|
|
8
9
|
import akshare as ak
|
|
10
|
+
import pandas as pd
|
|
9
11
|
from hikyuu.util import *
|
|
10
12
|
|
|
11
13
|
|
|
14
|
+
@hku_catch(ret=[], trace=True)
|
|
15
|
+
def get_hybk_names():
|
|
16
|
+
"""获取所有行业(板块代码,板块名称)列表"""
|
|
17
|
+
url = "https://19.push2.eastmoney.com/api/qt/clist/get"
|
|
18
|
+
params = {
|
|
19
|
+
"pn": "1",
|
|
20
|
+
"pz": "200",
|
|
21
|
+
"po": "1",
|
|
22
|
+
"np": "1",
|
|
23
|
+
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
|
|
24
|
+
"fltt": "2",
|
|
25
|
+
"invt": "2",
|
|
26
|
+
"fid": "f3",
|
|
27
|
+
"fs": "m:90 t:2 f:!50",
|
|
28
|
+
"fields": "f12,f14",
|
|
29
|
+
"_": "1626075887768",
|
|
30
|
+
}
|
|
31
|
+
r = requests.get(url, params=params, timeout=15)
|
|
32
|
+
data_json = r.json()
|
|
33
|
+
ret = [(v['f12'], v['f14']) for v in data_json["data"]["diff"]]
|
|
34
|
+
return ret
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@hku_catch(ret=[], trace=True)
|
|
38
|
+
def get_hybk_cons_code(blk_code):
|
|
39
|
+
"获取指定行业板块成分代码列表"
|
|
40
|
+
url = "http://30.push2.eastmoney.com/api/qt/clist/get"
|
|
41
|
+
params = {
|
|
42
|
+
"pn": "1",
|
|
43
|
+
"pz": "200",
|
|
44
|
+
"po": "1",
|
|
45
|
+
"np": "1",
|
|
46
|
+
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
|
|
47
|
+
"fltt": "2",
|
|
48
|
+
"invt": "2",
|
|
49
|
+
"fid": "f3",
|
|
50
|
+
"fs": f"b:{blk_code} f:!50",
|
|
51
|
+
"fields": "f12",
|
|
52
|
+
"_": "1626081702127",
|
|
53
|
+
}
|
|
54
|
+
r = requests.get(url, params=params, timeout=15)
|
|
55
|
+
data_json = r.json()
|
|
56
|
+
ret = [v['f12'] for v in data_json["data"]["diff"]]
|
|
57
|
+
total_page = math.ceil(data_json["data"]["total"] / 200)
|
|
58
|
+
for page in range(2, total_page + 1):
|
|
59
|
+
params["pn"] = page
|
|
60
|
+
r = requests.get(url, params=params, timeout=15)
|
|
61
|
+
data_json = r.json()
|
|
62
|
+
if data_json["data"] is None:
|
|
63
|
+
continue
|
|
64
|
+
tmp = [v['f12'] for v in data_json["data"]['diff']]
|
|
65
|
+
ret.extend(tmp)
|
|
66
|
+
return ret
|
|
67
|
+
|
|
68
|
+
|
|
12
69
|
@hku_catch(ret={}, trace=True)
|
|
13
70
|
def get_all_hybk_info(code_market_dict, sep=""):
|
|
14
71
|
"""获取所有行业板块列表"""
|
|
15
|
-
|
|
72
|
+
blk_list = get_hybk_names()
|
|
16
73
|
ret = {}
|
|
17
|
-
for
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
for stk_code in stk_codes:
|
|
23
|
-
try:
|
|
24
|
-
ret[blk_name].append(f"{code_market_dict[stk_code]}{sep}{stk_code}")
|
|
25
|
-
except:
|
|
26
|
-
# print(stk_code)
|
|
27
|
-
pass
|
|
74
|
+
for blk in blk_list:
|
|
75
|
+
stk_codes = get_hybk_cons_code(blk[0])
|
|
76
|
+
hku_info(f"获取行业板块{blk[1]}成分: {len(stk_codes)}")
|
|
77
|
+
ret[blk[1]] = [
|
|
78
|
+
f"{code_market_dict[stk_code]}{sep}{stk_code}" for stk_code in stk_codes if stk_code in code_market_dict]
|
|
28
79
|
return ret
|
|
29
80
|
|
|
30
81
|
|
|
@@ -34,26 +85,21 @@ def get_all_gnbk_info(code_market_dict, sep=""):
|
|
|
34
85
|
blk_names = ak.stock_board_concept_name_em()['板块名称']
|
|
35
86
|
ret = {}
|
|
36
87
|
for blk_name in blk_names:
|
|
37
|
-
# print(blk_name)
|
|
38
|
-
ret[blk_name] = []
|
|
39
88
|
stk_codes = ak.stock_board_concept_cons_em(blk_name)
|
|
40
89
|
stk_codes = stk_codes['代码'].to_list()
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
except:
|
|
45
|
-
# print(stk_code)
|
|
46
|
-
pass
|
|
90
|
+
hku_info(f"获取概念板块{blk_name}成分: {len(stk_codes)}")
|
|
91
|
+
ret[blk_name] = [
|
|
92
|
+
f"{code_market_dict[stk_code]}{sep}{stk_code}" for stk_code in stk_codes if stk_code in code_market_dict]
|
|
47
93
|
return ret
|
|
48
94
|
|
|
49
95
|
|
|
50
|
-
@hku_catch(ret=
|
|
51
|
-
def
|
|
52
|
-
"""
|
|
96
|
+
@hku_catch(ret=[], trace=True)
|
|
97
|
+
def get_dybk_names():
|
|
98
|
+
"""获取所有地域板块名称列表"""
|
|
53
99
|
url = "http://13.push2.eastmoney.com/api/qt/clist/get"
|
|
54
100
|
params = {
|
|
55
101
|
"pn": "1",
|
|
56
|
-
"pz": "
|
|
102
|
+
"pz": "200",
|
|
57
103
|
"po": "1",
|
|
58
104
|
"np": "1",
|
|
59
105
|
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
|
|
@@ -62,17 +108,32 @@ def get_all_dybk_info(code_market_dict, sep=""):
|
|
|
62
108
|
"fid": "f3",
|
|
63
109
|
"fs": "m:90+t:1+f:!50",
|
|
64
110
|
"fields": "f12,f14",
|
|
65
|
-
# "fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,"
|
|
66
|
-
# "f136,f115,f152",
|
|
67
111
|
"_": "1623833739532",
|
|
68
112
|
}
|
|
69
|
-
r = requests.get(url, params=params)
|
|
113
|
+
r = requests.get(url, params=params, timeout=15)
|
|
70
114
|
data_json = r.json()
|
|
71
|
-
data_json
|
|
115
|
+
hku_check(data_json['data'] is not None, "获取地域板块名称列表失败!")
|
|
116
|
+
ret = [(v["f12"], v["f14"]) for v in data_json["data"]["diff"]]
|
|
117
|
+
|
|
118
|
+
total_page = math.ceil(data_json["data"]["total"] / 200)
|
|
119
|
+
for page in range(2, total_page + 1):
|
|
120
|
+
params["pn"] = page
|
|
121
|
+
r = requests.get(url, params=params, timeout=15)
|
|
122
|
+
data_json = r.json()
|
|
123
|
+
if data_json["data"] is not None:
|
|
124
|
+
ret.extend([(v["f12"], v["f14"]) for v in data_json["data"]["diff"]])
|
|
125
|
+
return ret
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
@hku_catch(ret={}, trace=True)
|
|
129
|
+
def get_all_dybk_info(code_market_dict, sep=""):
|
|
130
|
+
"""获取所有地域板块列表"""
|
|
131
|
+
blk_list = get_dybk_names()
|
|
72
132
|
|
|
133
|
+
url = "http://13.push2.eastmoney.com/api/qt/clist/get"
|
|
73
134
|
params = {
|
|
74
135
|
"pn": "1",
|
|
75
|
-
"pz": "
|
|
136
|
+
"pz": "200",
|
|
76
137
|
"po": "1",
|
|
77
138
|
"np": "1",
|
|
78
139
|
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
|
|
@@ -85,24 +146,30 @@ def get_all_dybk_info(code_market_dict, sep=""):
|
|
|
85
146
|
}
|
|
86
147
|
|
|
87
148
|
ret = {}
|
|
88
|
-
for v in
|
|
89
|
-
|
|
90
|
-
blk_code = v["f12"]
|
|
91
|
-
blk_name = v["f14"]
|
|
92
|
-
# print(blk_name)
|
|
93
|
-
ret[blk_name] = []
|
|
149
|
+
for v in blk_list:
|
|
150
|
+
blk_code, blk_name = v[0], v[1]
|
|
94
151
|
params["fs"] = f"b:{blk_code} f:!50"
|
|
95
|
-
|
|
152
|
+
params["pn"] = 1
|
|
153
|
+
r = requests.get(url, params=params, timeout=15)
|
|
154
|
+
data = r.json()
|
|
155
|
+
if data["data"] is None:
|
|
156
|
+
continue
|
|
157
|
+
|
|
96
158
|
stk_json = r.json()
|
|
97
159
|
stk_json = stk_json["data"]["diff"]
|
|
160
|
+
ret[blk_name] = [
|
|
161
|
+
f"{code_market_dict[v["f12"]]}{sep}{v["f12"]}" for v in stk_json if v["f12"] in code_market_dict]
|
|
162
|
+
|
|
163
|
+
total_page = math.ceil(data["data"]["total"] / 200)
|
|
164
|
+
for page in range(2, total_page + 1):
|
|
165
|
+
params["pn"] = page
|
|
166
|
+
r = requests.get(url, params=params, timeout=15)
|
|
167
|
+
stk_json = r.json()
|
|
168
|
+
stk_json = stk_json["data"]["diff"]
|
|
169
|
+
ret[blk_name].extend(
|
|
170
|
+
[f"{code_market_dict[v["f12"]]}{sep}{v["f12"]}" for v in stk_json if v["f12"] in code_market_dict])
|
|
171
|
+
hku_info(f'获取地域板块{blk_name}成分: {len(ret[blk_name])}')
|
|
98
172
|
|
|
99
|
-
for item in stk_json:
|
|
100
|
-
stk_code = item["f12"]
|
|
101
|
-
try:
|
|
102
|
-
ret[blk_name].append(f"{code_market_dict[stk_code]}{sep}{stk_code}")
|
|
103
|
-
except:
|
|
104
|
-
# print(stk_code)
|
|
105
|
-
pass
|
|
106
173
|
return ret
|
|
107
174
|
|
|
108
175
|
|
|
@@ -117,24 +184,24 @@ def get_all_zsbk_info(code_market_dict, sep=""):
|
|
|
117
184
|
for i in range(total):
|
|
118
185
|
blk_name = blk_names[i]
|
|
119
186
|
blk_code = blk_codes[i]
|
|
120
|
-
hku_info("{} 获取指数板块 {} 详情", i, blk_name)
|
|
121
187
|
# print(i, blk_name)
|
|
122
188
|
# 沪深指数有重复,避免深指覆盖
|
|
123
189
|
if blk_name in ret:
|
|
124
190
|
continue
|
|
125
191
|
try:
|
|
126
|
-
ret[blk_name] = []
|
|
127
192
|
stk_codes = ak.index_stock_cons_csindex(symbol=blk_code)
|
|
128
193
|
stk_codes = stk_codes['成分券代码'].to_list()
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
except:
|
|
133
|
-
# print(stk_code)
|
|
134
|
-
pass
|
|
194
|
+
hku_info("{} 获取指数板块{}成分: {}", i, blk_name, len(stk_codes))
|
|
195
|
+
ret[blk_name] = [
|
|
196
|
+
f"{code_market_dict[stk_code]}{sep}{stk_code}" for stk_code in stk_codes if stk_code in code_market_dict]
|
|
135
197
|
except KeyboardInterrupt:
|
|
136
198
|
break
|
|
137
199
|
except:
|
|
138
200
|
# print("Failed!", blk_code, blk_name)
|
|
139
201
|
pass
|
|
140
202
|
return ret
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
if __name__ == "__main__":
|
|
206
|
+
blks = get_hybk_cons_code('BK0475')
|
|
207
|
+
print(blks)
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
# -*- coding: utf8 -*-
|
|
3
3
|
# cp936
|
|
4
4
|
|
|
5
|
+
import time
|
|
5
6
|
from PyQt5.QtCore import QThread, pyqtSignal
|
|
6
7
|
|
|
7
8
|
class EscapetimeThread(QThread):
|
|
@@ -11,11 +12,11 @@ class EscapetimeThread(QThread):
|
|
|
11
12
|
super(self.__class__, self).__init__()
|
|
12
13
|
self.working = True
|
|
13
14
|
self.msg_name = 'ESCAPE_TIME'
|
|
14
|
-
self.
|
|
15
|
+
self.init_time = time.time()
|
|
15
16
|
|
|
16
17
|
def __del__(self):
|
|
17
18
|
self.working = False
|
|
18
|
-
#print("EscapetimeThread", "__del__", self.
|
|
19
|
+
#print("EscapetimeThread", "__del__", time.time() - self.init_time)
|
|
19
20
|
self.wait()
|
|
20
21
|
|
|
21
22
|
def send_message(self, msg):
|
|
@@ -28,5 +29,4 @@ class EscapetimeThread(QThread):
|
|
|
28
29
|
def run(self):
|
|
29
30
|
while self.working:
|
|
30
31
|
self.msleep(10)
|
|
31
|
-
self.
|
|
32
|
-
self.send_message([self.escape_time/1000.,])
|
|
32
|
+
self.send_message([(time.time() - self.init_time),])
|
|
@@ -39,17 +39,18 @@ class ImportBlockInfoTask:
|
|
|
39
39
|
connect = mysql.connector.connect(**db_config)
|
|
40
40
|
import_block = em_import_block_to_mysql
|
|
41
41
|
|
|
42
|
+
count = 0
|
|
42
43
|
try:
|
|
43
44
|
code_market_dict = {}
|
|
44
45
|
for market in (MARKET.SH, MARKET.SZ, MARKET.BJ):
|
|
45
46
|
x = get_stk_code_name_list(market)
|
|
46
47
|
for v in x:
|
|
47
48
|
code_market_dict[v["code"]] = market
|
|
48
|
-
import_block(connect, code_market_dict, self.categorys)
|
|
49
|
+
count = import_block(connect, code_market_dict, self.categorys)
|
|
49
50
|
except Exception as e:
|
|
50
51
|
hku_error(str(e))
|
|
51
52
|
|
|
52
53
|
connect.close()
|
|
53
54
|
|
|
54
|
-
self.queue.put([self.task_name, "BLOCKINFO", f"{self.categorys}
|
|
55
|
+
self.queue.put([self.task_name, "BLOCKINFO", f"{self.categorys}板块信息下载完毕: {count}", None, None])
|
|
55
56
|
self.status = "finished"
|
|
@@ -30,6 +30,7 @@ import mysql.connector
|
|
|
30
30
|
from pytdx.hq import TdxHq_API
|
|
31
31
|
from hikyuu.data.pytdx_finance_to_mysql import history_finance_import_mysql
|
|
32
32
|
from hikyuu.data.pytdx_finance_to_sqlite import history_finance_import_sqlite
|
|
33
|
+
from hikyuu.data.common_pytdx import search_best_tdx
|
|
33
34
|
from hikyuu.util import *
|
|
34
35
|
|
|
35
36
|
|
|
@@ -47,6 +48,7 @@ class ImportHistoryFinanceTask:
|
|
|
47
48
|
|
|
48
49
|
def connect(self):
|
|
49
50
|
self.api = TdxHq_API()
|
|
51
|
+
# 不是所有服务器都提供下载
|
|
50
52
|
hku_check(self.api.connect('120.76.152.87', 7709), "failed connect pytdx!")
|
|
51
53
|
|
|
52
54
|
def get_list_info(self):
|
hikyuu/gui/data/MainWindow.py
CHANGED
|
@@ -165,7 +165,7 @@ class Ui_MainWindow(object):
|
|
|
165
165
|
self.label_6.setObjectName("label_6")
|
|
166
166
|
self.gridLayout_4.addWidget(self.label_6, 3, 0, 1, 1)
|
|
167
167
|
self.min5_start_dateEdit = QtWidgets.QDateEdit(self.groupBox_7)
|
|
168
|
-
self.min5_start_dateEdit.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1989, 12, 30), QtCore.QTime(
|
|
168
|
+
self.min5_start_dateEdit.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1989, 12, 30), QtCore.QTime(8, 0, 0)))
|
|
169
169
|
self.min5_start_dateEdit.setCalendarPopup(True)
|
|
170
170
|
self.min5_start_dateEdit.setObjectName("min5_start_dateEdit")
|
|
171
171
|
self.gridLayout_4.addWidget(self.min5_start_dateEdit, 1, 1, 1, 1)
|
|
@@ -187,7 +187,7 @@ class Ui_MainWindow(object):
|
|
|
187
187
|
self.trans_start_dateEdit.setObjectName("trans_start_dateEdit")
|
|
188
188
|
self.gridLayout_4.addWidget(self.trans_start_dateEdit, 3, 1, 1, 1)
|
|
189
189
|
self.day_start_dateEdit = QtWidgets.QDateEdit(self.groupBox_7)
|
|
190
|
-
self.day_start_dateEdit.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1989, 12, 30), QtCore.QTime(
|
|
190
|
+
self.day_start_dateEdit.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1989, 12, 30), QtCore.QTime(8, 0, 0)))
|
|
191
191
|
self.day_start_dateEdit.setCalendarPopup(True)
|
|
192
192
|
self.day_start_dateEdit.setObjectName("day_start_dateEdit")
|
|
193
193
|
self.gridLayout_4.addWidget(self.day_start_dateEdit, 0, 1, 1, 1)
|
|
@@ -311,6 +311,11 @@ class Ui_MainWindow(object):
|
|
|
311
311
|
self.tab_2.setObjectName("tab_2")
|
|
312
312
|
self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.tab_2)
|
|
313
313
|
self.verticalLayout_7.setObjectName("verticalLayout_7")
|
|
314
|
+
spacerItem13 = QtWidgets.QSpacerItem(20, 9, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
|
|
315
|
+
self.verticalLayout_7.addItem(spacerItem13)
|
|
316
|
+
self.label_43 = QtWidgets.QLabel(self.tab_2)
|
|
317
|
+
self.label_43.setObjectName("label_43")
|
|
318
|
+
self.verticalLayout_7.addWidget(self.label_43)
|
|
314
319
|
self.horizontalLayout_11 = QtWidgets.QHBoxLayout()
|
|
315
320
|
self.horizontalLayout_11.setContentsMargins(10, 20, 10, -1)
|
|
316
321
|
self.horizontalLayout_11.setObjectName("horizontalLayout_11")
|
|
@@ -325,12 +330,12 @@ class Ui_MainWindow(object):
|
|
|
325
330
|
self.sched_import_timeEdit = QtWidgets.QTimeEdit(self.tab_2)
|
|
326
331
|
self.sched_import_timeEdit.setObjectName("sched_import_timeEdit")
|
|
327
332
|
self.horizontalLayout_14.addWidget(self.sched_import_timeEdit)
|
|
328
|
-
|
|
329
|
-
self.horizontalLayout_14.addItem(
|
|
333
|
+
spacerItem14 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
334
|
+
self.horizontalLayout_14.addItem(spacerItem14)
|
|
330
335
|
self.horizontalLayout_11.addLayout(self.horizontalLayout_14)
|
|
331
336
|
self.verticalLayout_7.addLayout(self.horizontalLayout_11)
|
|
332
|
-
|
|
333
|
-
self.verticalLayout_7.addItem(
|
|
337
|
+
spacerItem15 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
|
|
338
|
+
self.verticalLayout_7.addItem(spacerItem15)
|
|
334
339
|
self.horizontalLayout_18 = QtWidgets.QHBoxLayout()
|
|
335
340
|
self.horizontalLayout_18.setContentsMargins(10, -1, 10, -1)
|
|
336
341
|
self.horizontalLayout_18.setObjectName("horizontalLayout_18")
|
|
@@ -340,11 +345,11 @@ class Ui_MainWindow(object):
|
|
|
340
345
|
self.import_status_label = QtWidgets.QLabel(self.tab_2)
|
|
341
346
|
self.import_status_label.setObjectName("import_status_label")
|
|
342
347
|
self.horizontalLayout_18.addWidget(self.import_status_label)
|
|
343
|
-
|
|
344
|
-
self.horizontalLayout_18.addItem(
|
|
348
|
+
spacerItem16 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
349
|
+
self.horizontalLayout_18.addItem(spacerItem16)
|
|
345
350
|
self.verticalLayout_7.addLayout(self.horizontalLayout_18)
|
|
346
|
-
|
|
347
|
-
self.verticalLayout_7.addItem(
|
|
351
|
+
spacerItem17 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
|
|
352
|
+
self.verticalLayout_7.addItem(spacerItem17)
|
|
348
353
|
self.groupBox_5 = QtWidgets.QGroupBox(self.tab_2)
|
|
349
354
|
self.groupBox_5.setObjectName("groupBox_5")
|
|
350
355
|
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.groupBox_5)
|
|
@@ -392,11 +397,11 @@ class Ui_MainWindow(object):
|
|
|
392
397
|
self.label_9 = QtWidgets.QLabel(self.groupBox_5)
|
|
393
398
|
self.label_9.setObjectName("label_9")
|
|
394
399
|
self.gridLayout.addWidget(self.label_9, 5, 0, 1, 1)
|
|
395
|
-
|
|
396
|
-
self.gridLayout.addItem(
|
|
400
|
+
spacerItem18 = QtWidgets.QSpacerItem(5, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
|
|
401
|
+
self.gridLayout.addItem(spacerItem18, 0, 2, 1, 1)
|
|
397
402
|
self.verticalLayout_5.addLayout(self.gridLayout)
|
|
398
|
-
|
|
399
|
-
self.verticalLayout_5.addItem(
|
|
403
|
+
spacerItem19 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
|
|
404
|
+
self.verticalLayout_5.addItem(spacerItem19)
|
|
400
405
|
self.import_detail_textEdit = QtWidgets.QTextEdit(self.groupBox_5)
|
|
401
406
|
self.import_detail_textEdit.setFrameShape(QtWidgets.QFrame.NoFrame)
|
|
402
407
|
self.import_detail_textEdit.setReadOnly(True)
|
|
@@ -422,8 +427,8 @@ class Ui_MainWindow(object):
|
|
|
422
427
|
self.label_36.setObjectName("label_36")
|
|
423
428
|
self.verticalLayout.addWidget(self.label_36)
|
|
424
429
|
self.verticalLayout_4.addLayout(self.verticalLayout)
|
|
425
|
-
|
|
426
|
-
self.verticalLayout_4.addItem(
|
|
430
|
+
spacerItem20 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
|
|
431
|
+
self.verticalLayout_4.addItem(spacerItem20)
|
|
427
432
|
self.gridLayout_6 = QtWidgets.QGridLayout()
|
|
428
433
|
self.gridLayout_6.setContentsMargins(20, -1, -1, -1)
|
|
429
434
|
self.gridLayout_6.setObjectName("gridLayout_6")
|
|
@@ -517,8 +522,8 @@ class Ui_MainWindow(object):
|
|
|
517
522
|
self.preload_week_checkBox = QtWidgets.QCheckBox(self.groupBox_6)
|
|
518
523
|
self.preload_week_checkBox.setObjectName("preload_week_checkBox")
|
|
519
524
|
self.gridLayout_6.addWidget(self.preload_week_checkBox, 1, 0, 1, 1)
|
|
520
|
-
|
|
521
|
-
self.gridLayout_6.addItem(
|
|
525
|
+
spacerItem21 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
|
|
526
|
+
self.gridLayout_6.addItem(spacerItem21, 4, 3, 1, 1)
|
|
522
527
|
self.preload_quarter_checkBox = QtWidgets.QCheckBox(self.groupBox_6)
|
|
523
528
|
self.preload_quarter_checkBox.setObjectName("preload_quarter_checkBox")
|
|
524
529
|
self.gridLayout_6.addWidget(self.preload_quarter_checkBox, 3, 0, 1, 1)
|
|
@@ -553,16 +558,16 @@ class Ui_MainWindow(object):
|
|
|
553
558
|
self.preload_year_spinBox.setObjectName("preload_year_spinBox")
|
|
554
559
|
self.gridLayout_6.addWidget(self.preload_year_spinBox, 5, 2, 1, 1)
|
|
555
560
|
self.verticalLayout_4.addLayout(self.gridLayout_6)
|
|
556
|
-
|
|
557
|
-
self.verticalLayout_4.addItem(
|
|
561
|
+
spacerItem22 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
|
562
|
+
self.verticalLayout_4.addItem(spacerItem22)
|
|
558
563
|
self.verticalLayout_3.addWidget(self.groupBox_6)
|
|
559
564
|
self.tabWidget.addTab(self.tab_6, "")
|
|
560
565
|
self.tab = QtWidgets.QWidget()
|
|
561
566
|
self.tab.setObjectName("tab")
|
|
562
567
|
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.tab)
|
|
563
568
|
self.verticalLayout_2.setObjectName("verticalLayout_2")
|
|
564
|
-
|
|
565
|
-
self.verticalLayout_2.addItem(
|
|
569
|
+
spacerItem23 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
|
|
570
|
+
self.verticalLayout_2.addItem(spacerItem23)
|
|
566
571
|
self.horizontalLayout_15 = QtWidgets.QHBoxLayout()
|
|
567
572
|
self.horizontalLayout_15.setContentsMargins(20, -1, -1, -1)
|
|
568
573
|
self.horizontalLayout_15.setObjectName("horizontalLayout_15")
|
|
@@ -572,11 +577,11 @@ class Ui_MainWindow(object):
|
|
|
572
577
|
self.collect_status_label = QtWidgets.QLabel(self.tab)
|
|
573
578
|
self.collect_status_label.setObjectName("collect_status_label")
|
|
574
579
|
self.horizontalLayout_15.addWidget(self.collect_status_label)
|
|
575
|
-
|
|
576
|
-
self.horizontalLayout_15.addItem(
|
|
580
|
+
spacerItem24 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
581
|
+
self.horizontalLayout_15.addItem(spacerItem24)
|
|
577
582
|
self.verticalLayout_2.addLayout(self.horizontalLayout_15)
|
|
578
|
-
|
|
579
|
-
self.verticalLayout_2.addItem(
|
|
583
|
+
spacerItem25 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
|
|
584
|
+
self.verticalLayout_2.addItem(spacerItem25)
|
|
580
585
|
self.horizontalLayout_13 = QtWidgets.QHBoxLayout()
|
|
581
586
|
self.horizontalLayout_13.setContentsMargins(20, -1, -1, -1)
|
|
582
587
|
self.horizontalLayout_13.setObjectName("horizontalLayout_13")
|
|
@@ -588,11 +593,11 @@ class Ui_MainWindow(object):
|
|
|
588
593
|
self.collect_source_comboBox.addItem("")
|
|
589
594
|
self.collect_source_comboBox.addItem("")
|
|
590
595
|
self.horizontalLayout_13.addWidget(self.collect_source_comboBox)
|
|
591
|
-
|
|
592
|
-
self.horizontalLayout_13.addItem(
|
|
596
|
+
spacerItem26 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
597
|
+
self.horizontalLayout_13.addItem(spacerItem26)
|
|
593
598
|
self.verticalLayout_2.addLayout(self.horizontalLayout_13)
|
|
594
|
-
|
|
595
|
-
self.verticalLayout_2.addItem(
|
|
599
|
+
spacerItem27 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
|
|
600
|
+
self.verticalLayout_2.addItem(spacerItem27)
|
|
596
601
|
self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
|
|
597
602
|
self.horizontalLayout_10.setContentsMargins(20, -1, -1, -1)
|
|
598
603
|
self.horizontalLayout_10.setObjectName("horizontalLayout_10")
|
|
@@ -603,11 +608,11 @@ class Ui_MainWindow(object):
|
|
|
603
608
|
self.collect_sample_spinBox.setMaximum(86400)
|
|
604
609
|
self.collect_sample_spinBox.setObjectName("collect_sample_spinBox")
|
|
605
610
|
self.horizontalLayout_10.addWidget(self.collect_sample_spinBox)
|
|
606
|
-
|
|
607
|
-
self.horizontalLayout_10.addItem(
|
|
611
|
+
spacerItem28 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
612
|
+
self.horizontalLayout_10.addItem(spacerItem28)
|
|
608
613
|
self.verticalLayout_2.addLayout(self.horizontalLayout_10)
|
|
609
|
-
|
|
610
|
-
self.verticalLayout_2.addItem(
|
|
614
|
+
spacerItem29 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
|
|
615
|
+
self.verticalLayout_2.addItem(spacerItem29)
|
|
611
616
|
self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
|
|
612
617
|
self.horizontalLayout_8.setContentsMargins(20, -1, -1, -1)
|
|
613
618
|
self.horizontalLayout_8.setObjectName("horizontalLayout_8")
|
|
@@ -626,8 +631,8 @@ class Ui_MainWindow(object):
|
|
|
626
631
|
self.collect_phase1_last_timeEdit = QtWidgets.QTimeEdit(self.tab)
|
|
627
632
|
self.collect_phase1_last_timeEdit.setObjectName("collect_phase1_last_timeEdit")
|
|
628
633
|
self.horizontalLayout_6.addWidget(self.collect_phase1_last_timeEdit)
|
|
629
|
-
|
|
630
|
-
self.horizontalLayout_6.addItem(
|
|
634
|
+
spacerItem30 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
635
|
+
self.horizontalLayout_6.addItem(spacerItem30)
|
|
631
636
|
self.horizontalLayout_8.addLayout(self.horizontalLayout_6)
|
|
632
637
|
self.verticalLayout_2.addLayout(self.horizontalLayout_8)
|
|
633
638
|
self.horizontalLayout_9 = QtWidgets.QHBoxLayout()
|
|
@@ -648,12 +653,12 @@ class Ui_MainWindow(object):
|
|
|
648
653
|
self.collect_phase2_last_timeEdit = QtWidgets.QTimeEdit(self.tab)
|
|
649
654
|
self.collect_phase2_last_timeEdit.setObjectName("collect_phase2_last_timeEdit")
|
|
650
655
|
self.horizontalLayout_7.addWidget(self.collect_phase2_last_timeEdit)
|
|
651
|
-
|
|
652
|
-
self.horizontalLayout_7.addItem(
|
|
656
|
+
spacerItem31 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
657
|
+
self.horizontalLayout_7.addItem(spacerItem31)
|
|
653
658
|
self.horizontalLayout_9.addLayout(self.horizontalLayout_7)
|
|
654
659
|
self.verticalLayout_2.addLayout(self.horizontalLayout_9)
|
|
655
|
-
|
|
656
|
-
self.verticalLayout_2.addItem(
|
|
660
|
+
spacerItem32 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
|
|
661
|
+
self.verticalLayout_2.addItem(spacerItem32)
|
|
657
662
|
self.horizontalLayout_16 = QtWidgets.QHBoxLayout()
|
|
658
663
|
self.horizontalLayout_16.setContentsMargins(20, 0, -1, -1)
|
|
659
664
|
self.horizontalLayout_16.setObjectName("horizontalLayout_16")
|
|
@@ -666,8 +671,8 @@ class Ui_MainWindow(object):
|
|
|
666
671
|
self.collect_use_zhima_checkBox.setObjectName("collect_use_zhima_checkBox")
|
|
667
672
|
self.horizontalLayout_16.addWidget(self.collect_use_zhima_checkBox)
|
|
668
673
|
self.verticalLayout_2.addLayout(self.horizontalLayout_16)
|
|
669
|
-
|
|
670
|
-
self.verticalLayout_2.addItem(
|
|
674
|
+
spacerItem33 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
|
|
675
|
+
self.verticalLayout_2.addItem(spacerItem33)
|
|
671
676
|
self.horizontalLayout_17 = QtWidgets.QHBoxLayout()
|
|
672
677
|
self.horizontalLayout_17.setContentsMargins(20, 0, -1, -1)
|
|
673
678
|
self.horizontalLayout_17.setObjectName("horizontalLayout_17")
|
|
@@ -735,6 +740,7 @@ class Ui_MainWindow(object):
|
|
|
735
740
|
self.label_19.setText(_translate("MainWindow", "端口号:"))
|
|
736
741
|
self.label_13.setText(_translate("MainWindow", "密码"))
|
|
737
742
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "存储设置"))
|
|
743
|
+
self.label_43.setText(_translate("MainWindow", " 注:HDF5存储导入时,请关闭其他 hikyuu 进程,HDF5不支持同时读写!"))
|
|
738
744
|
self.sched_import_pushButton.setText(_translate("MainWindow", "启动定时导入"))
|
|
739
745
|
self.label_40.setText(_translate("MainWindow", "导入执行时间:"))
|
|
740
746
|
self.start_import_pushButton.setText(_translate("MainWindow", "手工执行导入"))
|
hikyuu/gui/importdata.py
CHANGED
|
@@ -3,15 +3,12 @@
|
|
|
3
3
|
# cp936
|
|
4
4
|
|
|
5
5
|
import os.path
|
|
6
|
-
import sys
|
|
6
|
+
import sys, time
|
|
7
7
|
from configparser import ConfigParser
|
|
8
8
|
|
|
9
|
-
from PyQt5.Qt import QCoreApplication
|
|
10
|
-
|
|
11
9
|
from hikyuu.data.weight_to_sqlite import qianlong_import_weight
|
|
12
10
|
from hikyuu.data.common_pytdx import search_best_tdx
|
|
13
11
|
|
|
14
|
-
from hikyuu.gui.data.EscapetimeThread import EscapetimeThread
|
|
15
12
|
from hikyuu.gui.data.UseTdxImportToH5Thread import UseTdxImportToH5Thread
|
|
16
13
|
from hikyuu.gui.data.UsePytdxImportToH5Thread import UsePytdxImportToH5Thread
|
|
17
14
|
|
|
@@ -31,19 +28,25 @@ class HKUImportDataCMD:
|
|
|
31
28
|
return import_config
|
|
32
29
|
|
|
33
30
|
def initThreads(self):
|
|
34
|
-
self.escape_time_thread = None
|
|
35
31
|
self.hdf5_import_thread = None
|
|
36
32
|
self.mysql_import_thread = None
|
|
37
33
|
self.import_running = False
|
|
38
34
|
self.progress = {'DAY': 0, '1MIN': 0, '5MIN': 0, 'TRANS': 0, 'TIME': 0}
|
|
39
35
|
self.info_type = {'DAY': '日线数据', '1MIN': '一分钟线', '5MIN': '五分钟线', 'TRANS': '历史分笔', 'TIME': '分时数据'}
|
|
40
|
-
self.
|
|
36
|
+
self.start_import_time = time.time()
|
|
41
37
|
self.details = []
|
|
42
38
|
|
|
39
|
+
def time_escaped(self, unit='min'):
|
|
40
|
+
if unit.lower() == 'min':
|
|
41
|
+
return (time.time() - self.start_import_time) / 60
|
|
42
|
+
if unit.lower() == 'hour':
|
|
43
|
+
return (time.time() - self.start_import_time) / 3600
|
|
44
|
+
return time.time() - self.start_import_time
|
|
45
|
+
|
|
43
46
|
def print_progress(self, ktype, progress):
|
|
44
47
|
if progress != self.progress[ktype]:
|
|
45
48
|
print(
|
|
46
|
-
'import progress: {}% - {} - 已耗时 {:>.2f} 分钟'.format(progress, self.info_type[ktype], self.
|
|
49
|
+
'import progress: {}% - {} - 已耗时 {:>.2f} 分钟'.format(progress, self.info_type[ktype], self.time_escaped())
|
|
47
50
|
)
|
|
48
51
|
self.progress[ktype] = progress
|
|
49
52
|
|
|
@@ -53,10 +56,7 @@ class HKUImportDataCMD:
|
|
|
53
56
|
return
|
|
54
57
|
|
|
55
58
|
msg_name, msg_task_name = msg[:2]
|
|
56
|
-
if msg_name == '
|
|
57
|
-
self.escape_time = msg_task_name / 60
|
|
58
|
-
|
|
59
|
-
elif msg_name == 'HDF5_IMPORT':
|
|
59
|
+
if msg_name == 'HDF5_IMPORT':
|
|
60
60
|
if msg_task_name == 'INFO':
|
|
61
61
|
print(msg[2])
|
|
62
62
|
|
|
@@ -64,18 +64,13 @@ class HKUImportDataCMD:
|
|
|
64
64
|
status = msg[2]
|
|
65
65
|
if status == 'FAILURE':
|
|
66
66
|
self.details.append(msg[3])
|
|
67
|
-
self.
|
|
68
|
-
self.hdf5_import_thread = None
|
|
69
|
-
self.escape_time_thread.stop()
|
|
70
|
-
self.escape_time_thread = None
|
|
71
|
-
print("\n导入完毕, 共耗时 {:>.2f} 分钟".format(self.escape_time))
|
|
67
|
+
print("\n导入完毕, 共耗时 {:>.2f} 分钟".format(self.time_escaped()))
|
|
72
68
|
print('\n=========================================================')
|
|
73
69
|
print("导入详情:")
|
|
74
70
|
for info in self.details:
|
|
75
71
|
print(info)
|
|
76
72
|
print('=========================================================')
|
|
77
73
|
self.import_running = False
|
|
78
|
-
QCoreApplication.quit()
|
|
79
74
|
|
|
80
75
|
elif msg_task_name == 'IMPORT_KDATA':
|
|
81
76
|
ktype, progress = msg[2:4]
|
|
@@ -139,7 +134,6 @@ class HKUImportDataCMD:
|
|
|
139
134
|
self.import_running = True
|
|
140
135
|
|
|
141
136
|
print("正在启动任务....")
|
|
142
|
-
QCoreApplication.processEvents()
|
|
143
137
|
|
|
144
138
|
if config.getboolean('tdx', 'enable'):
|
|
145
139
|
self.hdf5_import_thread = UseTdxImportToH5Thread(None, config)
|
|
@@ -147,19 +141,12 @@ class HKUImportDataCMD:
|
|
|
147
141
|
self.hdf5_import_thread = UsePytdxImportToH5Thread(None, config)
|
|
148
142
|
|
|
149
143
|
self.hdf5_import_thread.message.connect(self.on_message_from_thread)
|
|
150
|
-
self.hdf5_import_thread.
|
|
151
|
-
|
|
152
|
-
self.escape_time = 0.0
|
|
153
|
-
self.escape_time_thread = EscapetimeThread()
|
|
154
|
-
self.escape_time_thread.message.connect(self.on_message_from_thread)
|
|
155
|
-
self.escape_time_thread.start()
|
|
144
|
+
self.hdf5_import_thread.run()
|
|
156
145
|
|
|
157
146
|
|
|
158
147
|
def main():
|
|
159
|
-
app = QCoreApplication(sys.argv)
|
|
160
148
|
x = HKUImportDataCMD()
|
|
161
149
|
x.start_import_data()
|
|
162
|
-
sys.exit(app.exec())
|
|
163
150
|
|
|
164
151
|
|
|
165
152
|
if __name__ == '__main__':
|
hikyuu/hub.py
CHANGED
|
@@ -490,8 +490,7 @@ class HubManager(metaclass=SingletonType):
|
|
|
490
490
|
|
|
491
491
|
@dbsession
|
|
492
492
|
def get_current_hub(self, filename):
|
|
493
|
-
"""用于在仓库part.py
|
|
494
|
-
|
|
493
|
+
"""用于在仓库part.py中获取当前所在的仓库名。
|
|
495
494
|
示例: get_current_hub(__file__)
|
|
496
495
|
"""
|
|
497
496
|
abs_path = os.path.abspath(filename) # 当前文件的绝对路径
|
|
@@ -590,8 +589,7 @@ def get_part_name_list(hub=None, part_type=None):
|
|
|
590
589
|
|
|
591
590
|
|
|
592
591
|
def get_current_hub(filename):
|
|
593
|
-
"""用于在仓库part.py
|
|
594
|
-
|
|
592
|
+
"""用于在仓库part.py中获取当前所在的仓库名。
|
|
595
593
|
示例: get_current_hub(__file__)
|
|
596
594
|
"""
|
|
597
595
|
return HubManager().get_current_hub(filename)
|