hikyuu 2.2.2__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 (820) hide show
  1. hikyuu/LICENSE.txt +21 -0
  2. hikyuu/__init__.py +137 -0
  3. hikyuu/analysis/__init__.py +14 -0
  4. hikyuu/analysis/analysis.py +151 -0
  5. hikyuu/config/__init__.py +1 -0
  6. hikyuu/config/block/__init__.py +0 -0
  7. hikyuu/config/block/dybk.ini +5357 -0
  8. hikyuu/config/block/gnbk.ini +50024 -0
  9. hikyuu/config/block/hybk.ini +5464 -0
  10. hikyuu/config/block/self.ini +10 -0
  11. hikyuu/config/block/zsbk.ini +65543 -0
  12. hikyuu/core.py +27 -0
  13. hikyuu/cpp/__init__.py +1 -0
  14. hikyuu/cpp/boost_date_time-mt.dll +0 -0
  15. hikyuu/cpp/boost_serialization-mt.dll +0 -0
  16. hikyuu/cpp/boost_wserialization-mt.dll +0 -0
  17. hikyuu/cpp/concrt140.dll +0 -0
  18. hikyuu/cpp/core310.pyd +0 -0
  19. hikyuu/cpp/core311.pyd +0 -0
  20. hikyuu/cpp/core312.pyd +0 -0
  21. hikyuu/cpp/core313.pyd +0 -0
  22. hikyuu/cpp/core38.pyd +0 -0
  23. hikyuu/cpp/core39.pyd +0 -0
  24. hikyuu/cpp/hikyuu.dll +0 -0
  25. hikyuu/cpp/hku_hdf5.dll +0 -0
  26. hikyuu/cpp/hku_hdf5_cpp.dll +0 -0
  27. hikyuu/cpp/hku_hdf5_hl.dll +0 -0
  28. hikyuu/cpp/hku_hdf5_hl_cpp.dll +0 -0
  29. hikyuu/cpp/libcrypto-1_1-x64.dll +0 -0
  30. hikyuu/cpp/libmysql.dll +0 -0
  31. hikyuu/cpp/libssl-1_1-x64.dll +0 -0
  32. hikyuu/cpp/msvcp140.dll +0 -0
  33. hikyuu/cpp/msvcp140_1.dll +0 -0
  34. hikyuu/cpp/msvcp140_2.dll +0 -0
  35. hikyuu/cpp/msvcp140_atomic_wait.dll +0 -0
  36. hikyuu/cpp/msvcp140_codecvt_ids.dll +0 -0
  37. hikyuu/cpp/sqlite3.dll +0 -0
  38. hikyuu/cpp/vcruntime140.dll +0 -0
  39. hikyuu/cpp/vcruntime140_1.dll +0 -0
  40. hikyuu/data/__init__.py +1 -0
  41. hikyuu/data/common.py +248 -0
  42. hikyuu/data/common_h5.py +398 -0
  43. hikyuu/data/common_mysql.py +485 -0
  44. hikyuu/data/common_pytdx.py +108 -0
  45. hikyuu/data/common_sqlite3.py +140 -0
  46. hikyuu/data/em_block_to_mysql.py +120 -0
  47. hikyuu/data/em_block_to_sqlite.py +117 -0
  48. hikyuu/data/hku_config_template.py +266 -0
  49. hikyuu/data/mysql_upgrade/0001.sql +5 -0
  50. hikyuu/data/mysql_upgrade/0002.sql +3 -0
  51. hikyuu/data/mysql_upgrade/0003.sql +9 -0
  52. hikyuu/data/mysql_upgrade/0004.sql +26 -0
  53. hikyuu/data/mysql_upgrade/0005.sql +3 -0
  54. hikyuu/data/mysql_upgrade/0006.sql +2 -0
  55. hikyuu/data/mysql_upgrade/0007.sql +20 -0
  56. hikyuu/data/mysql_upgrade/0008.sql +6 -0
  57. hikyuu/data/mysql_upgrade/0009.sql +36 -0
  58. hikyuu/data/mysql_upgrade/0010.sql +5 -0
  59. hikyuu/data/mysql_upgrade/0011.sql +5 -0
  60. hikyuu/data/mysql_upgrade/0012.sql +5 -0
  61. hikyuu/data/mysql_upgrade/0013.sql +2389 -0
  62. hikyuu/data/mysql_upgrade/0014.sql +3 -0
  63. hikyuu/data/mysql_upgrade/0015.sql +4 -0
  64. hikyuu/data/mysql_upgrade/0016.sql +4 -0
  65. hikyuu/data/mysql_upgrade/0017.sql +5 -0
  66. hikyuu/data/mysql_upgrade/0018.sql +2 -0
  67. hikyuu/data/mysql_upgrade/0019.sql +6 -0
  68. hikyuu/data/mysql_upgrade/0020.sql +4 -0
  69. hikyuu/data/mysql_upgrade/0021.sql +4 -0
  70. hikyuu/data/mysql_upgrade/0022.sql +5 -0
  71. hikyuu/data/mysql_upgrade/0023.sql +4 -0
  72. hikyuu/data/mysql_upgrade/__init__.py +1 -0
  73. hikyuu/data/mysql_upgrade/createdb.sql +265 -0
  74. hikyuu/data/pytdx_finance_to_mysql.py +129 -0
  75. hikyuu/data/pytdx_finance_to_sqlite.py +162 -0
  76. hikyuu/data/pytdx_to_h5.py +662 -0
  77. hikyuu/data/pytdx_to_mysql.py +803 -0
  78. hikyuu/data/pytdx_weight_to_mysql.py +196 -0
  79. hikyuu/data/pytdx_weight_to_sqlite.py +192 -0
  80. hikyuu/data/sqlite_mem.py +84 -0
  81. hikyuu/data/sqlite_mem_sql/__init__.py +1 -0
  82. hikyuu/data/sqlite_mem_sql/createdb.sql +126 -0
  83. hikyuu/data/sqlite_upgrade/0001.sql +4 -0
  84. hikyuu/data/sqlite_upgrade/0002.sql +48 -0
  85. hikyuu/data/sqlite_upgrade/0003.sql +18 -0
  86. hikyuu/data/sqlite_upgrade/0004.sql +11 -0
  87. hikyuu/data/sqlite_upgrade/0005.sql +28 -0
  88. hikyuu/data/sqlite_upgrade/0006.sql +5 -0
  89. hikyuu/data/sqlite_upgrade/0007.sql +4 -0
  90. hikyuu/data/sqlite_upgrade/0008.sql +22 -0
  91. hikyuu/data/sqlite_upgrade/0009.sql +8 -0
  92. hikyuu/data/sqlite_upgrade/0010.sql +5 -0
  93. hikyuu/data/sqlite_upgrade/0011.sql +16 -0
  94. hikyuu/data/sqlite_upgrade/0012.sql +15 -0
  95. hikyuu/data/sqlite_upgrade/0013.sql +9 -0
  96. hikyuu/data/sqlite_upgrade/0014.sql +607 -0
  97. hikyuu/data/sqlite_upgrade/0015.sql +7 -0
  98. hikyuu/data/sqlite_upgrade/0016.sql +8 -0
  99. hikyuu/data/sqlite_upgrade/0017.sql +16 -0
  100. hikyuu/data/sqlite_upgrade/0018.sql +5 -0
  101. hikyuu/data/sqlite_upgrade/0019.sql +4 -0
  102. hikyuu/data/sqlite_upgrade/0020.sql +4 -0
  103. hikyuu/data/sqlite_upgrade/0021.sql +6 -0
  104. hikyuu/data/sqlite_upgrade/0022.sql +6 -0
  105. hikyuu/data/sqlite_upgrade/0023.sql +7 -0
  106. hikyuu/data/sqlite_upgrade/0024.sql +22 -0
  107. hikyuu/data/sqlite_upgrade/__init__.py +1 -0
  108. hikyuu/data/sqlite_upgrade/createdb.sql +61 -0
  109. hikyuu/data/tdx_to_h5.py +464 -0
  110. hikyuu/data/tdx_to_mysql.py +464 -0
  111. hikyuu/data/weight_to_mysql.py +72 -0
  112. hikyuu/data/weight_to_sqlite.py +70 -0
  113. hikyuu/data/zh_bond10_to_mysql.py +30 -0
  114. hikyuu/data/zh_bond10_to_sqlite.py +42 -0
  115. hikyuu/data_driver/__init__.py +49 -0
  116. hikyuu/data_driver/jqdata_data_driver.py +277 -0
  117. hikyuu/data_driver/pytdx_data_driver.py +292 -0
  118. hikyuu/deprecated.py +651 -0
  119. hikyuu/draw/__init__.py +59 -0
  120. hikyuu/draw/drawplot/__init__.py +291 -0
  121. hikyuu/draw/drawplot/bokeh_draw.py +583 -0
  122. hikyuu/draw/drawplot/common.py +89 -0
  123. hikyuu/draw/drawplot/echarts_draw.py +402 -0
  124. hikyuu/draw/drawplot/matplotlib_draw.py +832 -0
  125. hikyuu/draw/elder.py +135 -0
  126. hikyuu/draw/kaufman.py +192 -0
  127. hikyuu/draw/volume.py +122 -0
  128. hikyuu/examples/Turtle_SG.py +47 -0
  129. hikyuu/examples/__init__.py +1 -0
  130. hikyuu/examples/examples_init.py +33 -0
  131. hikyuu/examples/notebook/000-Index.ipynb +76 -0
  132. hikyuu/examples/notebook/001-overview.ipynb +345 -0
  133. hikyuu/examples/notebook/002-HowToGetStock.ipynb +265 -0
  134. hikyuu/examples/notebook/003-HowToGetKDataAndDraw.ipynb +375 -0
  135. hikyuu/examples/notebook/004-IndicatorOverview.ipynb +501 -0
  136. hikyuu/examples/notebook/005-Drawplot.ipynb +321 -0
  137. hikyuu/examples/notebook/006-TradeManager.ipynb +381 -0
  138. hikyuu/examples/notebook/007-SystemDetails.ipynb +380 -0
  139. hikyuu/examples/notebook/008-Pickle.ipynb +127 -0
  140. hikyuu/examples/notebook/009-RealData.ipynb +110 -0
  141. hikyuu/examples/notebook/010-Portfolio.ipynb +333 -0
  142. hikyuu/examples/notebook/011-PyechartsDrawplot.ipynb +21821 -0
  143. hikyuu/examples/notebook/Demo/Demo1.ipynb +622 -0
  144. hikyuu/examples/notebook/Demo/Demo2.ipynb +665 -0
  145. hikyuu/examples/notebook/Demo/__init__.py +1 -0
  146. hikyuu/examples/notebook/README.md +1 -0
  147. hikyuu/examples/notebook/__init__.py +1 -0
  148. hikyuu/examples/notebook/images/002_01_block_config.png +0 -0
  149. hikyuu/examples/notebook/images/008_01_tocsv.png +0 -0
  150. hikyuu/examples/notebook/images/008_02_tocsv_look.png +0 -0
  151. hikyuu/examples/notebook/images/008_03_pickle.png +0 -0
  152. hikyuu/examples/notebook/images/__init__.py +1 -0
  153. hikyuu/examples/quick_crtsg.py +40 -0
  154. hikyuu/extend.py +387 -0
  155. hikyuu/fetcher/__init__.py +8 -0
  156. hikyuu/fetcher/proxy/__init__.py +12 -0
  157. hikyuu/fetcher/proxy/proxy.py +39 -0
  158. hikyuu/fetcher/proxy/zhima.py +63 -0
  159. hikyuu/fetcher/stock/__init__.py +8 -0
  160. hikyuu/fetcher/stock/zh_block_em.py +140 -0
  161. hikyuu/fetcher/stock/zh_stock_a_huatai.py +51 -0
  162. hikyuu/fetcher/stock/zh_stock_a_pytdx.py +139 -0
  163. hikyuu/fetcher/stock/zh_stock_a_qmt.py +58 -0
  164. hikyuu/fetcher/stock/zh_stock_a_sina_qq.py +229 -0
  165. hikyuu/flat/Spot.py +440 -0
  166. hikyuu/flat/SpotList.py +74 -0
  167. hikyuu/flat/__init__.py +4 -0
  168. hikyuu/gui/HikyuuTDX.py +839 -0
  169. hikyuu/gui/__init__.py +1 -0
  170. hikyuu/gui/data/CollectSpotThread.py +43 -0
  171. hikyuu/gui/data/CollectToMemThread.py +123 -0
  172. hikyuu/gui/data/CollectToMySQLThread.py +178 -0
  173. hikyuu/gui/data/EscapetimeThread.py +32 -0
  174. hikyuu/gui/data/ImportBlockInfoTask.py +55 -0
  175. hikyuu/gui/data/ImportHistoryFinanceTask.py +141 -0
  176. hikyuu/gui/data/ImportPytdxTimeToH5Task.py +94 -0
  177. hikyuu/gui/data/ImportPytdxToH5Task.py +98 -0
  178. hikyuu/gui/data/ImportPytdxTransToH5Task.py +94 -0
  179. hikyuu/gui/data/ImportTdxToH5Task.py +111 -0
  180. hikyuu/gui/data/ImportWeightToSqliteTask.py +114 -0
  181. hikyuu/gui/data/ImportZhBond10Task.py +48 -0
  182. hikyuu/gui/data/MainWindow.py +807 -0
  183. hikyuu/gui/data/SchedImportThread.py +62 -0
  184. hikyuu/gui/data/UsePytdxImportToH5Thread.py +371 -0
  185. hikyuu/gui/data/UseTdxImportToH5Thread.py +182 -0
  186. hikyuu/gui/data/__init__.py +1 -0
  187. hikyuu/gui/data/tool.py +43 -0
  188. hikyuu/gui/hikyuu.ico +0 -0
  189. hikyuu/gui/importdata.py +166 -0
  190. hikyuu/gui/spot_server.py +336 -0
  191. hikyuu/gui/start_huatai_insight.py +510 -0
  192. hikyuu/gui/start_qmt.py +122 -0
  193. hikyuu/hub.py +634 -0
  194. hikyuu/include/__init__.py +1 -0
  195. hikyuu/include/hikyuu/Block.h +173 -0
  196. hikyuu/include/hikyuu/DataType.h +171 -0
  197. hikyuu/include/hikyuu/GlobalInitializer.h +46 -0
  198. hikyuu/include/hikyuu/HistoryFinanceInfo.h +35 -0
  199. hikyuu/include/hikyuu/KData.h +271 -0
  200. hikyuu/include/hikyuu/KDataImp.h +94 -0
  201. hikyuu/include/hikyuu/KQuery.h +275 -0
  202. hikyuu/include/hikyuu/KRecord.h +94 -0
  203. hikyuu/include/hikyuu/MarketInfo.h +132 -0
  204. hikyuu/include/hikyuu/Stock.h +351 -0
  205. hikyuu/include/hikyuu/StockManager.h +361 -0
  206. hikyuu/include/hikyuu/StockMapIterator.h +72 -0
  207. hikyuu/include/hikyuu/StockTypeInfo.h +127 -0
  208. hikyuu/include/hikyuu/StockWeight.h +148 -0
  209. hikyuu/include/hikyuu/StrategyContext.h +107 -0
  210. hikyuu/include/hikyuu/TimeLineRecord.h +71 -0
  211. hikyuu/include/hikyuu/TransRecord.h +79 -0
  212. hikyuu/include/hikyuu/ZhBond10.h +36 -0
  213. hikyuu/include/hikyuu/__init__.py +1 -0
  214. hikyuu/include/hikyuu/analysis/__init__.py +1 -0
  215. hikyuu/include/hikyuu/analysis/analysis_sys.h +76 -0
  216. hikyuu/include/hikyuu/analysis/combinate.h +115 -0
  217. hikyuu/include/hikyuu/config.h +48 -0
  218. hikyuu/include/hikyuu/data_driver/BaseInfoDriver.h +201 -0
  219. hikyuu/include/hikyuu/data_driver/BlockInfoDriver.h +94 -0
  220. hikyuu/include/hikyuu/data_driver/DataDriverFactory.h +58 -0
  221. hikyuu/include/hikyuu/data_driver/DriverConnectPool.h +146 -0
  222. hikyuu/include/hikyuu/data_driver/HistoryFinanceReader.h +36 -0
  223. hikyuu/include/hikyuu/data_driver/KDataDriver.h +194 -0
  224. hikyuu/include/hikyuu/data_driver/__init__.py +1 -0
  225. hikyuu/include/hikyuu/data_driver/base_info/__init__.py +1 -0
  226. hikyuu/include/hikyuu/data_driver/base_info/mysql/MySQLBaseInfoDriver.h +54 -0
  227. hikyuu/include/hikyuu/data_driver/base_info/mysql/__init__.py +1 -0
  228. hikyuu/include/hikyuu/data_driver/base_info/sqlite/SQLiteBaseInfoDriver.h +50 -0
  229. hikyuu/include/hikyuu/data_driver/base_info/sqlite/__init__.py +1 -0
  230. hikyuu/include/hikyuu/data_driver/base_info/table/HistoryFinanceFieldTable.h +19 -0
  231. hikyuu/include/hikyuu/data_driver/base_info/table/HistoryFinanceTable.h +23 -0
  232. hikyuu/include/hikyuu/data_driver/base_info/table/HolidayTable.h +29 -0
  233. hikyuu/include/hikyuu/data_driver/base_info/table/MarketInfoTable.h +127 -0
  234. hikyuu/include/hikyuu/data_driver/base_info/table/StockTable.h +64 -0
  235. hikyuu/include/hikyuu/data_driver/base_info/table/StockTypeInfoTable.h +108 -0
  236. hikyuu/include/hikyuu/data_driver/base_info/table/StockWeightTable.h +52 -0
  237. hikyuu/include/hikyuu/data_driver/base_info/table/ZhBond10Table.h +20 -0
  238. hikyuu/include/hikyuu/data_driver/base_info/table/__init__.py +1 -0
  239. hikyuu/include/hikyuu/data_driver/block_info/__init__.py +1 -0
  240. hikyuu/include/hikyuu/data_driver/block_info/mysql/MySQLBlockInfoDriver.h +29 -0
  241. hikyuu/include/hikyuu/data_driver/block_info/mysql/__init__.py +1 -0
  242. hikyuu/include/hikyuu/data_driver/block_info/qianlong/QLBlockInfoDriver.h +29 -0
  243. hikyuu/include/hikyuu/data_driver/block_info/qianlong/__init__.py +1 -0
  244. hikyuu/include/hikyuu/data_driver/block_info/sqlite/SQLiteBlockInfoDriver.h +29 -0
  245. hikyuu/include/hikyuu/data_driver/block_info/sqlite/__init__.py +1 -0
  246. hikyuu/include/hikyuu/data_driver/kdata/DoNothingKDataDriver.h +33 -0
  247. hikyuu/include/hikyuu/data_driver/kdata/__init__.py +1 -0
  248. hikyuu/include/hikyuu/data_driver/kdata/cvs/KDataTempCsvDriver.h +106 -0
  249. hikyuu/include/hikyuu/data_driver/kdata/cvs/__init__.py +1 -0
  250. hikyuu/include/hikyuu/data_driver/kdata/hdf5/H5KDataDriver.h +89 -0
  251. hikyuu/include/hikyuu/data_driver/kdata/hdf5/H5Record.h +50 -0
  252. hikyuu/include/hikyuu/data_driver/kdata/hdf5/__init__.py +1 -0
  253. hikyuu/include/hikyuu/data_driver/kdata/mysql/KRecordTable.h +124 -0
  254. hikyuu/include/hikyuu/data_driver/kdata/mysql/MySQLKDataDriver.h +78 -0
  255. hikyuu/include/hikyuu/data_driver/kdata/mysql/__init__.py +1 -0
  256. hikyuu/include/hikyuu/data_driver/kdata/sqlite/SQLiteKDataDriver.h +62 -0
  257. hikyuu/include/hikyuu/data_driver/kdata/sqlite/__init__.py +1 -0
  258. hikyuu/include/hikyuu/data_driver/kdata/tdx/TdxKDataDriver.h +63 -0
  259. hikyuu/include/hikyuu/data_driver/kdata/tdx/__init__.py +1 -0
  260. hikyuu/include/hikyuu/debug.h +32 -0
  261. hikyuu/include/hikyuu/doc.h +166 -0
  262. hikyuu/include/hikyuu/global/GlobalSpotAgent.h +33 -0
  263. hikyuu/include/hikyuu/global/SpotRecord.h +52 -0
  264. hikyuu/include/hikyuu/global/__init__.py +1 -0
  265. hikyuu/include/hikyuu/global/agent/SpotAgent.h +143 -0
  266. hikyuu/include/hikyuu/global/agent/__init__.py +1 -0
  267. hikyuu/include/hikyuu/global/agent/hikyuu/__init__.py +1 -0
  268. hikyuu/include/hikyuu/global/agent/hikyuu/flat/__init__.py +1 -0
  269. hikyuu/include/hikyuu/global/agent/spot_generated.h +527 -0
  270. hikyuu/include/hikyuu/global/schedule/__init__.py +1 -0
  271. hikyuu/include/hikyuu/global/schedule/inner_tasks.h +16 -0
  272. hikyuu/include/hikyuu/global/schedule/scheduler.h +24 -0
  273. hikyuu/include/hikyuu/global/sysinfo.h +67 -0
  274. hikyuu/include/hikyuu/hikyuu.h +55 -0
  275. hikyuu/include/hikyuu/indicator/IndParam.h +39 -0
  276. hikyuu/include/hikyuu/indicator/Indicator.h +403 -0
  277. hikyuu/include/hikyuu/indicator/IndicatorImp.h +413 -0
  278. hikyuu/include/hikyuu/indicator/__init__.py +1 -0
  279. hikyuu/include/hikyuu/indicator/build_in.h +114 -0
  280. hikyuu/include/hikyuu/indicator/crt/ABS.h +34 -0
  281. hikyuu/include/hikyuu/indicator/crt/ACOS.h +36 -0
  282. hikyuu/include/hikyuu/indicator/crt/AD.h +28 -0
  283. hikyuu/include/hikyuu/indicator/crt/ADVANCE.h +32 -0
  284. hikyuu/include/hikyuu/indicator/crt/ALIGN.h +42 -0
  285. hikyuu/include/hikyuu/indicator/crt/AMA.h +113 -0
  286. hikyuu/include/hikyuu/indicator/crt/ASIN.h +36 -0
  287. hikyuu/include/hikyuu/indicator/crt/ATAN.h +36 -0
  288. hikyuu/include/hikyuu/indicator/crt/ATR.h +44 -0
  289. hikyuu/include/hikyuu/indicator/crt/AVEDEV.h +45 -0
  290. hikyuu/include/hikyuu/indicator/crt/BACKSET.h +44 -0
  291. hikyuu/include/hikyuu/indicator/crt/BARSCOUNT.h +37 -0
  292. hikyuu/include/hikyuu/indicator/crt/BARSLAST.h +41 -0
  293. hikyuu/include/hikyuu/indicator/crt/BARSSINCE.h +41 -0
  294. hikyuu/include/hikyuu/indicator/crt/BETWEEN.h +85 -0
  295. hikyuu/include/hikyuu/indicator/crt/BLOCKSETNUM.h +23 -0
  296. hikyuu/include/hikyuu/indicator/crt/CEILING.h +38 -0
  297. hikyuu/include/hikyuu/indicator/crt/CORR.h +24 -0
  298. hikyuu/include/hikyuu/indicator/crt/COS.h +36 -0
  299. hikyuu/include/hikyuu/indicator/crt/COST.h +34 -0
  300. hikyuu/include/hikyuu/indicator/crt/COUNT.h +54 -0
  301. hikyuu/include/hikyuu/indicator/crt/CROSS.h +48 -0
  302. hikyuu/include/hikyuu/indicator/crt/CVAL.h +35 -0
  303. hikyuu/include/hikyuu/indicator/crt/DECLINE.h +32 -0
  304. hikyuu/include/hikyuu/indicator/crt/DEVSQ.h +40 -0
  305. hikyuu/include/hikyuu/indicator/crt/DIFF.h +31 -0
  306. hikyuu/include/hikyuu/indicator/crt/DMA.h +34 -0
  307. hikyuu/include/hikyuu/indicator/crt/DOWNNDAY.h +43 -0
  308. hikyuu/include/hikyuu/indicator/crt/DROPNA.h +31 -0
  309. hikyuu/include/hikyuu/indicator/crt/EMA.h +44 -0
  310. hikyuu/include/hikyuu/indicator/crt/EVERY.h +44 -0
  311. hikyuu/include/hikyuu/indicator/crt/EXIST.h +44 -0
  312. hikyuu/include/hikyuu/indicator/crt/EXP.h +34 -0
  313. hikyuu/include/hikyuu/indicator/crt/FILTER.h +44 -0
  314. hikyuu/include/hikyuu/indicator/crt/FINANCE.h +20 -0
  315. hikyuu/include/hikyuu/indicator/crt/FLOOR.h +38 -0
  316. hikyuu/include/hikyuu/indicator/crt/HHV.h +44 -0
  317. hikyuu/include/hikyuu/indicator/crt/HHVBARS.h +44 -0
  318. hikyuu/include/hikyuu/indicator/crt/HSL.h +39 -0
  319. hikyuu/include/hikyuu/indicator/crt/IC.h +41 -0
  320. hikyuu/include/hikyuu/indicator/crt/ICIR.h +51 -0
  321. hikyuu/include/hikyuu/indicator/crt/INSUM.h +33 -0
  322. hikyuu/include/hikyuu/indicator/crt/INTPART.h +38 -0
  323. hikyuu/include/hikyuu/indicator/crt/IR.h +44 -0
  324. hikyuu/include/hikyuu/indicator/crt/KDATA.h +72 -0
  325. hikyuu/include/hikyuu/indicator/crt/LAST.h +100 -0
  326. hikyuu/include/hikyuu/indicator/crt/LIUTONGPAN.h +23 -0
  327. hikyuu/include/hikyuu/indicator/crt/LLV.h +46 -0
  328. hikyuu/include/hikyuu/indicator/crt/LLVBARS.h +44 -0
  329. hikyuu/include/hikyuu/indicator/crt/LN.h +36 -0
  330. hikyuu/include/hikyuu/indicator/crt/LOG.h +35 -0
  331. hikyuu/include/hikyuu/indicator/crt/LONGCROSS.h +68 -0
  332. hikyuu/include/hikyuu/indicator/crt/MA.h +44 -0
  333. hikyuu/include/hikyuu/indicator/crt/MACD.h +62 -0
  334. hikyuu/include/hikyuu/indicator/crt/MAX.h +45 -0
  335. hikyuu/include/hikyuu/indicator/crt/MDD.h +29 -0
  336. hikyuu/include/hikyuu/indicator/crt/MIN.h +45 -0
  337. hikyuu/include/hikyuu/indicator/crt/MOD.h +49 -0
  338. hikyuu/include/hikyuu/indicator/crt/MRR.h +29 -0
  339. hikyuu/include/hikyuu/indicator/crt/NDAY.h +43 -0
  340. hikyuu/include/hikyuu/indicator/crt/NOT.h +35 -0
  341. hikyuu/include/hikyuu/indicator/crt/POS.h +21 -0
  342. hikyuu/include/hikyuu/indicator/crt/POW.h +48 -0
  343. hikyuu/include/hikyuu/indicator/crt/PRICELIST.h +59 -0
  344. hikyuu/include/hikyuu/indicator/crt/RECOVER.h +45 -0
  345. hikyuu/include/hikyuu/indicator/crt/REF.h +48 -0
  346. hikyuu/include/hikyuu/indicator/crt/RESULT.h +20 -0
  347. hikyuu/include/hikyuu/indicator/crt/REVERSE.h +36 -0
  348. hikyuu/include/hikyuu/indicator/crt/ROC.h +39 -0
  349. hikyuu/include/hikyuu/indicator/crt/ROCP.h +39 -0
  350. hikyuu/include/hikyuu/indicator/crt/ROCR.h +39 -0
  351. hikyuu/include/hikyuu/indicator/crt/ROCR100.h +39 -0
  352. hikyuu/include/hikyuu/indicator/crt/ROUND.h +36 -0
  353. hikyuu/include/hikyuu/indicator/crt/ROUNDDOWN.h +36 -0
  354. hikyuu/include/hikyuu/indicator/crt/ROUNDUP.h +36 -0
  355. hikyuu/include/hikyuu/indicator/crt/RSI.h +43 -0
  356. hikyuu/include/hikyuu/indicator/crt/SAFTYLOSS.h +79 -0
  357. hikyuu/include/hikyuu/indicator/crt/SGN.h +34 -0
  358. hikyuu/include/hikyuu/indicator/crt/SIN.h +36 -0
  359. hikyuu/include/hikyuu/indicator/crt/SLICE.h +44 -0
  360. hikyuu/include/hikyuu/indicator/crt/SLOPE.h +44 -0
  361. hikyuu/include/hikyuu/indicator/crt/SMA.h +72 -0
  362. hikyuu/include/hikyuu/indicator/crt/SPEARMAN.h +23 -0
  363. hikyuu/include/hikyuu/indicator/crt/SQRT.h +41 -0
  364. hikyuu/include/hikyuu/indicator/crt/STDEV.h +44 -0
  365. hikyuu/include/hikyuu/indicator/crt/STDP.h +38 -0
  366. hikyuu/include/hikyuu/indicator/crt/SUM.h +44 -0
  367. hikyuu/include/hikyuu/indicator/crt/SUMBARS.h +44 -0
  368. hikyuu/include/hikyuu/indicator/crt/TAN.h +36 -0
  369. hikyuu/include/hikyuu/indicator/crt/TIME.h +69 -0
  370. hikyuu/include/hikyuu/indicator/crt/TIMELINE.h +23 -0
  371. hikyuu/include/hikyuu/indicator/crt/TIMELINEVOL.h +21 -0
  372. hikyuu/include/hikyuu/indicator/crt/TURNOVER.h +21 -0
  373. hikyuu/include/hikyuu/indicator/crt/UPNDAY.h +43 -0
  374. hikyuu/include/hikyuu/indicator/crt/VAR.h +40 -0
  375. hikyuu/include/hikyuu/indicator/crt/VARP.h +40 -0
  376. hikyuu/include/hikyuu/indicator/crt/VIGOR.h +34 -0
  377. hikyuu/include/hikyuu/indicator/crt/ZHBOND10.h +27 -0
  378. hikyuu/include/hikyuu/indicator/crt/ZONGGUBEN.h +17 -0
  379. hikyuu/include/hikyuu/indicator/crt/ZSCORE.h +30 -0
  380. hikyuu/include/hikyuu/indicator/crt/__init__.py +1 -0
  381. hikyuu/include/hikyuu/indicator/imp/IAbs.h +26 -0
  382. hikyuu/include/hikyuu/indicator/imp/IAcos.h +28 -0
  383. hikyuu/include/hikyuu/indicator/imp/IAd.h +30 -0
  384. hikyuu/include/hikyuu/indicator/imp/IAdvance.h +29 -0
  385. hikyuu/include/hikyuu/indicator/imp/IAlign.h +28 -0
  386. hikyuu/include/hikyuu/indicator/imp/IAma.h +38 -0
  387. hikyuu/include/hikyuu/indicator/imp/IAsin.h +28 -0
  388. hikyuu/include/hikyuu/indicator/imp/IAtan.h +28 -0
  389. hikyuu/include/hikyuu/indicator/imp/IAtr.h +28 -0
  390. hikyuu/include/hikyuu/indicator/imp/IBackset.h +33 -0
  391. hikyuu/include/hikyuu/indicator/imp/IBarsCount.h +28 -0
  392. hikyuu/include/hikyuu/indicator/imp/IBarsLast.h +28 -0
  393. hikyuu/include/hikyuu/indicator/imp/IBarsSince.h +28 -0
  394. hikyuu/include/hikyuu/indicator/imp/IBlockSetNum.h +28 -0
  395. hikyuu/include/hikyuu/indicator/imp/ICeil.h +31 -0
  396. hikyuu/include/hikyuu/indicator/imp/ICorr.h +42 -0
  397. hikyuu/include/hikyuu/indicator/imp/ICos.h +28 -0
  398. hikyuu/include/hikyuu/indicator/imp/ICount.h +32 -0
  399. hikyuu/include/hikyuu/indicator/imp/ICval.h +29 -0
  400. hikyuu/include/hikyuu/indicator/imp/IDecline.h +29 -0
  401. hikyuu/include/hikyuu/indicator/imp/IDevsq.h +29 -0
  402. hikyuu/include/hikyuu/indicator/imp/IDiff.h +29 -0
  403. hikyuu/include/hikyuu/indicator/imp/IDma.h +47 -0
  404. hikyuu/include/hikyuu/indicator/imp/IDropna.h +28 -0
  405. hikyuu/include/hikyuu/indicator/imp/IEma.h +29 -0
  406. hikyuu/include/hikyuu/indicator/imp/IEvery.h +32 -0
  407. hikyuu/include/hikyuu/indicator/imp/IExist.h +32 -0
  408. hikyuu/include/hikyuu/indicator/imp/IExp.h +28 -0
  409. hikyuu/include/hikyuu/indicator/imp/IFilter.h +34 -0
  410. hikyuu/include/hikyuu/indicator/imp/IFinance.h +25 -0
  411. hikyuu/include/hikyuu/indicator/imp/IFloor.h +31 -0
  412. hikyuu/include/hikyuu/indicator/imp/IHhvbars.h +29 -0
  413. hikyuu/include/hikyuu/indicator/imp/IHighLine.h +34 -0
  414. hikyuu/include/hikyuu/indicator/imp/IIc.h +45 -0
  415. hikyuu/include/hikyuu/indicator/imp/IInSum.h +28 -0
  416. hikyuu/include/hikyuu/indicator/imp/IIntpart.h +31 -0
  417. hikyuu/include/hikyuu/indicator/imp/IKData.h +29 -0
  418. hikyuu/include/hikyuu/indicator/imp/ILiuTongPan.h +29 -0
  419. hikyuu/include/hikyuu/indicator/imp/ILn.h +28 -0
  420. hikyuu/include/hikyuu/indicator/imp/ILog.h +28 -0
  421. hikyuu/include/hikyuu/indicator/imp/ILowLine.h +30 -0
  422. hikyuu/include/hikyuu/indicator/imp/ILowLineBars.h +29 -0
  423. hikyuu/include/hikyuu/indicator/imp/IMa.h +27 -0
  424. hikyuu/include/hikyuu/indicator/imp/IMacd.h +41 -0
  425. hikyuu/include/hikyuu/indicator/imp/IMdd.h +23 -0
  426. hikyuu/include/hikyuu/indicator/imp/IMrr.h +23 -0
  427. hikyuu/include/hikyuu/indicator/imp/INot.h +26 -0
  428. hikyuu/include/hikyuu/indicator/imp/IPow.h +32 -0
  429. hikyuu/include/hikyuu/indicator/imp/IPriceList.h +29 -0
  430. hikyuu/include/hikyuu/indicator/imp/IRecover.h +29 -0
  431. hikyuu/include/hikyuu/indicator/imp/IRef.h +34 -0
  432. hikyuu/include/hikyuu/indicator/imp/IResult.h +26 -0
  433. hikyuu/include/hikyuu/indicator/imp/IReverse.h +28 -0
  434. hikyuu/include/hikyuu/indicator/imp/IRoc.h +29 -0
  435. hikyuu/include/hikyuu/indicator/imp/IRocp.h +29 -0
  436. hikyuu/include/hikyuu/indicator/imp/IRocr.h +29 -0
  437. hikyuu/include/hikyuu/indicator/imp/IRocr100.h +29 -0
  438. hikyuu/include/hikyuu/indicator/imp/IRound.h +32 -0
  439. hikyuu/include/hikyuu/indicator/imp/IRoundDown.h +32 -0
  440. hikyuu/include/hikyuu/indicator/imp/IRoundUp.h +32 -0
  441. hikyuu/include/hikyuu/indicator/imp/ISaftyLoss.h +44 -0
  442. hikyuu/include/hikyuu/indicator/imp/ISign.h +28 -0
  443. hikyuu/include/hikyuu/indicator/imp/ISin.h +28 -0
  444. hikyuu/include/hikyuu/indicator/imp/ISlice.h +25 -0
  445. hikyuu/include/hikyuu/indicator/imp/ISlope.h +25 -0
  446. hikyuu/include/hikyuu/indicator/imp/ISma.h +34 -0
  447. hikyuu/include/hikyuu/indicator/imp/ISpearman.h +42 -0
  448. hikyuu/include/hikyuu/indicator/imp/ISqrt.h +31 -0
  449. hikyuu/include/hikyuu/indicator/imp/IStdev.h +31 -0
  450. hikyuu/include/hikyuu/indicator/imp/IStdp.h +33 -0
  451. hikyuu/include/hikyuu/indicator/imp/ISum.h +27 -0
  452. hikyuu/include/hikyuu/indicator/imp/ISumBars.h +30 -0
  453. hikyuu/include/hikyuu/indicator/imp/ITan.h +28 -0
  454. hikyuu/include/hikyuu/indicator/imp/ITime.h +33 -0
  455. hikyuu/include/hikyuu/indicator/imp/ITimeLine.h +32 -0
  456. hikyuu/include/hikyuu/indicator/imp/IVar.h +32 -0
  457. hikyuu/include/hikyuu/indicator/imp/IVarp.h +32 -0
  458. hikyuu/include/hikyuu/indicator/imp/IVigor.h +35 -0
  459. hikyuu/include/hikyuu/indicator/imp/IZScore.h +25 -0
  460. hikyuu/include/hikyuu/indicator/imp/IZhBond10.h +30 -0
  461. hikyuu/include/hikyuu/indicator/imp/IZongGuBen.h +25 -0
  462. hikyuu/include/hikyuu/indicator/imp/__init__.py +1 -0
  463. hikyuu/include/hikyuu/python/__init__.py +1 -0
  464. hikyuu/include/hikyuu/python/pickle_support.h +90 -0
  465. hikyuu/include/hikyuu/python/pybind_utils.h +103 -0
  466. hikyuu/include/hikyuu/serialization/Block_serialization.h +55 -0
  467. hikyuu/include/hikyuu/serialization/Datetime_serialization.h +40 -0
  468. hikyuu/include/hikyuu/serialization/KData_serialization.h +45 -0
  469. hikyuu/include/hikyuu/serialization/KQuery_serialization.h +79 -0
  470. hikyuu/include/hikyuu/serialization/KRecord_serialization.h +50 -0
  471. hikyuu/include/hikyuu/serialization/MarketInfo_serialization.h +68 -0
  472. hikyuu/include/hikyuu/serialization/PriceList_serialization.h +66 -0
  473. hikyuu/include/hikyuu/serialization/StockTypeInfo_serialization.h +62 -0
  474. hikyuu/include/hikyuu/serialization/StockWeight_serialization.h +65 -0
  475. hikyuu/include/hikyuu/serialization/Stock_serialization.h +47 -0
  476. hikyuu/include/hikyuu/serialization/TimeDelta_serialization.h +44 -0
  477. hikyuu/include/hikyuu/serialization/TimeLineRecord_serialization.h +42 -0
  478. hikyuu/include/hikyuu/serialization/TransRecord_serialization.h +44 -0
  479. hikyuu/include/hikyuu/serialization/__init__.py +1 -0
  480. hikyuu/include/hikyuu/serialization/all.h +26 -0
  481. hikyuu/include/hikyuu/strategy/BrokerTradeManager.h +433 -0
  482. hikyuu/include/hikyuu/strategy/RunPortfolioInStrategy.h +37 -0
  483. hikyuu/include/hikyuu/strategy/RunSystemInStrategy.h +38 -0
  484. hikyuu/include/hikyuu/strategy/Strategy.h +191 -0
  485. hikyuu/include/hikyuu/strategy/__init__.py +1 -0
  486. hikyuu/include/hikyuu/trade_manage/BorrowRecord.h +91 -0
  487. hikyuu/include/hikyuu/trade_manage/CostRecord.h +67 -0
  488. hikyuu/include/hikyuu/trade_manage/FundsRecord.h +110 -0
  489. hikyuu/include/hikyuu/trade_manage/LoanRecord.h +64 -0
  490. hikyuu/include/hikyuu/trade_manage/OrderBrokerBase.h +182 -0
  491. hikyuu/include/hikyuu/trade_manage/Performance.h +80 -0
  492. hikyuu/include/hikyuu/trade_manage/PositionRecord.h +108 -0
  493. hikyuu/include/hikyuu/trade_manage/TradeCostBase.h +174 -0
  494. hikyuu/include/hikyuu/trade_manage/TradeManager.h +487 -0
  495. hikyuu/include/hikyuu/trade_manage/TradeManagerBase.h +782 -0
  496. hikyuu/include/hikyuu/trade_manage/TradeRecord.h +151 -0
  497. hikyuu/include/hikyuu/trade_manage/__init__.py +1 -0
  498. hikyuu/include/hikyuu/trade_manage/build_in.h +19 -0
  499. hikyuu/include/hikyuu/trade_manage/crt/TC_FixedA.h +45 -0
  500. hikyuu/include/hikyuu/trade_manage/crt/TC_FixedA2015.h +43 -0
  501. hikyuu/include/hikyuu/trade_manage/crt/TC_FixedA2017.h +44 -0
  502. hikyuu/include/hikyuu/trade_manage/crt/TC_TestStub.h +21 -0
  503. hikyuu/include/hikyuu/trade_manage/crt/TC_Zero.h +25 -0
  504. hikyuu/include/hikyuu/trade_manage/crt/__init__.py +1 -0
  505. hikyuu/include/hikyuu/trade_manage/crt/crtTM.h +33 -0
  506. hikyuu/include/hikyuu/trade_manage/imp/FixedA2015TradeCost.h +53 -0
  507. hikyuu/include/hikyuu/trade_manage/imp/FixedA2017TradeCost.h +56 -0
  508. hikyuu/include/hikyuu/trade_manage/imp/FixedATradeCost.h +88 -0
  509. hikyuu/include/hikyuu/trade_manage/imp/TradeCostStub.h +48 -0
  510. hikyuu/include/hikyuu/trade_manage/imp/ZeroTradeCost.h +50 -0
  511. hikyuu/include/hikyuu/trade_manage/imp/__init__.py +1 -0
  512. hikyuu/include/hikyuu/trade_sys/__init__.py +1 -0
  513. hikyuu/include/hikyuu/trade_sys/all.h +24 -0
  514. hikyuu/include/hikyuu/trade_sys/allocatefunds/AllocateFundsBase.h +229 -0
  515. hikyuu/include/hikyuu/trade_sys/allocatefunds/__init__.py +1 -0
  516. hikyuu/include/hikyuu/trade_sys/allocatefunds/build_in.h +16 -0
  517. hikyuu/include/hikyuu/trade_sys/allocatefunds/crt/AF_EqualWeight.h +25 -0
  518. hikyuu/include/hikyuu/trade_sys/allocatefunds/crt/AF_FixedWeight.h +26 -0
  519. hikyuu/include/hikyuu/trade_sys/allocatefunds/crt/AF_MultiFactor.h +21 -0
  520. hikyuu/include/hikyuu/trade_sys/allocatefunds/crt/__init__.py +1 -0
  521. hikyuu/include/hikyuu/trade_sys/allocatefunds/imp/EqualWeightAllocateFunds.h +27 -0
  522. hikyuu/include/hikyuu/trade_sys/allocatefunds/imp/FixedWeightAllocateFunds.h +28 -0
  523. hikyuu/include/hikyuu/trade_sys/allocatefunds/imp/MultiFactorAllocaterFunds.h +23 -0
  524. hikyuu/include/hikyuu/trade_sys/allocatefunds/imp/__init__.py +1 -0
  525. hikyuu/include/hikyuu/trade_sys/condition/ConditionBase.h +241 -0
  526. hikyuu/include/hikyuu/trade_sys/condition/__init__.py +1 -0
  527. hikyuu/include/hikyuu/trade_sys/condition/build_in.h +17 -0
  528. hikyuu/include/hikyuu/trade_sys/condition/crt/CN_Bool.h +22 -0
  529. hikyuu/include/hikyuu/trade_sys/condition/crt/CN_Logic.h +35 -0
  530. hikyuu/include/hikyuu/trade_sys/condition/crt/CN_Manual.h +20 -0
  531. hikyuu/include/hikyuu/trade_sys/condition/crt/CN_OPLine.h +26 -0
  532. hikyuu/include/hikyuu/trade_sys/condition/crt/__init__.py +1 -0
  533. hikyuu/include/hikyuu/trade_sys/condition/imp/BoolCondition.h +40 -0
  534. hikyuu/include/hikyuu/trade_sys/condition/imp/ManualCondition.h +23 -0
  535. hikyuu/include/hikyuu/trade_sys/condition/imp/OPLineCondition.h +44 -0
  536. hikyuu/include/hikyuu/trade_sys/condition/imp/SubCondition.h +42 -0
  537. hikyuu/include/hikyuu/trade_sys/condition/imp/__init__.py +1 -0
  538. hikyuu/include/hikyuu/trade_sys/condition/imp/logic/AddCondition.h +42 -0
  539. hikyuu/include/hikyuu/trade_sys/condition/imp/logic/AndCondition.h +42 -0
  540. hikyuu/include/hikyuu/trade_sys/condition/imp/logic/DivCondition.h +42 -0
  541. hikyuu/include/hikyuu/trade_sys/condition/imp/logic/MultiCondition.h +42 -0
  542. hikyuu/include/hikyuu/trade_sys/condition/imp/logic/OrCondition.h +42 -0
  543. hikyuu/include/hikyuu/trade_sys/condition/imp/logic/__init__.py +1 -0
  544. hikyuu/include/hikyuu/trade_sys/environment/EnvironmentBase.h +178 -0
  545. hikyuu/include/hikyuu/trade_sys/environment/__init__.py +1 -0
  546. hikyuu/include/hikyuu/trade_sys/environment/build_in.h +16 -0
  547. hikyuu/include/hikyuu/trade_sys/environment/crt/EV_Bool.h +23 -0
  548. hikyuu/include/hikyuu/trade_sys/environment/crt/EV_Manual.h +20 -0
  549. hikyuu/include/hikyuu/trade_sys/environment/crt/EV_TwoLine.h +28 -0
  550. hikyuu/include/hikyuu/trade_sys/environment/crt/__init__.py +1 -0
  551. hikyuu/include/hikyuu/trade_sys/environment/imp/BoolEnvironment.h +41 -0
  552. hikyuu/include/hikyuu/trade_sys/environment/imp/ManualEnvironment.h +23 -0
  553. hikyuu/include/hikyuu/trade_sys/environment/imp/TwoLineEnvironment.h +47 -0
  554. hikyuu/include/hikyuu/trade_sys/environment/imp/__init__.py +1 -0
  555. hikyuu/include/hikyuu/trade_sys/moneymanager/MoneyManagerBase.h +230 -0
  556. hikyuu/include/hikyuu/trade_sys/moneymanager/__init__.py +1 -0
  557. hikyuu/include/hikyuu/trade_sys/moneymanager/build_in.h +20 -0
  558. hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedCapital.h +20 -0
  559. hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedCount.h +28 -0
  560. hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedPercent.h +27 -0
  561. hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedRisk.h +20 -0
  562. hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_FixedUnits.h +20 -0
  563. hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_Nothing.h +24 -0
  564. hikyuu/include/hikyuu/trade_sys/moneymanager/crt/MM_WilliamsFixedRisk.h +20 -0
  565. hikyuu/include/hikyuu/trade_sys/moneymanager/crt/__init__.py +1 -0
  566. hikyuu/include/hikyuu/trade_sys/moneymanager/imp/FixedCapitalMoneyManager.h +28 -0
  567. hikyuu/include/hikyuu/trade_sys/moneymanager/imp/FixedCountMoneyManager.h +38 -0
  568. hikyuu/include/hikyuu/trade_sys/moneymanager/imp/FixedPercentMoneyManager.h +34 -0
  569. hikyuu/include/hikyuu/trade_sys/moneymanager/imp/FixedRiskMoneyManager.h +28 -0
  570. hikyuu/include/hikyuu/trade_sys/moneymanager/imp/FixedUnitsMoneyManager.h +28 -0
  571. hikyuu/include/hikyuu/trade_sys/moneymanager/imp/NotMoneyManager.h +30 -0
  572. hikyuu/include/hikyuu/trade_sys/moneymanager/imp/WilliamsFixedRiskMoneyManager.h +28 -0
  573. hikyuu/include/hikyuu/trade_sys/moneymanager/imp/__init__.py +1 -0
  574. hikyuu/include/hikyuu/trade_sys/multifactor/MultiFactorBase.h +275 -0
  575. hikyuu/include/hikyuu/trade_sys/multifactor/ScoreRecord.h +51 -0
  576. hikyuu/include/hikyuu/trade_sys/multifactor/__init__.py +1 -0
  577. hikyuu/include/hikyuu/trade_sys/multifactor/build_in.h +12 -0
  578. hikyuu/include/hikyuu/trade_sys/multifactor/crt/MF_EqualWeight.h +29 -0
  579. hikyuu/include/hikyuu/trade_sys/multifactor/crt/MF_ICIRWeight.h +30 -0
  580. hikyuu/include/hikyuu/trade_sys/multifactor/crt/MF_ICWeight.h +30 -0
  581. hikyuu/include/hikyuu/trade_sys/multifactor/crt/__init__.py +1 -0
  582. hikyuu/include/hikyuu/trade_sys/multifactor/imp/EqualWeightMultiFactor.h +25 -0
  583. hikyuu/include/hikyuu/trade_sys/multifactor/imp/ICIRMultiFactor.h +27 -0
  584. hikyuu/include/hikyuu/trade_sys/multifactor/imp/ICMultiFactor.h +27 -0
  585. hikyuu/include/hikyuu/trade_sys/multifactor/imp/__init__.py +1 -0
  586. hikyuu/include/hikyuu/trade_sys/portfolio/Portfolio.h +256 -0
  587. hikyuu/include/hikyuu/trade_sys/portfolio/__init__.py +1 -0
  588. hikyuu/include/hikyuu/trade_sys/portfolio/build_in.h +14 -0
  589. hikyuu/include/hikyuu/trade_sys/portfolio/crt/PF_Simple.h +23 -0
  590. hikyuu/include/hikyuu/trade_sys/portfolio/crt/__init__.py +1 -0
  591. hikyuu/include/hikyuu/trade_sys/portfolio/imp/__init__.py +1 -0
  592. hikyuu/include/hikyuu/trade_sys/profitgoal/ProfitGoalBase.h +189 -0
  593. hikyuu/include/hikyuu/trade_sys/profitgoal/__init__.py +1 -0
  594. hikyuu/include/hikyuu/trade_sys/profitgoal/build_in.h +16 -0
  595. hikyuu/include/hikyuu/trade_sys/profitgoal/crt/PG_FixedHoldDays.h +26 -0
  596. hikyuu/include/hikyuu/trade_sys/profitgoal/crt/PG_FixedPercent.h +25 -0
  597. hikyuu/include/hikyuu/trade_sys/profitgoal/crt/PG_NoGoal.h +24 -0
  598. hikyuu/include/hikyuu/trade_sys/profitgoal/crt/__init__.py +1 -0
  599. hikyuu/include/hikyuu/trade_sys/profitgoal/imp/FixedHoldDays.h +29 -0
  600. hikyuu/include/hikyuu/trade_sys/profitgoal/imp/FixedPercentProfitGoal.h +28 -0
  601. hikyuu/include/hikyuu/trade_sys/profitgoal/imp/NoGoalProfitGoal.h +27 -0
  602. hikyuu/include/hikyuu/trade_sys/profitgoal/imp/__init__.py +1 -0
  603. hikyuu/include/hikyuu/trade_sys/selector/SelectorBase.h +245 -0
  604. hikyuu/include/hikyuu/trade_sys/selector/SystemWeight.h +70 -0
  605. hikyuu/include/hikyuu/trade_sys/selector/__init__.py +1 -0
  606. hikyuu/include/hikyuu/trade_sys/selector/build_in.h +18 -0
  607. hikyuu/include/hikyuu/trade_sys/selector/crt/SE_Fixed.h +38 -0
  608. hikyuu/include/hikyuu/trade_sys/selector/crt/SE_Logic.h +43 -0
  609. hikyuu/include/hikyuu/trade_sys/selector/crt/SE_MultiFactor.h +40 -0
  610. hikyuu/include/hikyuu/trade_sys/selector/crt/SE_Optimal.h +26 -0
  611. hikyuu/include/hikyuu/trade_sys/selector/crt/SE_Signal.h +30 -0
  612. hikyuu/include/hikyuu/trade_sys/selector/crt/__init__.py +1 -0
  613. hikyuu/include/hikyuu/trade_sys/selector/imp/FixedSelector.h +28 -0
  614. hikyuu/include/hikyuu/trade_sys/selector/imp/MultiFactorSelector.h +52 -0
  615. hikyuu/include/hikyuu/trade_sys/selector/imp/SignalSelector.h +30 -0
  616. hikyuu/include/hikyuu/trade_sys/selector/imp/__init__.py +1 -0
  617. hikyuu/include/hikyuu/trade_sys/selector/imp/logic/OperatorAddSelector.h +19 -0
  618. hikyuu/include/hikyuu/trade_sys/selector/imp/logic/OperatorAddValueSelector.h +19 -0
  619. hikyuu/include/hikyuu/trade_sys/selector/imp/logic/OperatorDivSelector.h +19 -0
  620. hikyuu/include/hikyuu/trade_sys/selector/imp/logic/OperatorDivValueSelector.h +19 -0
  621. hikyuu/include/hikyuu/trade_sys/selector/imp/logic/OperatorInvertDivValueSelector.h +19 -0
  622. hikyuu/include/hikyuu/trade_sys/selector/imp/logic/OperatorInvertSubValueSelector.h +19 -0
  623. hikyuu/include/hikyuu/trade_sys/selector/imp/logic/OperatorMulSelector.h +19 -0
  624. hikyuu/include/hikyuu/trade_sys/selector/imp/logic/OperatorMulValueSelector.h +19 -0
  625. hikyuu/include/hikyuu/trade_sys/selector/imp/logic/OperatorSelector.h +108 -0
  626. hikyuu/include/hikyuu/trade_sys/selector/imp/logic/OperatorSubSelector.h +19 -0
  627. hikyuu/include/hikyuu/trade_sys/selector/imp/logic/OperatorSubValueSelector.h +19 -0
  628. hikyuu/include/hikyuu/trade_sys/selector/imp/logic/OperatorValueSelector.h +94 -0
  629. hikyuu/include/hikyuu/trade_sys/selector/imp/logic/__init__.py +1 -0
  630. hikyuu/include/hikyuu/trade_sys/selector/imp/optimal/MaxFundsOptimalSelector.h +27 -0
  631. hikyuu/include/hikyuu/trade_sys/selector/imp/optimal/OptimalSelectorBase.h +86 -0
  632. hikyuu/include/hikyuu/trade_sys/selector/imp/optimal/PerformanceOptimalSelector.h +42 -0
  633. hikyuu/include/hikyuu/trade_sys/selector/imp/optimal/__init__.py +1 -0
  634. hikyuu/include/hikyuu/trade_sys/signal/SignalBase.h +249 -0
  635. hikyuu/include/hikyuu/trade_sys/signal/__init__.py +1 -0
  636. hikyuu/include/hikyuu/trade_sys/signal/build_in.h +22 -0
  637. hikyuu/include/hikyuu/trade_sys/signal/crt/SG_AllwaysBuy.h +20 -0
  638. hikyuu/include/hikyuu/trade_sys/signal/crt/SG_Band.h +37 -0
  639. hikyuu/include/hikyuu/trade_sys/signal/crt/SG_Bool.h +28 -0
  640. hikyuu/include/hikyuu/trade_sys/signal/crt/SG_Cross.h +28 -0
  641. hikyuu/include/hikyuu/trade_sys/signal/crt/SG_CrossGold.h +29 -0
  642. hikyuu/include/hikyuu/trade_sys/signal/crt/SG_Cycle.h +20 -0
  643. hikyuu/include/hikyuu/trade_sys/signal/crt/SG_Flex.h +29 -0
  644. hikyuu/include/hikyuu/trade_sys/signal/crt/SG_Manual.h +20 -0
  645. hikyuu/include/hikyuu/trade_sys/signal/crt/SG_Single.h +56 -0
  646. hikyuu/include/hikyuu/trade_sys/signal/crt/__init__.py +1 -0
  647. hikyuu/include/hikyuu/trade_sys/signal/imp/AllwaysBuySignal.h +25 -0
  648. hikyuu/include/hikyuu/trade_sys/signal/imp/BandSignal.h +46 -0
  649. hikyuu/include/hikyuu/trade_sys/signal/imp/BandSignal2.h +47 -0
  650. hikyuu/include/hikyuu/trade_sys/signal/imp/BoolSignal.h +46 -0
  651. hikyuu/include/hikyuu/trade_sys/signal/imp/CrossGoldSignal.h +46 -0
  652. hikyuu/include/hikyuu/trade_sys/signal/imp/CrossSignal.h +46 -0
  653. hikyuu/include/hikyuu/trade_sys/signal/imp/CycleSignal.h +25 -0
  654. hikyuu/include/hikyuu/trade_sys/signal/imp/ManualSignal.h +23 -0
  655. hikyuu/include/hikyuu/trade_sys/signal/imp/SingleSignal.h +45 -0
  656. hikyuu/include/hikyuu/trade_sys/signal/imp/SingleSignal2.h +45 -0
  657. hikyuu/include/hikyuu/trade_sys/signal/imp/__init__.py +1 -0
  658. hikyuu/include/hikyuu/trade_sys/slippage/SlippageBase.h +170 -0
  659. hikyuu/include/hikyuu/trade_sys/slippage/__init__.py +1 -0
  660. hikyuu/include/hikyuu/trade_sys/slippage/build_in.h +15 -0
  661. hikyuu/include/hikyuu/trade_sys/slippage/crt/SP_FixedPercent.h +26 -0
  662. hikyuu/include/hikyuu/trade_sys/slippage/crt/SP_FixedValue.h +26 -0
  663. hikyuu/include/hikyuu/trade_sys/slippage/crt/__init__.py +1 -0
  664. hikyuu/include/hikyuu/trade_sys/slippage/imp/FixedPercentSlippage.h +28 -0
  665. hikyuu/include/hikyuu/trade_sys/slippage/imp/FixedValueSlippage.h +28 -0
  666. hikyuu/include/hikyuu/trade_sys/slippage/imp/__init__.py +1 -0
  667. hikyuu/include/hikyuu/trade_sys/stoploss/StoplossBase.h +199 -0
  668. hikyuu/include/hikyuu/trade_sys/stoploss/__init__.py +1 -0
  669. hikyuu/include/hikyuu/trade_sys/stoploss/build_in.h +16 -0
  670. hikyuu/include/hikyuu/trade_sys/stoploss/crt/ST_FixedPercent.h +25 -0
  671. hikyuu/include/hikyuu/trade_sys/stoploss/crt/ST_Indicator.h +21 -0
  672. hikyuu/include/hikyuu/trade_sys/stoploss/crt/ST_Saftyloss.h +37 -0
  673. hikyuu/include/hikyuu/trade_sys/stoploss/crt/__init__.py +1 -0
  674. hikyuu/include/hikyuu/trade_sys/stoploss/imp/FixedPercentStoploss.h +30 -0
  675. hikyuu/include/hikyuu/trade_sys/stoploss/imp/IndicatorStoploss.h +50 -0
  676. hikyuu/include/hikyuu/trade_sys/stoploss/imp/__init__.py +1 -0
  677. hikyuu/include/hikyuu/trade_sys/system/System.h +639 -0
  678. hikyuu/include/hikyuu/trade_sys/system/SystemPart.h +54 -0
  679. hikyuu/include/hikyuu/trade_sys/system/TradeRequest.h +94 -0
  680. hikyuu/include/hikyuu/trade_sys/system/__init__.py +1 -0
  681. hikyuu/include/hikyuu/trade_sys/system/build_in.h +15 -0
  682. hikyuu/include/hikyuu/trade_sys/system/crt/SYS_Simple.h +50 -0
  683. hikyuu/include/hikyuu/trade_sys/system/crt/SYS_WalkForward.h +27 -0
  684. hikyuu/include/hikyuu/trade_sys/system/crt/__init__.py +1 -0
  685. hikyuu/include/hikyuu/trade_sys/system/imp/DelegateSystem.h +51 -0
  686. hikyuu/include/hikyuu/trade_sys/system/imp/WalkForwardSystem.h +70 -0
  687. hikyuu/include/hikyuu/trade_sys/system/imp/WalkForwardTradeManager.h +465 -0
  688. hikyuu/include/hikyuu/trade_sys/system/imp/__init__.py +1 -0
  689. hikyuu/include/hikyuu/utilities/ConnectPool.h +163 -0
  690. hikyuu/include/hikyuu/utilities/FilterNode.h +267 -0
  691. hikyuu/include/hikyuu/utilities/LRUCache11.h +230 -0
  692. hikyuu/include/hikyuu/utilities/Log.h +411 -0
  693. hikyuu/include/hikyuu/utilities/Null.h +143 -0
  694. hikyuu/include/hikyuu/utilities/Parameter.h +511 -0
  695. hikyuu/include/hikyuu/utilities/ResourcePool.h +636 -0
  696. hikyuu/include/hikyuu/utilities/SpendTimer.h +305 -0
  697. hikyuu/include/hikyuu/utilities/TimerManager.h +552 -0
  698. hikyuu/include/hikyuu/utilities/__init__.py +1 -0
  699. hikyuu/include/hikyuu/utilities/any_to_string.h +142 -0
  700. hikyuu/include/hikyuu/utilities/arithmetic.h +401 -0
  701. hikyuu/include/hikyuu/utilities/base64.h +52 -0
  702. hikyuu/include/hikyuu/utilities/config.h +41 -0
  703. hikyuu/include/hikyuu/utilities/cppdef.h +25 -0
  704. hikyuu/include/hikyuu/utilities/datetime/Datetime.h +438 -0
  705. hikyuu/include/hikyuu/utilities/datetime/TimeDelta.h +343 -0
  706. hikyuu/include/hikyuu/utilities/datetime/__init__.py +1 -0
  707. hikyuu/include/hikyuu/utilities/db_connect/AutoTransAction.h +124 -0
  708. hikyuu/include/hikyuu/utilities/db_connect/DBCondition.h +248 -0
  709. hikyuu/include/hikyuu/utilities/db_connect/DBConnect.h +30 -0
  710. hikyuu/include/hikyuu/utilities/db_connect/DBConnectBase.h +658 -0
  711. hikyuu/include/hikyuu/utilities/db_connect/DBUpgrade.h +28 -0
  712. hikyuu/include/hikyuu/utilities/db_connect/SQLException.h +62 -0
  713. hikyuu/include/hikyuu/utilities/db_connect/SQLResultSet.h +248 -0
  714. hikyuu/include/hikyuu/utilities/db_connect/SQLStatementBase.h +305 -0
  715. hikyuu/include/hikyuu/utilities/db_connect/TableMacro.h +2579 -0
  716. hikyuu/include/hikyuu/utilities/db_connect/__init__.py +1 -0
  717. hikyuu/include/hikyuu/utilities/db_connect/mysql/MySQLConnect.h +56 -0
  718. hikyuu/include/hikyuu/utilities/db_connect/mysql/MySQLStatement.h +87 -0
  719. hikyuu/include/hikyuu/utilities/db_connect/mysql/__init__.py +1 -0
  720. hikyuu/include/hikyuu/utilities/db_connect/sqlite/SQLiteConnect.h +89 -0
  721. hikyuu/include/hikyuu/utilities/db_connect/sqlite/SQLiteStatement.h +71 -0
  722. hikyuu/include/hikyuu/utilities/db_connect/sqlite/SQLiteUtil.h +80 -0
  723. hikyuu/include/hikyuu/utilities/db_connect/sqlite/__init__.py +1 -0
  724. hikyuu/include/hikyuu/utilities/exception.h +52 -0
  725. hikyuu/include/hikyuu/utilities/http_client/HttpClient.h +229 -0
  726. hikyuu/include/hikyuu/utilities/http_client/__init__.py +1 -0
  727. hikyuu/include/hikyuu/utilities/http_client/nng_wrap.h +517 -0
  728. hikyuu/include/hikyuu/utilities/http_client/url.h +25 -0
  729. hikyuu/include/hikyuu/utilities/ini_parser/IniParser.h +104 -0
  730. hikyuu/include/hikyuu/utilities/ini_parser/__init__.py +1 -0
  731. hikyuu/include/hikyuu/utilities/md5.h +41 -0
  732. hikyuu/include/hikyuu/utilities/mo/__init__.py +1 -0
  733. hikyuu/include/hikyuu/utilities/mo/mo.h +48 -0
  734. hikyuu/include/hikyuu/utilities/mo/moFileReader.h +836 -0
  735. hikyuu/include/hikyuu/utilities/node/NodeClient.h +175 -0
  736. hikyuu/include/hikyuu/utilities/node/NodeError.h +66 -0
  737. hikyuu/include/hikyuu/utilities/node/NodeMessage.h +80 -0
  738. hikyuu/include/hikyuu/utilities/node/NodeServer.h +246 -0
  739. hikyuu/include/hikyuu/utilities/node/__init__.py +1 -0
  740. hikyuu/include/hikyuu/utilities/os.h +102 -0
  741. hikyuu/include/hikyuu/utilities/osdef.h +159 -0
  742. hikyuu/include/hikyuu/utilities/runtimeinfo.h +35 -0
  743. hikyuu/include/hikyuu/utilities/snowflake.h +110 -0
  744. hikyuu/include/hikyuu/utilities/string_view.h +70 -0
  745. hikyuu/include/hikyuu/utilities/thread/FuncWrapper.h +85 -0
  746. hikyuu/include/hikyuu/utilities/thread/InterruptFlag.h +30 -0
  747. hikyuu/include/hikyuu/utilities/thread/MQStealQueue.h +112 -0
  748. hikyuu/include/hikyuu/utilities/thread/MQStealThreadPool.h +315 -0
  749. hikyuu/include/hikyuu/utilities/thread/MQThreadPool.h +275 -0
  750. hikyuu/include/hikyuu/utilities/thread/StealThreadPool.h +309 -0
  751. hikyuu/include/hikyuu/utilities/thread/ThreadPool.h +231 -0
  752. hikyuu/include/hikyuu/utilities/thread/ThreadSafeQueue.h +101 -0
  753. hikyuu/include/hikyuu/utilities/thread/WorkStealQueue.h +105 -0
  754. hikyuu/include/hikyuu/utilities/thread/__init__.py +1 -0
  755. hikyuu/include/hikyuu/utilities/thread/algorithm.h +110 -0
  756. hikyuu/include/hikyuu/utilities/thread/thread.h +10 -0
  757. hikyuu/include/hikyuu/version.h +24 -0
  758. hikyuu/indicator/__init__.py +29 -0
  759. hikyuu/indicator/indicator.py +157 -0
  760. hikyuu/indicator/pyind.py +47 -0
  761. hikyuu/indicator/talib_wrap.py +1264 -0
  762. hikyuu/interactive.py +331 -0
  763. hikyuu/setup.py +104 -0
  764. hikyuu/shell/__init__.py +0 -0
  765. hikyuu/shell/cmdserver.py +126 -0
  766. hikyuu/shell/hkucmd.py +110 -0
  767. hikyuu/shell/hkushell.py +20 -0
  768. hikyuu/sqlite3.dll +0 -0
  769. hikyuu/strategy/__init__.py +2 -0
  770. hikyuu/strategy/strategy_demo1.py +54 -0
  771. hikyuu/strategy/strategy_demo2.py +47 -0
  772. hikyuu/strategy/strategy_demo3.py +24 -0
  773. hikyuu/test/AllocateFunds.py +25 -0
  774. hikyuu/test/Condition.py +95 -0
  775. hikyuu/test/Datetime.py +61 -0
  776. hikyuu/test/Environment.py +88 -0
  777. hikyuu/test/Indicator.py +233 -0
  778. hikyuu/test/KData.py +64 -0
  779. hikyuu/test/MarketInfo.py +26 -0
  780. hikyuu/test/MoneyManager.py +88 -0
  781. hikyuu/test/Parameter.py +62 -0
  782. hikyuu/test/ProfitGoal.py +83 -0
  783. hikyuu/test/Signal.py +160 -0
  784. hikyuu/test/Slippage.py +88 -0
  785. hikyuu/test/Stock.py +127 -0
  786. hikyuu/test/StockTypeInfo.py +47 -0
  787. hikyuu/test/Stoploss.py +86 -0
  788. hikyuu/test/TradeCost.py +71 -0
  789. hikyuu/test/__init__.py +0 -0
  790. hikyuu/test/test.py +63 -0
  791. hikyuu/test/test_init.py +36 -0
  792. hikyuu/tools/__init__.py +1 -0
  793. hikyuu/tools/copy_file.py +16 -0
  794. hikyuu/tools/delete_index.py +50 -0
  795. hikyuu/tools/fenge.py +139 -0
  796. hikyuu/tools/h5_data_clear.py +163 -0
  797. hikyuu/tools/mysql_clear_last_day_data.py +61 -0
  798. hikyuu/tools/update_block_info.py +168 -0
  799. hikyuu/trade_manage/__init__.py +30 -0
  800. hikyuu/trade_manage/broker.py +95 -0
  801. hikyuu/trade_manage/broker_easytrader.py +63 -0
  802. hikyuu/trade_manage/broker_mail.py +101 -0
  803. hikyuu/trade_manage/trade.py +111 -0
  804. hikyuu/trade_sys/__init__.py +27 -0
  805. hikyuu/trade_sys/trade_sys.py +251 -0
  806. hikyuu/util/__init__.py +49 -0
  807. hikyuu/util/check.py +153 -0
  808. hikyuu/util/mylog.py +264 -0
  809. hikyuu/util/notebook.py +47 -0
  810. hikyuu/util/singleton.py +29 -0
  811. hikyuu/util/slice.py +43 -0
  812. hikyuu/util/timeout.py +83 -0
  813. hikyuu/vcruntime140.dll +0 -0
  814. hikyuu/vcruntime140_1.dll +0 -0
  815. hikyuu-2.2.2.dist-info/LICENSE +201 -0
  816. hikyuu-2.2.2.dist-info/METADATA +127 -0
  817. hikyuu-2.2.2.dist-info/RECORD +820 -0
  818. hikyuu-2.2.2.dist-info/WHEEL +5 -0
  819. hikyuu-2.2.2.dist-info/entry_points.txt +3 -0
  820. hikyuu-2.2.2.dist-info/top_level.txt +112 -0
