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.
Files changed (179) hide show
  1. hikyuu/__init__.py +438 -6
  2. hikyuu/__init__.pyi +791 -0
  3. hikyuu/analysis/__init__.pyi +487 -0
  4. hikyuu/analysis/analysis.pyi +517 -0
  5. hikyuu/core.pyi +482 -0
  6. hikyuu/cpp/__init__.pyi +3 -0
  7. hikyuu/cpp/boost_date_time-mt.dll +0 -0
  8. hikyuu/cpp/boost_serialization-mt.dll +0 -0
  9. hikyuu/cpp/boost_wserialization-mt.dll +0 -0
  10. hikyuu/cpp/core310.pyd +0 -0
  11. hikyuu/cpp/core311.pyd +0 -0
  12. hikyuu/cpp/core312.pyd +0 -0
  13. hikyuu/cpp/core312.pyi +12867 -0
  14. hikyuu/cpp/core313.pyd +0 -0
  15. hikyuu/cpp/core38.pyd +0 -0
  16. hikyuu/cpp/core39.pyd +0 -0
  17. hikyuu/cpp/hikyuu.dll +0 -0
  18. hikyuu/cpp/hikyuu.lib +0 -0
  19. hikyuu/cpp/sqlite3.dll +0 -0
  20. hikyuu/data/common_mysql.py +24 -7
  21. hikyuu/data/common_pytdx.py +17 -1
  22. hikyuu/data/em_block_to_mysql.py +3 -2
  23. hikyuu/data/em_block_to_sqlite.py +8 -3
  24. hikyuu/data/mysql_upgrade/0025.sql +61 -0
  25. hikyuu/data/mysql_upgrade/0026.sql +9 -0
  26. hikyuu/data/sqlite_upgrade/0025.sql +63 -0
  27. hikyuu/data/sqlite_upgrade/0026.sql +10 -0
  28. hikyuu/draw/__init__.pyi +35 -0
  29. hikyuu/draw/drawplot/__init__.py +3 -0
  30. hikyuu/draw/drawplot/__init__.pyi +134 -0
  31. hikyuu/draw/drawplot/bokeh_draw.pyi +796 -0
  32. hikyuu/draw/drawplot/common.pyi +10 -0
  33. hikyuu/draw/drawplot/echarts_draw.py +219 -24
  34. hikyuu/draw/drawplot/echarts_draw.pyi +682 -0
  35. hikyuu/draw/drawplot/matplotlib_draw.py +18 -3
  36. hikyuu/draw/drawplot/matplotlib_draw.pyi +1101 -0
  37. hikyuu/draw/elder.pyi +44 -0
  38. hikyuu/draw/kaufman.pyi +38 -0
  39. hikyuu/draw/volume.pyi +31 -0
  40. hikyuu/examples/notebook/Demo/Demo2.ipynb +1 -1
  41. hikyuu/extend.py +9 -3
  42. hikyuu/extend.pyi +636 -0
  43. hikyuu/fetcher/stock/zh_block_em.py +118 -51
  44. hikyuu/gui/data/EscapetimeThread.py +4 -4
  45. hikyuu/gui/data/ImportBlockInfoTask.py +3 -2
  46. hikyuu/gui/data/ImportHistoryFinanceTask.py +2 -0
  47. hikyuu/gui/data/MainWindow.py +48 -42
  48. hikyuu/gui/importdata.py +13 -26
  49. hikyuu/hub.py +2 -4
  50. hikyuu/hub.pyi +254 -0
  51. hikyuu/include/hikyuu/DataType.h +5 -0
  52. hikyuu/include/hikyuu/Stock.h +7 -0
  53. hikyuu/include/hikyuu/indicator/Indicator.h +8 -1
  54. hikyuu/include/hikyuu/indicator/Indicator2InImp.h +65 -0
  55. hikyuu/include/hikyuu/indicator/IndicatorImp.h +4 -3
  56. hikyuu/include/hikyuu/indicator/build_in.h +12 -0
  57. hikyuu/include/hikyuu/indicator/crt/ADVANCE.h +3 -1
  58. hikyuu/include/hikyuu/indicator/crt/CONTEXT.h +2 -2
  59. hikyuu/include/hikyuu/indicator/crt/CORR.h +4 -2
  60. hikyuu/include/hikyuu/indicator/crt/COST.h +3 -0
  61. hikyuu/include/hikyuu/indicator/crt/CYCLE.h +24 -0
  62. hikyuu/include/hikyuu/indicator/crt/DECLINE.h +3 -1
  63. hikyuu/include/hikyuu/indicator/crt/DISCARD.h +27 -0
  64. hikyuu/include/hikyuu/indicator/crt/DMA.h +2 -1
  65. hikyuu/include/hikyuu/indicator/crt/HSL.h +1 -13
  66. hikyuu/include/hikyuu/indicator/crt/INBLOCK.h +31 -0
  67. hikyuu/include/hikyuu/indicator/crt/INDEX.h +60 -0
  68. hikyuu/include/hikyuu/indicator/crt/INSUM.h +5 -2
  69. hikyuu/include/hikyuu/indicator/crt/ISINF.h +28 -0
  70. hikyuu/include/hikyuu/indicator/crt/ISINFA.h +28 -0
  71. hikyuu/include/hikyuu/indicator/crt/ISNA.h +29 -0
  72. hikyuu/include/hikyuu/indicator/crt/JUMPDOWN.h +24 -0
  73. hikyuu/include/hikyuu/indicator/crt/JUMPUP.h +24 -0
  74. hikyuu/include/hikyuu/indicator/crt/LASTVALUE.h +29 -0
  75. hikyuu/include/hikyuu/indicator/crt/LIUTONGPAN.h +1 -0
  76. hikyuu/include/hikyuu/indicator/crt/REPLACE.h +29 -0
  77. hikyuu/include/hikyuu/indicator/crt/SPEARMAN.h +3 -2
  78. hikyuu/include/hikyuu/indicator/crt/WINNER.h +38 -0
  79. hikyuu/include/hikyuu/indicator/imp/IContext.h +1 -1
  80. hikyuu/include/hikyuu/indicator/imp/ICorr.h +7 -22
  81. hikyuu/include/hikyuu/indicator/imp/ICost.h +31 -0
  82. hikyuu/include/hikyuu/indicator/imp/ICycle.h +30 -0
  83. hikyuu/include/hikyuu/indicator/imp/IDiscard.h +28 -0
  84. hikyuu/include/hikyuu/indicator/imp/IDma.h +7 -24
  85. hikyuu/include/hikyuu/indicator/imp/IHsl.h +30 -0
  86. hikyuu/include/hikyuu/indicator/imp/IInBlock.h +30 -0
  87. hikyuu/include/hikyuu/indicator/imp/IIndex.h +26 -0
  88. hikyuu/include/hikyuu/indicator/imp/IIsInf.h +26 -0
  89. hikyuu/include/hikyuu/indicator/imp/IIsInfa.h +26 -0
  90. hikyuu/include/hikyuu/indicator/imp/IIsNa.h +26 -0
  91. hikyuu/include/hikyuu/indicator/imp/IJumpDown.h +24 -0
  92. hikyuu/include/hikyuu/indicator/imp/IJumpUp.h +24 -0
  93. hikyuu/include/hikyuu/indicator/imp/ILastValue.h +26 -0
  94. hikyuu/include/hikyuu/indicator/imp/IReplace.h +26 -0
  95. hikyuu/include/hikyuu/indicator/imp/ISpearman.h +6 -21
  96. hikyuu/include/hikyuu/indicator/imp/IWinner.h +26 -0
  97. hikyuu/include/hikyuu/indicator_talib/imp/TaMavp.h +6 -20
  98. hikyuu/include/hikyuu/indicator_talib/imp/ta_defines.h +14 -65
  99. hikyuu/include/hikyuu/indicator_talib/imp/ta_imp.h +54 -90
  100. hikyuu/include/hikyuu/indicator_talib/ta_crt.h +11 -9
  101. hikyuu/include/hikyuu/strategy/RunPortfolioInStrategy.h +3 -4
  102. hikyuu/include/hikyuu/strategy/Strategy.h +4 -5
  103. hikyuu/include/hikyuu/trade_manage/TradeRecord.h +5 -1
  104. hikyuu/include/hikyuu/trade_sys/allocatefunds/build_in.h +1 -0
  105. hikyuu/include/hikyuu/trade_sys/allocatefunds/crt/AF_FixedWeightList.h +22 -0
  106. hikyuu/include/hikyuu/trade_sys/allocatefunds/imp/FixedWeightListAllocateFunds.h +25 -0
  107. hikyuu/include/hikyuu/trade_sys/moneymanager/MoneyManagerBase.h +17 -4
  108. hikyuu/include/hikyuu/trade_sys/moneymanager/build_in.h +2 -0
  109. hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedCapital.h +6 -0
  110. hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedCapitalFunds.h +26 -0
  111. hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedCountTps.h +27 -0
  112. hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedRisk.h +6 -0
  113. hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedUnits.h +6 -0
  114. hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_WilliamsFixedRisk.h +7 -0
  115. hikyuu/include/hikyuu/trade_sys/moneymanager/imp/FixedCapitalFundsMM.h +28 -0
  116. hikyuu/include/hikyuu/trade_sys/moneymanager/imp/FixedCountTpsMM.h +44 -0
  117. hikyuu/include/hikyuu/trade_sys/multifactor/build_in.h +1 -0
  118. hikyuu/include/hikyuu/trade_sys/multifactor/crt/MF_Weight.h +30 -0
  119. hikyuu/include/hikyuu/trade_sys/multifactor/imp/WeightMultiFactor.h +41 -0
  120. hikyuu/include/hikyuu/trade_sys/portfolio/Portfolio.h +38 -37
  121. hikyuu/include/hikyuu/trade_sys/portfolio/build_in.h +1 -0
  122. hikyuu/include/hikyuu/trade_sys/portfolio/crt/PF_Simple.h +25 -1
  123. hikyuu/include/hikyuu/trade_sys/portfolio/crt/PF_WithoutAF.h +50 -0
  124. hikyuu/include/hikyuu/trade_sys/portfolio/imp/SimplePortfolio.h +53 -0
  125. hikyuu/include/hikyuu/trade_sys/portfolio/imp/WithoutAFPortfolio.h +57 -0
  126. hikyuu/include/hikyuu/trade_sys/selector/imp/MultiFactorSelector.h +7 -0
  127. hikyuu/include/hikyuu/trade_sys/signal/SignalBase.h +51 -5
  128. hikyuu/include/hikyuu/trade_sys/signal/build_in.h +2 -0
  129. hikyuu/include/hikyuu/trade_sys/signal/crt/SG_Bool.h +2 -1
  130. hikyuu/include/hikyuu/trade_sys/signal/crt/SG_Logic.h +37 -0
  131. hikyuu/include/hikyuu/trade_sys/signal/crt/SG_OneSide.h +28 -0
  132. hikyuu/include/hikyuu/trade_sys/signal/imp/OneSideSignal.h +46 -0
  133. hikyuu/include/hikyuu/trade_sys/signal/imp/logic/AddSignal.h +19 -0
  134. hikyuu/include/hikyuu/trade_sys/signal/imp/logic/AddValueSignal.h +19 -0
  135. hikyuu/include/hikyuu/trade_sys/signal/imp/logic/DivSignal.h +19 -0
  136. hikyuu/include/hikyuu/trade_sys/signal/imp/logic/DivValueSignal.h +22 -0
  137. hikyuu/include/hikyuu/trade_sys/signal/imp/logic/MulSignal.h +19 -0
  138. hikyuu/include/hikyuu/trade_sys/signal/imp/logic/MulValueSignal.h +19 -0
  139. hikyuu/include/hikyuu/trade_sys/signal/imp/logic/OperatorSignal.h +68 -0
  140. hikyuu/include/hikyuu/trade_sys/signal/imp/logic/OperatorValueSignal.h +67 -0
  141. hikyuu/include/hikyuu/trade_sys/signal/imp/logic/SubSignal.h +19 -0
  142. hikyuu/include/hikyuu/trade_sys/signal/imp/logic/SubValueSignal.h +22 -0
  143. hikyuu/include/hikyuu/trade_sys/signal/imp/logic/__init__.py +1 -0
  144. hikyuu/include/hikyuu/trade_sys/stoploss/crt/ST_Indicator.h +1 -1
  145. hikyuu/include/hikyuu/trade_sys/stoploss/imp/IndicatorStoploss.h +3 -4
  146. hikyuu/include/hikyuu/utilities/FilterNode.h +2 -2
  147. hikyuu/include/hikyuu/utilities/Log.h +42 -15
  148. hikyuu/include/hikyuu/utilities/datetime/Datetime.h +1 -1
  149. hikyuu/include/hikyuu/utilities/datetime/TimeDelta.h +2 -2
  150. hikyuu/include/hikyuu/utilities/db_connect/DBCondition.h +4 -0
  151. hikyuu/include/hikyuu/utilities/db_connect/SQLResultSet.h +2 -2
  152. hikyuu/include/hikyuu/utilities/db_connect/mysql/MySQLConnect.h +5 -1
  153. hikyuu/include/hikyuu/utilities/node/NodeServer.h +4 -4
  154. hikyuu/include/hikyuu/utilities/thread/MQStealThreadPool.h +2 -2
  155. hikyuu/include/hikyuu/utilities/thread/MQThreadPool.h +2 -2
  156. hikyuu/include/hikyuu/utilities/thread/StealThreadPool.h +5 -5
  157. hikyuu/include/hikyuu/utilities/thread/ThreadPool.h +2 -2
  158. hikyuu/include/hikyuu/utilities/thread/algorithm.h +16 -10
  159. hikyuu/include/hikyuu/version.h +4 -4
  160. hikyuu/indicator/indicator.py +1 -0
  161. hikyuu/interactive.py +3 -266
  162. hikyuu/trade_manage/__init__.pyi +584 -0
  163. hikyuu/trade_manage/broker.pyi +54 -0
  164. hikyuu/trade_manage/broker_easytrader.pyi +21 -0
  165. hikyuu/trade_manage/broker_mail.pyi +55 -0
  166. hikyuu/trade_manage/trade.pyi +590 -0
  167. hikyuu/util/__init__.pyi +55 -0
  168. hikyuu/util/check.pyi +59 -0
  169. hikyuu/util/mylog.pyi +70 -0
  170. hikyuu/util/notebook.pyi +23 -0
  171. hikyuu/util/singleton.pyi +18 -0
  172. hikyuu/util/slice.pyi +8 -0
  173. {hikyuu-2.3.0.dist-info → hikyuu-2.5.0.dist-info}/METADATA +3 -2
  174. {hikyuu-2.3.0.dist-info → hikyuu-2.5.0.dist-info}/RECORD +178 -95
  175. {hikyuu-2.3.0.dist-info → hikyuu-2.5.0.dist-info}/top_level.txt +1 -0
  176. hikyuu/deprecated.py +0 -651
  177. {hikyuu-2.3.0.dist-info → hikyuu-2.5.0.dist-info}/LICENSE +0 -0
  178. {hikyuu-2.3.0.dist-info → hikyuu-2.5.0.dist-info}/WHEEL +0 -0
  179. {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
- blk_names = ak.stock_board_industry_name_em()['板块名称']
72
+ blk_list = get_hybk_names()
16
73
  ret = {}
17
- for blk_name in blk_names:
18
- # print(blk_name)
19
- ret[blk_name] = []
20
- stk_codes = ak.stock_board_industry_cons_em(blk_name)
21
- stk_codes = stk_codes['代码'].to_list()
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
- for stk_code in stk_codes:
42
- try:
43
- ret[blk_name].append(f"{code_market_dict[stk_code]}{sep}{stk_code}")
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={}, trace=True)
51
- def get_all_dybk_info(code_market_dict, sep=""):
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": "50000",
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 = data_json["data"]["diff"]
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": "2000",
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 data_json:
89
- # print(v)
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
- r = requests.get(url, params=params)
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
- for stk_code in stk_codes:
130
- try:
131
- ret[blk_name].append(f"{code_market_dict[stk_code]}{sep}{stk_code}")
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.escape_time = 0
15
+ self.init_time = time.time()
15
16
 