@@ -0,0 +1,839 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ import os
4
+ import sys
5
+ import shutil
6
+ import logging
7
+ import datetime
8
+ import multiprocessing
9
+ from configparser import ConfigParser
10
+ from logging.handlers import QueueListener
11
+
12
+ # 优先加载,处理 VS 17.10 升级后依赖 dll 不兼容问题
13
+ import hikyuu
14
+
15
+ import PyQt5
16
+
17
+ from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox
18
+ from PyQt5.QtCore import pyqtSlot, QObject, pyqtSignal
19
+ from PyQt5.QtGui import QIcon, QTextCursor, QFont
20
+
21
+ import mysql.connector
22
+ from mysql.connector import errorcode
23
+ from mysql.connector.locales.eng import client_error # 此句仅为pyinstaller打包时能够自动引入
24
+
25
+ from hikyuu.gui.data.MainWindow import *
26
+ from hikyuu.gui.data.EscapetimeThread import EscapetimeThread
27
+ from hikyuu.gui.data.UseTdxImportToH5Thread import UseTdxImportToH5Thread
28
+ from hikyuu.gui.data.ImportTdxToH5Task import ImportTdxToH5Task
29
+ from hikyuu.gui.data.UsePytdxImportToH5Thread import UsePytdxImportToH5Thread
30
+ # from hikyuu.gui.data.CollectToMySQLThread import CollectToMySQLThread
31
+ # from hikyuu.gui.data.CollectToMemThread import CollectToMemThread
32
+ from hikyuu.gui.data.CollectSpotThread import CollectSpotThread
33
+ from hikyuu.gui.data.SchedImportThread import SchedImportThread
34
+ from hikyuu.gui.spot_server import release_nng_senders
35
+
36
+ from hikyuu import can_upgrade, get_last_version
37
+ from hikyuu.data import hku_config_template
38
+ from hikyuu.util import *
39
+
40
+
41
+ class EmittingStream(QObject):
42
+ """输出重定向至QT"""
43
+ textWritten = pyqtSignal(str)
44
+
45
+ def write(self, text):
46
+ self.textWritten.emit(str(text))
47
+
48
+ def flush(self):
49
+ pass
50
+
51
+
52
+ class MyMainWindow(QMainWindow, Ui_MainWindow):
53
+ def __init__(self, parent=None, capture_output=False, use_dark_style=False):
54
+ super(MyMainWindow, self).__init__(parent)
55
+ self._capture_output = capture_output # 捕获Python stdout 输出
56
+ self._use_dark_style = use_dark_style # 使用暗黑主题
57
+ self._text_color = '#FFFFFF' if use_dark_style else '#000000'
58
+ self.setupUi(self)
59
+ self.initUI()
60
+ self.initLogger()
61
+ self.initThreads()
62
+
63
+ def closeEvent(self, event):
64
+ if self.import_running:
65
+ QMessageBox.about(self, '提示', '正在执行导入任务,请耐心等候!')
66
+ event.ignore()
67
+ return
68
+
69
+ if self.sched_import_thread is not None and self.sched_import_thread.isRunning():
70
+ self.sched_import_thread.terminate()
71
+ self.collect_spot_thread.wait()
72
+
73
+ if self.collect_spot_thread is not None and self.collect_spot_thread.isRunning():
74
+ release_nng_senders()
75
+ self.collect_spot_thread.terminate()
76
+ self.collect_spot_thread.wait()
77
+
78
+ self.saveConfig()
79
+
80
+ if self.hdf5_import_thread:
81
+ self.hdf5_import_thread.stop()
82
+ if self.escape_time_thread:
83
+ self.escape_time_thread.stop()
84
+ if hasattr(self, 'mp_log_q_lisener'):
85
+ self.mp_log_q_lisener.stop()
86
+ event.accept()
87
+
88
+ def getUserConfigDir(self):
89
+ return os.path.expanduser('~') + '/.hikyuu'
90
+
91
+ def getHikyuuConfigFileName(self):
92
+ return self.getUserConfigDir() + '/hikyuu.ini'
93
+
94
+ def saveConfig(self):
95
+ if not os.path.lexists(self.getUserConfigDir()):
96
+ os.mkdir(self.getUserConfigDir())
97
+
98
+ current_config = self.getCurrentConfig()
99
+ filename = self.getUserConfigDir() + '/importdata-gui.ini'
100
+ with open(filename, 'w', encoding='utf-8') as f:
101
+ current_config.write(f)
102
+ filename = self.getHikyuuConfigFileName()
103
+ if current_config.getboolean('hdf5', 'enable', fallback=True):
104
+ data_dir = current_config['hdf5']['dir']
105
+ if not os.path.lexists(data_dir + '/tmp'):
106
+ os.mkdir(data_dir + '/tmp')
107
+ # 此处不能使用 utf-8 参数,否则导致Windows下getBlock无法找到板块分类
108
+ with open(filename, 'w', encoding='utf-8') as f:
109
+ f.write(
110
+ hku_config_template.hdf5_template.format(
111
+ dir=data_dir,
112
+ quotation_server=current_config.get(
113
+ 'collect', 'quotation_server', fallback='ipc:///tmp/hikyuu_real.ipc'),
114
+ day=current_config.getboolean('preload', 'day', fallback=True),
115
+ week=current_config.getboolean('preload', 'week', fallback=False),
116
+ month=current_config.getboolean('preload', 'month', fallback=False),
117
+ quarter=current_config.getboolean('preload', 'quarter', fallback=False),
118
+ halfyear=current_config.getboolean('preload', 'halfyear', fallback=False),
119
+ year=current_config.getboolean('preload', 'year', fallback=False),
120
+ min1=current_config.getboolean('preload', 'min', fallback=False),
121
+ min5=current_config.getboolean('preload', 'min5', fallback=False),
122
+ min15=current_config.getboolean('preload', 'min15', fallback=False),
123
+ min30=current_config.getboolean('preload', 'min30', fallback=False),
124
+ min60=current_config.getboolean('preload', 'min60', fallback=False),
125
+ hour2=current_config.getboolean('preload', 'hour2', fallback=False),
126
+ day_max=current_config.getint('preload', 'day_max', fallback=100000),
127
+ week_max=current_config.getint('preload', 'week_max', fallback=100000),
128
+ month_max=current_config.getint('preload', 'month_max', fallback=100000),
129
+ quarter_max=current_config.getint('preload', 'quarter_max', fallback=100000),
130
+ halfyear_max=current_config.getint('preload', 'halfyear_max', fallback=100000),
131
+ year_max=current_config.getint('preload', 'year_max', fallback=100000),
132
+ min1_max=current_config.getint('preload', 'min_max', fallback=4096),
133
+ min5_max=current_config.getint('preload', 'min5_max', fallback=4096),
134
+ min15_max=current_config.getint('preload', 'min15_max', fallback=4096),
135
+ min30_max=current_config.getint('preload', 'min30_max', fallback=4096),
136
+ min60_max=current_config.getint('preload', 'min60_max', fallback=4096),
137
+ hour2_max=current_config.getint('preload', 'hour2_max', fallback=4096),
138
+ )
139
+ )
140
+
141
+ else:
142
+ data_dir = current_config['mysql']['tmpdir']
143
+ with open(filename, 'w', encoding="utf-8") as f:
144
+ f.write(
145
+ hku_config_template.mysql_template.format(
146
+ dir=data_dir,
147
+ quotation_server=current_config.get(
148
+ 'collect', 'quotation_server', fallback='ipc:///tmp/hikyuu_real.ipc'),
149
+ host=current_config['mysql']['host'],
150
+ port=current_config['mysql']['port'],
151
+ usr=current_config['mysql']['usr'],
152
+ pwd=current_config['mysql']['pwd'],
153
+ day=current_config.getboolean('preload', 'day', fallback=True),
154
+ week=current_config.getboolean('preload', 'week', fallback=False),
155
+ month=current_config.getboolean('preload', 'month', fallback=False),
156
+ quarter=current_config.getboolean('preload', 'quarter', fallback=False),
157
+ halfyear=current_config.getboolean('preload', 'halfyear', fallback=False),
158
+ year=current_config.getboolean('preload', 'year', fallback=False),
159
+ min1=current_config.getboolean('preload', 'min', fallback=False),
160
+ min5=current_config.getboolean('preload', 'min5', fallback=False),
161
+ min15=current_config.getboolean('preload', 'min15', fallback=False),
162
+ min30=current_config.getboolean('preload', 'min30', fallback=False),
163
+ min60=current_config.getboolean('preload', 'min60', fallback=False),
164
+ hour2=current_config.getboolean('preload', 'hour2', fallback=False),
165
+ day_max=current_config.getint('preload', 'day_max', fallback=100000),
166
+ week_max=current_config.getint('preload', 'week_max', fallback=100000),
167
+ month_max=current_config.getint('preload', 'month_max', fallback=100000),
168
+ quarter_max=current_config.getint('preload', 'quarter_max', fallback=100000),
169
+ halfyear_max=current_config.getint('preload', 'halfyear_max', fallback=100000),
170
+ year_max=current_config.getint('preload', 'year_max', fallback=100000),
171
+ min1_max=current_config.getint('preload', 'min_max', fallback=4096),
172
+ min5_max=current_config.getint('preload', 'min5_max', fallback=4096),
173
+ min15_max=current_config.getint('preload', 'min15_max', fallback=4096),
174
+ min30_max=current_config.getint('preload', 'min30_max', fallback=4096),
175
+ min60_max=current_config.getint('preload', 'min60_max', fallback=4096),
176
+ hour2_max=current_config.getint('preload', 'hour2_max', fallback=4096),
177
+ )
178
+ )
179
+
180
+ if not os.path.lexists(data_dir):
181
+ os.makedirs(data_dir)
182
+
183
+ if not os.path.lexists(data_dir + '/block'):
184
+ current_dir = os.path.dirname(os.path.abspath(__file__))
185
+ dirname, _ = os.path.split(current_dir)
186
+ dirname = os.path.join(dirname, 'config/block')
187
+ shutil.copytree(dirname, data_dir + '/block')
188
+ os.remove(data_dir + '/block/__init__.py')
189
+
190
+ @pyqtSlot()
191
+ def on_save_pushButton_clicked(self):
192
+ try:
193
+ self.saveConfig()
194
+ QMessageBox.about(self, '', '保存成功')
195
+ except Exception as e:
196
+ QMessageBox.about(self, "错误", str(e))
197
+
198
+ def normalOutputWritten(self, text):
199
+ """普通打印信息重定向"""
200
+ if text.find('[DEBUG]') >= 0:
201
+ text = '<font color="#66CC99">{}</font>'.format(text)
202
+ elif text.find('[WARNING]') >= 0:
203
+ text = '<font color="#0000FF">{}</font>'.format(text)
204
+ elif text.find('[ERROR]') >= 0:
205
+ text = '<font color="#FF0000">{}</font>'.format(text)
206
+ elif text.find('[CRITICAL]') >= 0:
207
+ text = '<span style="background-color: #ff0000;">{}</span>'.format(text)
208
+ else:
209
+ # 主动加入<font>标签,避免 append 时多加入空行
210
+ text = '<font color="{}">{}</font>'.format(self._text_color, text)
211
+ cursor = self.log_textEdit.textCursor()
212
+ cursor.movePosition(QTextCursor.End)
213
+ self.log_textEdit.append(text)
214
+
215
+ def initLogger(self):
216
+ if not self._capture_output:
217
+ return
218
+
219
+ # 普通日志输出控制台
220
+ if self._stream is None:
221
+ self._stream = EmittingStream(textWritten=self.normalOutputWritten)
222
+ self.log_handler = logging.StreamHandler(self._stream)
223
+ FORMAT = logging.Formatter('%(asctime)-15s [%(levelname)s] - %(message)s [%(name)s::%(funcName)s]')
224
+ self.log_handler.setFormatter(FORMAT)
225
+ add_class_logger_handler(
226
+ [
227
+ MyMainWindow,
228
+ CollectSpotThread, # CollectToMySQLThread, CollectToMemThread,
229
+ UsePytdxImportToH5Thread,
230
+ UseTdxImportToH5Thread,
231
+ ImportTdxToH5Task,
232
+ SchedImportThread
233
+ ],
234
+ logging.INFO
235
+ )
236
+ for name in logging.Logger.manager.loggerDict.keys():
237
+ logger = logging.getLogger(name)
238
+ logger.addHandler(self.log_handler)
239
+ # logger.setLevel(logging.DEBUG)
240
+ logger.setLevel(logging.INFO)
241
+
242
+ # 多进程日志队列
243
+ self.mp_log_q = multiprocessing.Queue()
244
+ self.mp_log_q_lisener = QueueListener(self.mp_log_q, self.log_handler)
245
+ self.mp_log_q_lisener.start()
246
+
247
+ def initUI(self):
248
+ # 读取配置文件放在 output 重定向之前,防止配置文件读取失败没有提示
249
+ # 读取保存的配置文件信息,如果不存在,则使用默认配置
250
+ this_dir = self.getUserConfigDir()
251
+ import_config = ConfigParser()
252
+ if os.path.exists(this_dir + '/importdata-gui.ini'):
253
+ import_config.read(this_dir + '/importdata-gui.ini', encoding='utf-8')
254
+
255
+ self._is_sched_import_running = False
256
+ self._is_collect_running = False
257
+ self._stream = None
258
+ if self._capture_output:
259
+ self._stream = EmittingStream(textWritten=self.normalOutputWritten)
260
+ if self._stream is not None:
261
+ sys.stdout = self._stream
262
+ # python构建时丢失stderr通道,导致安装后的hikyuutdx执行时,
263
+ # logging总是报 'NoneType' object has no attribute 'write'
264
+ if sys.stderr:
265
+ sys.stderr = self._stream
266
+ self.log_textEdit.document().setMaximumBlockCount(1000)
267
+
268
+ current_dir = os.path.dirname(__file__)
269
+ self.setWindowIcon(QIcon("{}/hikyuu.ico".format(current_dir)))
270
+ self.import_detail_textEdit.clear()
271
+ self.reset_progress_bar()
272
+ self.day_start_dateEdit.setMinimumDate(datetime.date(1990, 12, 19))
273
+ self.day_start_dateEdit.setDate(datetime.date(1990, 12, 19))
274
+ today = datetime.date.today()
275
+ self.min_start_dateEdit.setDate(today - datetime.timedelta(90))
276
+ self.min5_start_dateEdit.setDate(today - datetime.timedelta(90))
277
+ self.min_start_dateEdit.setMinimumDate(datetime.date(1990, 12, 19))
278
+ self.min5_start_dateEdit.setMinimumDate(datetime.date(1990, 12, 19))
279
+ self.trans_start_dateEdit.setDate(today - datetime.timedelta(7))
280
+ self.time_start_dateEdit.setDate(today - datetime.timedelta(7))
281
+ self.trans_start_dateEdit.setMinimumDate(today - datetime.timedelta(90))
282
+ self.time_start_dateEdit.setMinimumDate(today - datetime.timedelta(300))
283
+ self.collect_status_label.setText("已停止")
284
+
285
+ # 初始化导入行情数据类型配置
286
+ self.import_stock_checkBox.setChecked(import_config.getboolean('quotation', 'stock', fallback=True))
287
+ self.import_fund_checkBox.setChecked(import_config.getboolean('quotation', 'fund', fallback=True))
288
+ self.import_future_checkBox.setChecked(import_config.getboolean('quotation', 'future', fallback=False))
289
+
290
+ # 初始化导入K线类型配置
291
+ self.import_day_checkBox.setChecked(import_config.getboolean('ktype', 'day', fallback=True))
292
+ self.import_min_checkBox.setChecked(import_config.getboolean('ktype', 'min', fallback=True))
293
+ self.import_min5_checkBox.setChecked(import_config.getboolean('ktype', 'min5', fallback=True))
294
+ self.import_trans_checkBox.setChecked(import_config.getboolean('ktype', 'trans', fallback=False))
295
+ self.import_time_checkBox.setChecked(import_config.getboolean('ktype', 'time', fallback=False))
296
+ # self.trans_max_days_spinBox.setValue(import_config.getint('ktype', 'trans_max_days', fallback=70))
297
+ # self.time_max_days_spinBox.setValue(import_config.getint('ktype', 'time_max_days', fallback=70))
298
+
299
+ # 初始化权息与财务数据设置
300
+ self.import_weight_checkBox.setChecked(import_config.getboolean('weight', 'enable', fallback=True))
301
+
302
+ # 初始化通道信目录配置
303
+ tdx_enable = import_config.getboolean('tdx', 'enable', fallback=False)
304
+ tdx_dir = import_config.get('tdx', 'dir', fallback='d:/TdxW_HuaTai')
305
+ self.tdx_radioButton.setChecked(tdx_enable)
306
+ self.tdx_dir_lineEdit.setEnabled(tdx_enable)
307
+ self.select_tdx_dir_pushButton.setEnabled(tdx_enable)
308
+ self.tdx_dir_lineEdit.setText(tdx_dir)
309
+
310
+ # 初始化pytdx配置及显示
311
+ self.pytdx_radioButton.setChecked(import_config.getboolean('pytdx', 'enable', fallback=True))
312
+ self.use_tdx_number_spinBox.setValue(import_config.getint('pytdx', 'use_tdx_number', fallback=10))
313
+
314
+ self.on_tdx_or_pytdx_toggled()
315
+
316
+ # 初始化hdf5设置
317
+ hdf5_enable = import_config.getboolean('hdf5', 'enable', fallback=True)
318
+ self.enable_hdf55_radioButton.setChecked(hdf5_enable)
319
+ hdf5_dir = import_config.get(
320
+ 'hdf5', 'dir', fallback="c:/stock" if sys.platform == "win32" else os.path.expanduser('~') + "/stock"
321
+ )
322
+ self.hdf5_dir_lineEdit.setText(hdf5_dir)
323
+ self.hdf5_dir_lineEdit.setEnabled(hdf5_enable)
324
+
325
+ # 初始化MYSQL设置
326
+ mysql_enable = import_config.getboolean('mysql', 'enable', fallback=False)
327
+ if hdf5_enable:
328
+ mysql_enable = False
329
+ self.enable_mysql_radioButton.setChecked(mysql_enable)
330
+ self.mysql_tmpdir_lineEdit.setText(import_config.get('mysql', 'tmpdir', fallback='c:/stock'))
331
+ mysql_ip = import_config.get('mysql', 'host', fallback='127.0.0.1')
332
+ self.mysql_ip_lineEdit.setText(mysql_ip)
333
+ self.mysql_ip_lineEdit.setEnabled(mysql_enable)
334
+ mysql_port = import_config.get('mysql', 'port', fallback='3306')
335
+ self.mysql_port_lineEdit.setText(mysql_port)
336
+ self.mysql_port_lineEdit.setEnabled(mysql_enable)
337
+ mysql_usr = import_config.get('mysql', 'usr', fallback='root')
338
+ self.mysql_usr_lineEdit.setText(mysql_usr)
339
+ self.mysql_usr_lineEdit.setEnabled(mysql_enable)
340
+ mysql_pwd = import_config.get('mysql', 'pwd', fallback='')
341
+ self.mysql_pwd_lineEdit.setText(mysql_pwd)
342
+ self.mysql_pwd_lineEdit.setEnabled(mysql_enable)
343
+ self.mysql_test_pushButton.setEnabled(mysql_enable)
344
+
345
+ self.sched_import_timeEdit.setTime(
346
+ datetime.time.fromisoformat(import_config.get('schec', 'time', fallback='18:00'))
347
+ )
348
+
349
+ # 初始化定时采集设置
350
+ self.quotation_server = import_config.get(
351
+ 'collect', 'quotation_server', fallback='ipc:///tmp/hikyuu_real.ipc')
352
+ hku_warn_if(len(self.quotation_server) < 3, "Invalid quotation server addr!")
353
+ if self.quotation_server[:3] == "ipc":
354
+ self.quotation_server = 'ipc:///tmp/hikyuu_real.ipc'
355
+ interval_time = import_config.getint('collect', 'interval', fallback=60 * 60)
356
+ self.collect_sample_spinBox.setValue(interval_time)
357
+ use_zhima_proxy = import_config.getboolean('collect', 'use_zhima_proxy', fallback=False)
358
+ self.collect_use_zhima_checkBox.setChecked(use_zhima_proxy)
359
+ # data_source = import_config.get('collect', 'source', fallback='qq')
360
+ self.collect_source_comboBox.setCurrentIndex(0)
361
+ self.collect_phase1_start_timeEdit.setTime(
362
+ datetime.time.fromisoformat(import_config.get('collect', 'phase1_start', fallback='09:00'))
363
+ )
364
+ self.collect_phase1_last_timeEdit.setTime(
365
+ datetime.time.fromisoformat(import_config.get('collect', 'phase1_end', fallback='12:05'))
366
+ )
367
+ self.collect_phase2_start_timeEdit.setTime(
368
+ datetime.time.fromisoformat(import_config.get('collect', 'phase2_start', fallback='13:00'))
369
+ )
370
+ self.collect_phase2_last_timeEdit.setTime(
371
+ datetime.time.fromisoformat(import_config.get('collect', 'phase2_end', fallback='15:05'))
372
+ )
373
+
374
+ # 预加载设置
375
+ self.preload_day_checkBox.setChecked(import_config.getboolean('preload', 'day', fallback=True))
376
+ self.preload_week_checkBox.setChecked(import_config.getboolean('preload', 'week', fallback=False))
377
+ self.preload_month_checkBox.setChecked(import_config.getboolean('preload', 'month', fallback=False))
378
+ self.preload_quarter_checkBox.setChecked(import_config.getboolean('preload', 'quarter', fallback=False))
379
+ self.preload_halfyear_checkBox.setChecked(import_config.getboolean('preload', 'halfyear', fallback=False))
380
+ self.preload_year_checkBox.setChecked(import_config.getboolean('preload', 'year', fallback=False))
381
+ self.preload_min1_checkBox.setChecked(import_config.getboolean('preload', 'min', fallback=False))
382
+ self.preload_min5_checkBox.setChecked(import_config.getboolean('preload', 'min5', fallback=False))
383
+ self.preload_min15_checkBox.setChecked(import_config.getboolean('preload', 'min15', fallback=False))
384
+ self.preload_min30_checkBox.setChecked(import_config.getboolean('preload', 'min30', fallback=False))
385
+ self.preload_min60_checkBox.setChecked(import_config.getboolean('preload', 'min60', fallback=False))
386
+ self.preload_hour2_checkBox.setChecked(import_config.getboolean('preload', 'hour2', fallback=False))
387
+ self.preload_day_spinBox.setValue(import_config.getint('preload', 'day_max', fallback=100000))
388
+ self.preload_week_spinBox.setValue(import_config.getint('preload', 'week_max', fallback=100000))
389
+ self.preload_month_spinBox.setValue(import_config.getint('preload', 'month_max', fallback=100000))
390
+ self.preload_quarter_spinBox.setValue(import_config.getint('preload', 'quarter_max', fallback=100000))
391
+ self.preload_halfyear_spinBox.setValue(import_config.getint('preload', 'halfyear_max', fallback=100000))
392
+ self.preload_year_spinBox.setValue(import_config.getint('preload', 'year_max', fallback=100000))
393
+ self.preload_min1_spinBox.setValue(import_config.getint('preload', 'min_max', fallback=5120))
394
+ self.preload_min5_spinBox.setValue(import_config.getint('preload', 'min5_max', fallback=5120))
395
+ self.preload_min15_spinBox.setValue(import_config.getint('preload', 'min15_max', fallback=5120))
396
+ self.preload_min30_spinBox.setValue(import_config.getint('preload', 'min30_max', fallback=5120))
397
+ self.preload_min60_spinBox.setValue(import_config.getint('preload', 'min60_max', fallback=5120))
398
+ self.preload_hour2_spinBox.setValue(import_config.getint('preload', 'hour2_max', fallback=5120))
399
+
400
+ def getCurrentConfig(self):
401
+ import_config = ConfigParser()
402
+ import_config['quotation'] = {
403
+ 'stock': self.import_stock_checkBox.isChecked(),
404
+ 'fund': self.import_fund_checkBox.isChecked(),
405
+ 'future': self.import_future_checkBox.isChecked()
406
+ }
407
+ import_config['ktype'] = {
408
+ 'day': self.import_day_checkBox.isChecked(),
409
+ 'min': self.import_min_checkBox.isChecked(),
410
+ 'min5': self.import_min5_checkBox.isChecked(),
411
+ 'trans': self.import_trans_checkBox.isChecked(),
412
+ 'time': self.import_time_checkBox.isChecked(),
413
+ 'day_start_date': self.day_start_dateEdit.date().toString('yyyy-MM-dd'),
414
+ 'min_start_date': self.min_start_dateEdit.date().toString('yyyy-MM-dd'),
415
+ 'min5_start_date': self.min5_start_dateEdit.date().toString('yyyy-MM-dd'),
416
+ 'trans_start_date': self.trans_start_dateEdit.date().toString('yyyy-MM-dd'),
417
+ 'time_start_date': self.time_start_dateEdit.date().toString('yyyy-MM-dd')
418
+ }
419
+ import_config['weight'] = {
420
+ 'enable': self.import_weight_checkBox.isChecked(),
421
+ }
422
+ import_config['tdx'] = {'enable': self.tdx_radioButton.isChecked(), 'dir': self.tdx_dir_lineEdit.text()}
423
+ import_config['pytdx'] = {
424
+ 'enable': self.pytdx_radioButton.isChecked(),
425
+ 'use_tdx_number': self.use_tdx_number_spinBox.value()
426
+ }
427
+ import_config['hdf5'] = {
428
+ 'enable': self.enable_hdf55_radioButton.isChecked(),
429
+ 'dir': self.hdf5_dir_lineEdit.text()
430
+ }
431
+ import_config['mysql'] = {
432
+ 'enable': self.enable_mysql_radioButton.isChecked(),
433
+ 'tmpdir': self.mysql_tmpdir_lineEdit.text(),
434
+ 'host': self.mysql_ip_lineEdit.text(),
435
+ 'port': self.mysql_port_lineEdit.text(),
436
+ 'usr': self.mysql_usr_lineEdit.text(),
437
+ 'pwd': self.mysql_pwd_lineEdit.text()
438
+ }
439
+ import_config['sched'] = {
440
+ 'time': self.sched_import_timeEdit.time().toString(),
441
+ }
442
+ import_config['collect'] = {
443
+ 'quotation_server': self.quotation_server,
444
+ 'interval': self.collect_sample_spinBox.value(),
445
+ 'source': self.collect_source_comboBox.currentText(),
446
+ 'use_zhima_proxy': self.collect_use_zhima_checkBox.isChecked(),
447
+ 'phase1_start': self.collect_phase1_start_timeEdit.time().toString(),
448
+ 'phase1_end': self.collect_phase1_last_timeEdit.time().toString(),
449
+ 'phase2_start': self.collect_phase2_start_timeEdit.time().toString(),
450
+ 'phase2_end': self.collect_phase2_last_timeEdit.time().toString(),
451
+ }
452
+ import_config['preload'] = {
453
+ 'day': self.preload_day_checkBox.isChecked(),
454
+ 'week': self.preload_week_checkBox.isChecked(),
455
+ 'month': self.preload_month_checkBox.isChecked(),
456
+ 'quarter': self.preload_quarter_checkBox.isChecked(),
457
+ 'halfyear': self.preload_halfyear_checkBox.isChecked(),
458
+ 'year': self.preload_year_checkBox.isChecked(),
459
+ 'min': self.preload_min1_checkBox.isChecked(),
460
+ 'min5': self.preload_min5_checkBox.isChecked(),
461
+ 'min15': self.preload_min15_checkBox.isChecked(),
462
+ 'min30': self.preload_min30_checkBox.isChecked(),
463
+ 'min60': self.preload_min60_checkBox.isChecked(),
464
+ 'hour2': self.preload_hour2_checkBox.isChecked(),
465
+ 'day_max': self.preload_day_spinBox.value(),
466
+ 'week_max': self.preload_week_spinBox.value(),
467
+ 'month_max': self.preload_month_spinBox.value(),
468
+ 'quarter_max': self.preload_quarter_spinBox.value(),
469
+ 'halfyear_max': self.preload_halfyear_spinBox.value(),
470
+ 'year_max': self.preload_year_spinBox.value(),
471
+ 'min_max': self.preload_min1_spinBox.value(),
472
+ 'min5_max': self.preload_min5_spinBox.value(),
473
+ 'min15_max': self.preload_min15_spinBox.value(),
474
+ 'min30_max': self.preload_min30_spinBox.value(),
475
+ 'min60_max': self.preload_min60_spinBox.value(),
476
+ 'hour2_max': self.preload_hour2_spinBox.value(),
477
+ }
478
+ return import_config
479
+
480
+ def initThreads(self):
481
+ self.escape_time_thread = None
482
+ self.hdf5_import_thread = None
483
+ self.mysql_import_thread = None
484
+ self.collect_spot_thread = None
485
+ self.sched_import_thread = None
486
+
487
+ self.import_running = False
488
+ self.hdf5_import_progress_bar = {
489
+ 'DAY': self.hdf5_day_progressBar,
490
+ '1MIN': self.hdf5_min_progressBar,
491
+ '5MIN': self.hdf5_5min_progressBar
492
+ }
493
+
494
+ @pyqtSlot()
495
+ def on_pytdx_radioButton_clicked(self):
496
+ if self.pytdx_radioButton.isChecked():
497
+ self.tdx_radioButton.setChecked(False)
498
+ self.on_tdx_or_pytdx_toggled()
499
+
500
+ @pyqtSlot()
501
+ def on_tdx_radioButton_clicked(self):
502
+ if self.tdx_radioButton.isChecked():
503
+ self.pytdx_radioButton.setChecked(False)
504
+ self.on_tdx_or_pytdx_toggled()
505
+
506
+ def on_tdx_or_pytdx_toggled(self):
507
+ tdx_enable = self.tdx_radioButton.isChecked()
508
+ self.tdx_dir_lineEdit.setEnabled(tdx_enable)
509
+ self.select_tdx_dir_pushButton.setEnabled(tdx_enable)
510
+ self.import_trans_checkBox.setEnabled(not tdx_enable)
511
+ self.import_time_checkBox.setEnabled(not tdx_enable)
512
+ self.trans_start_dateEdit.setEnabled(not tdx_enable)
513
+ self.time_start_dateEdit.setEnabled(not tdx_enable)
514
+ self.use_tdx_number_spinBox.setEnabled(not tdx_enable)
515
+
516
+ @pyqtSlot()
517
+ def on_select_tdx_dir_pushButton_clicked(self):
518
+ dlg = QFileDialog()
519
+ dlg.setFileMode(QFileDialog.Directory)
520
+ config = self.getCurrentConfig()
521
+ dlg.setDirectory(config['tdx']['dir'])
522
+ if dlg.exec_():
523
+ dirname = dlg.selectedFiles()
524
+ self.tdx_dir_lineEdit.setText(dirname[0])
525
+
526
+ @pyqtSlot()
527
+ def on_hdf5_dir_pushButton_clicked(self):
528
+ dlg = QFileDialog()
529
+ dlg.setFileMode(QFileDialog.Directory)
530
+ config = self.getCurrentConfig()
531
+ dlg.setDirectory(config['hdf5']['dir'])
532
+ if dlg.exec_():
533
+ dirname = dlg.selectedFiles()
534
+ self.hdf5_dir_lineEdit.setText(dirname[0])
535
+
536
+ @pyqtSlot()
537
+ def on_enable_hdf55_radioButton_clicked(self):
538
+ if self.enable_hdf55_radioButton.isChecked():
539
+ self.enable_mysql_radioButton.setChecked(False)
540
+ self.on_enable_hdf5_or_mysql_toggled()
541
+
542
+ @pyqtSlot()
543
+ def on_enable_mysql_radioButton_clicked(self):
544
+ if self.enable_mysql_radioButton.isChecked():
545
+ self.enable_hdf55_radioButton.setChecked(False)
546
+ self.on_enable_hdf5_or_mysql_toggled()
547
+
548
+ def on_enable_hdf5_or_mysql_toggled(self):
549
+ hdf5_enable = self.enable_hdf55_radioButton.isChecked()
550
+ mysql_enable = not hdf5_enable
551
+ self.hdf5_dir_lineEdit.setEnabled(hdf5_enable)
552
+ self.mysql_ip_lineEdit.setEnabled(mysql_enable)
553
+ self.mysql_port_lineEdit.setEnabled(mysql_enable)
554
+ self.mysql_usr_lineEdit.setEnabled(mysql_enable)
555
+ self.mysql_pwd_lineEdit.setEnabled(mysql_enable)
556
+ self.mysql_test_pushButton.setEnabled(mysql_enable)
557
+
558
+ @pyqtSlot()
559
+ def on_mysql_tmpdir_pushButton_clicked(self):
560
+ dlg = QFileDialog()
561
+ dlg.setFileMode(QFileDialog.Directory)
562
+ config = self.getCurrentConfig()
563
+ dlg.setDirectory(config['mysql']['tmpdir'])
564
+ if dlg.exec_():
565
+ dirname = dlg.selectedFiles()
566
+ self.mysql_tmpdir_lineEdit.setText(dirname[0])
567
+
568
+ @pyqtSlot()
569
+ def on_mysql_test_pushButton_clicked(self):
570
+ """测试数据库连接"""
571
+ db_config = {
572
+ 'user': self.mysql_usr_lineEdit.text(),
573
+ 'password': self.mysql_pwd_lineEdit.text(),
574
+ 'host': self.mysql_ip_lineEdit.text(),
575
+ 'port': self.mysql_port_lineEdit.text()
576
+ }
577
+
578
+ try:
579
+ cnx = mysql.connector.connect(**db_config)
580
+ cnx.close()
581
+ except mysql.connector.Error as err:
582
+ if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
583
+ QMessageBox.critical(self, "测试数据库连接", "MYSQL密码或用户名错误!")
584
+ elif err.errno == errorcode.ER_BAD_DB_ERROR:
585
+ QMessageBox.critical(self, "测试数据库连接", "MySQL数据库不存在!")
586
+ else:
587
+ QMessageBox.critical(self, "测试数据库连接", err.msg)
588
+ return
589
+
590
+ QMessageBox.about(self, "测试数据库连接", " 连接成功!")
591
+
592
+ def reset_progress_bar(self):
593
+ self.hdf5_weight_label.setText('')
594
+ self.hdf5_day_progressBar.setValue(0)
595
+ self.hdf5_min_progressBar.setValue(0)
596
+ self.hdf5_5min_progressBar.setValue(0)
597
+ self.hdf5_trans_progressBar.setValue(0)
598
+ self.hdf5_time_progressBar.setValue(0)
599
+ # self.finance_progressBar.setValue(0)
600
+ self.import_detail_textEdit.clear()
601
+
602
+ def on_escapte_time(self, escape):
603
+ self.import_status_label.setText("耗时:{:>.2f} 秒".format(escape))
604
+
605
+ def on_message_from_thread(self, msg):
606
+ if not msg or len(msg) < 2:
607
+ print("msg is empty!")
608
+ return
609
+
610
+ msg_name, msg_task_name = msg[:2]
611
+ if msg_name == 'ESCAPE_TIME':
612
+ self.escape_time = msg_task_name
613
+ self.import_status_label.setText(
614
+ "耗时:{:>.2f} 秒 ({:>.2f}分钟) {}".format(self.escape_time, self.escape_time / 60, datetime.datetime.now())
615
+ )
616
+
617
+ elif msg_name == 'HDF5_IMPORT':
618
+ if msg_task_name == 'INFO':
619
+ self.import_detail_textEdit.append(msg[2])
620
+
621
+ elif msg_task_name == 'THREAD':
622
+ status = msg[2]
623
+ if status == 'FAILURE':
624
+ self.import_status_label.setText("耗时:{:>.2f} 秒 导入异常!".format(self.escape_time))
625
+ self.import_detail_textEdit.append(msg[3])
626
+ self.hdf5_import_thread.terminate()
627
+ self.hdf5_import_thread = None
628
+ self.escape_time_thread.stop()
629
+ self.escape_time_thread = None
630
+ self.start_import_pushButton.setEnabled(True)
631
+ self.import_detail_textEdit.append("导入完毕!")
632
+ self.hdf5_weight_label.setText("导入完毕!")
633
+ if can_upgrade():
634
+ self.import_detail_textEdit.append("========================================================")
635
+ self.import_detail_textEdit.append(
636
+ "Hikyuu 新版本 ({}) 已发布,建议更新".format(get_last_version()))
637
+ self.import_detail_textEdit.append("更新命令: pip instal hikyuu --upgrade")
638
+ self.import_detail_textEdit.append("========================================================")
639
+ self.import_running = False
640
+
641
+ elif msg_task_name == 'IMPORT_KDATA':
642
+ ktype, progress = msg[2:4]
643
+ if ktype != 'FINISHED':
644
+ self.hdf5_import_progress_bar[ktype].setValue(progress)
645
+ else:
646
+ self.import_detail_textEdit.append('导入 {} {} 记录数:{}'.format(msg[3], msg[4], msg[5]))
647
+
648
+ elif msg_task_name == 'IMPORT_TRANS':
649
+ ktype, progress = msg[2:4]
650
+ if ktype != 'FINISHED':
651
+ self.hdf5_trans_progressBar.setValue(progress)
652
+ else:
653
+ self.import_detail_textEdit.append('导入 {} 分笔记录数:{}'.format(msg[3], msg[5]))
654
+
655
+ elif msg_task_name == 'IMPORT_TIME':
656
+ ktype, progress = msg[2:4]
657
+ if ktype != 'FINISHED':
658
+ self.hdf5_time_progressBar.setValue(progress)
659
+ else:
660
+ self.import_detail_textEdit.append('导入 {} 分时记录数:{}'.format(msg[3], msg[5]))
661
+
662
+ elif msg_task_name == 'IMPORT_WEIGHT':
663
+ if msg[2] == '导入权息数据完毕!':
664
+ self.import_detail_textEdit.append('导入权息记录数:{}'.format(msg[3]))
665
+ elif msg[2] == '导入通达信财务信息完毕!':
666
+ self.import_detail_textEdit.append('导入通达信财务记录数:{}'.format(msg[3]))
667
+
668
+ elif msg_task_name == 'IMPORT_FINANCE':
669
+ # self.finance_progressBar.setValue(msg[2])
670
+ self.logger.info(f"财务数据下载: {msg[2]}%")
671
+
672
+ elif msg_task_name == 'IMPORT_BLOCKINFO':
673
+ if msg[2] != 'FINISHED':
674
+ self.import_detail_textEdit.append(msg[2])
675
+
676
+ elif msg_task_name == 'IMPORT_ZH_BOND10':
677
+ if msg[2] != 'FINISHED':
678
+ self.import_detail_textEdit.append(msg[2])
679
+
680
+ @pyqtSlot()
681
+ def on_start_import_pushButton_clicked(self):
682
+ try:
683
+ self.saveConfig()
684
+ except Exception as e:
685
+ QMessageBox.about(self, "保存配置信息失败", str(e))
686
+ return
687
+
688
+ config = self.getCurrentConfig()
689
+ try:
690
+ if config.getboolean('hdf5', 'enable'):
691
+ if not os.path.lexists(config['hdf5']['dir']):
692
+ os.makedirs(f"{config['hdf5']['dir']}/tmp")
693
+ elif not os.path.isdir(config['hdf5']['dir']):
694
+ QMessageBox.about(self, "错误", '指定的目标数据存放目录不存在!')
695
+ return
696
+
697
+ if config.getboolean('tdx', 'enable'):
698
+ if not os.path.lexists(config['tdx']['dir']):
699
+ os.makedirs(f"{config['tdx']['dir']}/tmp")
700
+ elif not os.path.isdir(config['tdx']['dir']):
701
+ QMessageBox.about(self, "错误", "请确认通达信安装目录是否正确!")
702
+ return
703
+
704
+ if config.getboolean('mysql', 'enable'):
705
+ if not os.path.lexists(config['mysql']['tmpdir']):
706
+ os.makedirs(config['mysql']['tmpdir'])
707
+ elif not os.path.isdir(config['mysql']['tmpdir']):
708
+ QMessageBox.about(self, "错误", "请确认临时目录是否正确!")
709
+ return
710
+ except Exception as e:
711
+ QMessageBox.about(self, "错误", str(e))
712
+ return
713
+
714
+ self.import_running = True
715
+ self.start_import_pushButton.setEnabled(False)
716
+ self.reset_progress_bar()
717
+
718
+ if config.getboolean('weight', 'enable', fallback=False):
719
+ self.hdf5_weight_label.setText("正在导入")
720
+
721
+ self.import_status_label.setText("正在启动任务....")
722
+ QApplication.processEvents()
723
+
724
+ if self.tdx_radioButton.isChecked():
725
+ self.hdf5_import_thread = UseTdxImportToH5Thread(self, config)
726
+ else:
727
+ self.hdf5_import_thread = UsePytdxImportToH5Thread(self, config)
728
+
729
+ self.hdf5_import_thread.message.connect(self.on_message_from_thread)
730
+ self.hdf5_import_thread.start()
731
+
732
+ self.escape_time = 0.0
733
+ self.escape_time_thread = EscapetimeThread()
734
+ self.escape_time_thread.message.connect(self.on_message_from_thread)
735
+ self.escape_time_thread.start()
736
+
737
+ @pyqtSlot()
738
+ def on_sched_import_pushButton_clicked(self):
739
+ self.sched_import_pushButton.setEnabled(False)
740
+ if self._is_sched_import_running:
741
+ self._is_sched_import_running = False
742
+ self.sched_import_pushButton.setText("启动定时导入")
743
+ self.sched_import_thread.terminate()
744
+ self.sched_import_thread.wait()
745
+ self.logger.info("已停止定时导入")
746
+ self.sched_import_thread = None
747
+ self.sched_import_pushButton.setEnabled(True)
748
+ self.start_import_pushButton.setEnabled(True)
749
+ return
750
+
751
+ try:
752
+ self.saveConfig()
753
+ except Exception as e:
754
+ QMessageBox.about(self, "保存配置信息错误", str(e))
755
+ return
756
+
757
+ self.start_import_pushButton.setEnabled(False)
758
+ self._is_sched_import_running = True
759
+ self.sched_import_thread = SchedImportThread(self.getCurrentConfig())
760
+ self.sched_import_thread.message.connect(self.on_start_import_pushButton_clicked)
761
+ self.sched_import_thread.start()
762
+ self.sched_import_pushButton.setText("停止定时导入")
763
+ self.sched_import_pushButton.setEnabled(True)
764
+
765
+ @pyqtSlot()
766
+ def on_collect_start_pushButton_clicked(self):
767
+ if self._is_collect_running:
768
+ if self.collect_spot_thread is not None and self.collect_spot_thread.isRunning():
769
+ release_nng_senders()
770
+ self.collect_spot_thread.terminate()
771
+ self.collect_spot_thread.wait()
772
+ self.collect_spot_thread = None
773
+ self._is_collect_running = False
774
+ self.logger.info("停止采集")
775
+ self.collect_status_label.setText("已停止")
776
+ self.collect_start_pushButton.setText("启动采集")
777
+ QMessageBox.about(self, '', '已停止')
778
+ else:
779
+ if self.collect_spot_thread is None or self.collect_spot_thread.isFinished():
780
+ self.collect_spot_thread = CollectSpotThread(
781
+ self.getCurrentConfig(),
782
+ self.getHikyuuConfigFileName(),
783
+ )
784
+ self.collect_spot_thread.start()
785
+ self._is_collect_running = True
786
+ self.collect_status_label.setText("运行中")
787
+ self.collect_start_pushButton.setText("停止采集")
788
+ QMessageBox.about(self, '', '已启动,请在控制台日志查看是否正常运行')
789
+
790
+
791
+ class_logger(MyMainWindow)
792
+
793
+
794
+ def start():
795
+ import requests
796
+ import urllib
797
+ logging.getLogger("requests").setLevel(logging.WARNING)
798
+ logging.getLogger("urllib3").setLevel(logging.WARNING)
799
+ app = QApplication(sys.argv)
800
+ use_dark_style = False # 使用暗黑主题
801
+ if use_dark_style:
802
+ import qdarkstyle
803
+ app.setStyleSheet(qdarkstyle.load_stylesheet(qt_api='pyqt5'))
804
+ myWin = MyMainWindow(capture_output=True, use_dark_style=use_dark_style)
805
+ myWin.show()
806
+ sys.exit(app.exec())
807
+
808
+
809
+ if __name__ == "__main__":
810
+ import requests
811
+ import urllib
812
+ logging.getLogger("requests").setLevel(logging.WARNING)
813
+ logging.getLogger("urllib3").setLevel(logging.WARNING)
814
+ logging.getLogger("pytdx").setLevel(logging.WARNING)
815
+
816
+ # 自适应分辨率,防止字体显示不全
817
+ QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps)
818
+ QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
819
+
820
+ app = QApplication(sys.argv)
821
+ f = QFont('SimSun')
822
+ f.setPixelSize(12)
823
+ app.setFont(f)
824
+
825
+ use_dark_style = False # 使用暗黑主题
826
+ if use_dark_style:
827
+ import qdarkstyle
828
+ app.setStyleSheet(qdarkstyle.load_stylesheet(qt_api='pyqt5'))
829
+ if (len(sys.argv) > 1 and sys.argv[1] == '0'):
830
+ FORMAT = '%(asctime)-15s [%(levelname)s]: %(message)s [%(name)s::%(funcName)s]'
831
+ logging.basicConfig(format=FORMAT, level=logging.INFO, handlers=[
832
+ logging.StreamHandler(),
833
+ ])
834
+ myWin = MyMainWindow(capture_output=False, use_dark_style=use_dark_style)
835
+ else:
836
+ myWin = MyMainWindow(capture_output=True, use_dark_style=use_dark_style)
837
+
838
+ myWin.show()
839
+ sys.exit(app.exec())