16
17
  def __del__(self):
17
18
  self.working = False
18
- #print("EscapetimeThread", "__del__", self.escape_time/1000)
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.escape_time += 10
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}板块信息下载完毕", None, None])
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):
@@ -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(16, 0, 0)))
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(16, 0, 0)))
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
- spacerItem13 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
329
- self.horizontalLayout_14.addItem(spacerItem13)
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
- spacerItem14 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
333
- self.verticalLayout_7.addItem(spacerItem14)
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
- spacerItem15 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
344
- self.horizontalLayout_18.addItem(spacerItem15)
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
- spacerItem16 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
347
- self.verticalLayout_7.addItem(spacerItem16)
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
- spacerItem17 = QtWidgets.QSpacerItem(5, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
396
- self.gridLayout.addItem(spacerItem17, 0, 2, 1, 1)
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
- spacerItem18 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
399
- self.verticalLayout_5.addItem(spacerItem18)
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
- spacerItem19 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
426
- self.verticalLayout_4.addItem(spacerItem19)
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
- spacerItem20 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
521
- self.gridLayout_6.addItem(spacerItem20, 4, 3, 1, 1)
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
- spacerItem21 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
557
- self.verticalLayout_4.addItem(spacerItem21)
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
- spacerItem22 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
565
- self.verticalLayout_2.addItem(spacerItem22)
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
- spacerItem23 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
576
- self.horizontalLayout_15.addItem(spacerItem23)
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
- spacerItem24 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
579
- self.verticalLayout_2.addItem(spacerItem24)
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
- spacerItem25 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
592
- self.horizontalLayout_13.addItem(spacerItem25)
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
- spacerItem26 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
595
- self.verticalLayout_2.addItem(spacerItem26)
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
- spacerItem27 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
607
- self.horizontalLayout_10.addItem(spacerItem27)
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
- spacerItem28 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
610
- self.verticalLayout_2.addItem(spacerItem28)
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
- spacerItem29 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
630
- self.horizontalLayout_6.addItem(spacerItem29)
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
- spacerItem30 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
652
- self.horizontalLayout_7.addItem(spacerItem30)
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
- spacerItem31 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
656
- self.verticalLayout_2.addItem(spacerItem31)
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
- spacerItem32 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
670
- self.verticalLayout_2.addItem(spacerItem32)
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.escape_time = 0.0
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.escape_time)
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 == 'ESCAPE_TIME':
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.hdf5_import_thread.terminate()
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.start()
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)