hqchart 1.1.12687 → 1.1.12706

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 (228) hide show
  1. package/lib/umychart.vue.js +94 -50
  2. package/package.json +15 -47
  3. package/src/jscommon/umychart.resource/js/codemirror/javascript.js +1 -1
  4. package/src/jscommon/umychart.uniapp.h5/umychart.uniapp.h5.js +409 -115
  5. package/src/jscommon/umychart.vue/umychart.vue.js +409 -115
  6. package/.babelrc +0 -6
  7. package/.vscode/settings.json +0 -4
  8. package/Makefile +0 -9
  9. package/README.md +0 -452
  10. package/index.js +0 -17
  11. package/postcss.config.js +0 -5
  12. package/src/index.html +0 -18
  13. package/src/jscommon/backup/announcement.png +0 -0
  14. package/src/jscommon/backup/announcement2.png +0 -0
  15. package/src/jscommon/backup/blocktrading.png +0 -0
  16. package/src/jscommon/backup/investor.png +0 -0
  17. package/src/jscommon/backup/pforecast.png +0 -0
  18. package/src/jscommon/backup/research.png +0 -0
  19. package/src/jscommon/backup/tradedetail.png +0 -0
  20. package/src/jscommon/backup/umychart - backup.js +0 -17631
  21. package/src/jscommon/backup/umychart.macro.js +0 -4
  22. package/src/jscommon/backup/umychart.macro.vue.js +0 -3
  23. package/src/jscommon/commonindextree.json +0 -92
  24. package/src/jscommon/index.html +0 -13
  25. package/src/jscommon/jschinamapdata.js +0 -3
  26. package/src/jscommon/umychart.NetworkFilterTest.js +0 -48803
  27. package/src/jscommon/umychart.aliYunnetwork.js +0 -47
  28. package/src/jscommon/umychart.cninfo.components/readme.txt +0 -1
  29. package/src/jscommon/umychart.complier.js +0 -25291
  30. package/src/jscommon/umychart.complier.node/umychart.complier.controller.js +0 -559
  31. package/src/jscommon/umychart.complier.node/umychart.complier.node.js +0 -7043
  32. package/src/jscommon/umychart.complier.node/umychart.data.node.js +0 -816
  33. package/src/jscommon/umychart.console.js +0 -12
  34. package/src/jscommon/umychart.deal.js +0 -1452
  35. package/src/jscommon/umychart.dragdiv.js +0 -48
  36. package/src/jscommon/umychart.index.data.js +0 -4132
  37. package/src/jscommon/umychart.js +0 -90257
  38. package/src/jscommon/umychart.keyboard.js +0 -1659
  39. package/src/jscommon/umychart.listctrl.js +0 -690
  40. package/src/jscommon/umychart.mind.js +0 -2203
  41. package/src/jscommon/umychart.network.js +0 -44
  42. package/src/jscommon/umychart.news.js +0 -823
  43. package/src/jscommon/umychart.node.build/buildall.bat +0 -1
  44. package/src/jscommon/umychart.node.build/umychart.node.bat +0 -1
  45. package/src/jscommon/umychart.node.build/umychart.node.export.js +0 -40
  46. package/src/jscommon/umychart.regressiontest.js +0 -400
  47. package/src/jscommon/umychart.report.js +0 -5803
  48. package/src/jscommon/umychart.scrollbar.js +0 -1345
  49. package/src/jscommon/umychart.stock.js +0 -4218
  50. package/src/jscommon/umychart.style.js +0 -618
  51. package/src/jscommon/umychart.testdata.js +0 -150
  52. package/src/jscommon/umychart.uniapp.build/buildall.bat +0 -1
  53. package/src/jscommon/umychart.uniapp.build/umychart.bat +0 -1
  54. package/src/jscommon/umychart.uniapp.build/umychart.export.js +0 -70
  55. package/src/jscommon/umychart.user.js +0 -137
  56. package/src/jscommon/umychart.version.js +0 -30
  57. package/src/jscommon/umychart.vue/umychart.aliYunnetwork.vue.js +0 -56
  58. package/src/jscommon/umychart.vue.build/buildall.bat +0 -4
  59. package/src/jscommon/umychart.vue.build/copy_codemirror.bat +0 -2
  60. package/src/jscommon/umychart.vue.build/umychart.aliYunnetwork.vue.export.js +0 -9
  61. package/src/jscommon/umychart.vue.build/umychart.dragdiv.bat +0 -1
  62. package/src/jscommon/umychart.vue.build/umychart.dragdiv.export.js +0 -6
  63. package/src/jscommon/umychart.vue.build/umychart.index.data.bat +0 -1
  64. package/src/jscommon/umychart.vue.build/umychart.index.data.export.js +0 -4
  65. package/src/jscommon/umychart.vue.build/umychart.listctrl.vue.export.js +0 -15
  66. package/src/jscommon/umychart.vue.build/umychart.regressiontest.vue.export.js +0 -7
  67. package/src/jscommon/umychart.vue.build/umychart.regressiontest.wechat.export.js +0 -12
  68. package/src/jscommon/umychart.vue.build/umychart.stock.bat +0 -1
  69. package/src/jscommon/umychart.vue.build/umychart.stock.vue.export.js +0 -16
  70. package/src/jscommon/umychart.vue.build/umychart.testdata.bat +0 -3
  71. package/src/jscommon/umychart.vue.build/umychart.testdata.vue.export.js +0 -7
  72. package/src/jscommon/umychart.vue.build/umychart.vue.bat +0 -8
  73. package/src/jscommon/umychart.vue.build/umychart.vue.export.js +0 -112
  74. package/src/jscommon/umychart.vue.components/empyt.vue +0 -51
  75. package/src/jscommon/umychart.vue.components/historydayline.vue +0 -240
  76. package/src/jscommon/umychart.vue.components/jsloader.adddialog.vue +0 -315
  77. package/src/jscommon/umychart.vue.components/jsloader.vue +0 -93
  78. package/src/jscommon/umychart.vue.components/jsvuecontainer.vue +0 -160
  79. package/src/jscommon/umychart.vue.components/jsvuecontainer2.0.vue +0 -391
  80. package/src/jscommon/umychart.vue.components/login.vue +0 -178
  81. package/src/jscommon/umychart.vue.components/queryContent.vue +0 -750
  82. package/src/jscommon/umychart.vue.components/readme.txt +0 -8
  83. package/src/jscommon/umychart.vue.components/searchsymbol.vue +0 -299
  84. package/src/jscommon/umychart.vue.components/simulatetrade.vue +0 -1471
  85. package/src/jscommon/umychart.vue.components/stockchart.vue +0 -343
  86. package/src/jscommon/umychart.vue.components/stockchartV2.vue +0 -195
  87. package/src/jscommon/umychart.vue.components/stockdeal.vue +0 -358
  88. package/src/jscommon/umychart.vue.components/stockdealcount.vue +0 -262
  89. package/src/jscommon/umychart.vue.components/stockdeallastest.vue +0 -316
  90. package/src/jscommon/umychart.vue.components/stockdrawtool.vue +0 -343
  91. package/src/jscommon/umychart.vue.components/stockfull.vue +0 -355
  92. package/src/jscommon/umychart.vue.components/stockinfo.demo.vue +0 -153
  93. package/src/jscommon/umychart.vue.components/stockinfo.vue +0 -685
  94. package/src/jscommon/umychart.vue.components/stockkline.demo.vue +0 -1904
  95. package/src/jscommon/umychart.vue.components/stockmultiorder.vue +0 -174
  96. package/src/jscommon/umychart.vue.components/stockmultiperiod.vue +0 -222
  97. package/src/jscommon/umychart.vue.components/stockorder.vue +0 -320
  98. package/src/jscommon/umychart.vue.components/stocktradeinfo.demo.vue +0 -250
  99. package/src/jscommon/umychart.vue.components/stocktradeinfo.vue +0 -1907
  100. package/src/jscommon/umychart.vue.components/test.vue +0 -0
  101. package/src/jscommon/umychart.wechat/getDate.wechat.js +0 -91
  102. package/src/jscommon/umychart.wechat/lighter.news.wechat.js +0 -262
  103. package/src/jscommon/umychart.wechat/readme.txt +0 -3
  104. package/src/jscommon/umychart.wechat/umychart.analyze.wechat.js +0 -551
  105. package/src/jscommon/umychart.wechat/umychart.apidraw.wechat.js +0 -126
  106. package/src/jscommon/umychart.wechat/umychart.bigV.wechat.js +0 -2510
  107. package/src/jscommon/umychart.wechat/umychart.chartframe.wechat.js +0 -2931
  108. package/src/jscommon/umychart.wechat/umychart.chartpaint.wechat.js +0 -9752
  109. package/src/jscommon/umychart.wechat/umychart.charttitle.wechat.js +0 -2023
  110. package/src/jscommon/umychart.wechat/umychart.complier.wechat.js +0 -14726
  111. package/src/jscommon/umychart.wechat/umychart.console.wechat.js +0 -8
  112. package/src/jscommon/umychart.wechat/umychart.coordinatedata.wechat.js +0 -3654
  113. package/src/jscommon/umychart.wechat/umychart.data.wechat.js +0 -2243
  114. package/src/jscommon/umychart.wechat/umychart.element.wechart.js +0 -132
  115. package/src/jscommon/umychart.wechat/umychart.explainer.wechat.js +0 -1077
  116. package/src/jscommon/umychart.wechat/umychart.extendchart.wechat.js +0 -1140
  117. package/src/jscommon/umychart.wechat/umychart.framesplit.wechat.js +0 -2247
  118. package/src/jscommon/umychart.wechat/umychart.hqIndexformula.wechat.js +0 -941
  119. package/src/jscommon/umychart.wechat/umychart.index.data.wechat.js +0 -3628
  120. package/src/jscommon/umychart.wechat/umychart.index.wechat.js +0 -4074
  121. package/src/jscommon/umychart.wechat/umychart.klineinfo.wechat.js +0 -836
  122. package/src/jscommon/umychart.wechat/umychart.markethot.js +0 -50
  123. package/src/jscommon/umychart.wechat/umychart.network.wechart.js +0 -62
  124. package/src/jscommon/umychart.wechat/umychart.news.wechat.js +0 -3568
  125. package/src/jscommon/umychart.wechat/umychart.regressiontest.wechat.js +0 -412
  126. package/src/jscommon/umychart.wechat/umychart.report.wechat.js +0 -3983
  127. package/src/jscommon/umychart.wechat/umychart.resource.wechat.js +0 -919
  128. package/src/jscommon/umychart.wechat/umychart.shareimage.wechat.js +0 -681
  129. package/src/jscommon/umychart.wechat/umychart.simulatetrade.wechat.js +0 -238
  130. package/src/jscommon/umychart.wechat/umychart.stock.wechat.js +0 -4035
  131. package/src/jscommon/umychart.wechat/umychart.style.wechat.js +0 -419
  132. package/src/jscommon/umychart.wechat/umychart.uniapp.canvas.helper.js +0 -99
  133. package/src/jscommon/umychart.wechat/umychart.user.wechat.js +0 -588
  134. package/src/jscommon/umychart.wechat/umychart.userlog.wechat.js +0 -240
  135. package/src/jscommon/umychart.wechat/umychart.vedio.wechat.js +0 -112
  136. package/src/jscommon/umychart.wechat/umychart.version.wechat.js +0 -36
  137. package/src/jscommon/umychart.wechat/umychart.wechat.3.0.js +0 -12051
  138. package/src/jscommon/umychart.wechat/umychart.wechat.js +0 -15460
  139. package/src/jscommon/umychart.worker.js +0 -114
  140. package/src/jscommon/umychart.ws.stock.js +0 -110
  141. package/src/jscommon/umychart_python/.vscode/launch.json +0 -15
  142. package/src/jscommon/umychart_python/__init__.py +0 -4
  143. package/src/jscommon/umychart_python/build.cmd +0 -2
  144. package/src/jscommon/umychart_python/setup.py +0 -25
  145. package/src/jscommon/umychart_python/umychart_cache_testcase.py +0 -165
  146. package/src/jscommon/umychart_python/umychart_complier_data.py +0 -781
  147. package/src/jscommon/umychart_python/umychart_complier_help.py +0 -175
  148. package/src/jscommon/umychart_python/umychart_complier_job.py +0 -193
  149. package/src/jscommon/umychart_python/umychart_complier_jsalgorithm.py +0 -4144
  150. package/src/jscommon/umychart_python/umychart_complier_jscomplier.py +0 -177
  151. package/src/jscommon/umychart_python/umychart_complier_jsexecute.py +0 -517
  152. package/src/jscommon/umychart_python/umychart_complier_jsparser.py +0 -864
  153. package/src/jscommon/umychart_python/umychart_complier_jssymboldata.py +0 -1238
  154. package/src/jscommon/umychart_python/umychart_complier_jssymboldata_cache.py +0 -146
  155. package/src/jscommon/umychart_python/umychart_complier_jssymboldata_json.py +0 -106
  156. package/src/jscommon/umychart_python/umychart_complier_pandas_help.py +0 -80
  157. package/src/jscommon/umychart_python/umychart_complier_scanner.py +0 -554
  158. package/src/jscommon/umychart_python/umychart_complier_testcase.py +0 -362
  159. package/src/jscommon/umychart_python/umychart_complier_util.py +0 -30
  160. package/src/jscommon/umychart_python/umychart_webtemplate.py +0 -131
  161. package/src/jscommon/umychart_python/updatehqchartweb.bat +0 -5
  162. package/src/jscommon/vendor.js +0 -2
  163. package/src/pages/block.list.demo.page/App.vue +0 -117
  164. package/src/pages/block.list.demo.page/index.js +0 -12
  165. package/src/pages/brushTool.demo.page/App.vue +0 -19
  166. package/src/pages/brushTool.demo.page/index.js +0 -12
  167. package/src/pages/container.demo.page/App.vue +0 -118
  168. package/src/pages/container.demo.page/index.js +0 -18
  169. package/src/pages/dataZoom.demo.page/App.vue +0 -265
  170. package/src/pages/dataZoom.demo.page/components/dataZoom.vue +0 -303
  171. package/src/pages/dataZoom.demo.page/index.js +0 -12
  172. package/src/pages/historydayline.demo.page/App.vue +0 -57
  173. package/src/pages/historydayline.demo.page/index.js +0 -12
  174. package/src/pages/hq.demo.page/App.vue +0 -163
  175. package/src/pages/hq.demo.page/index.js +0 -12
  176. package/src/pages/hqchart.black/App.vue +0 -90
  177. package/src/pages/hqchart.black/components/searchsymbol.vue +0 -299
  178. package/src/pages/hqchart.black/components/stockdrawtool.vue +0 -300
  179. package/src/pages/hqchart.black/components/stockfull.vue +0 -313
  180. package/src/pages/hqchart.black/components/stockinfo.vue +0 -428
  181. package/src/pages/hqchart.black/components/stockkline.demo.vue +0 -1652
  182. package/src/pages/hqchart.black/components/stocktradeinfo.vue +0 -1337
  183. package/src/pages/hqchart.black/index.js +0 -30
  184. package/src/pages/hqchart.black/router/candlestickChart.vue +0 -108
  185. package/src/pages/hqchart.black/router/pricePointsTable.vue +0 -294
  186. package/src/pages/hqchart.black/router/stockDeallas.vue +0 -417
  187. package/src/pages/hqchart.black/router/timeShareChart.vue +0 -108
  188. package/src/pages/hqchart.page/App.vue +0 -101
  189. package/src/pages/hqchart.page/index.js +0 -18
  190. package/src/pages/index/App.vue +0 -1408
  191. package/src/pages/index/index.js +0 -7
  192. package/src/pages/indexHq/App.vue +0 -110
  193. package/src/pages/indexHq/index.js +0 -18
  194. package/src/pages/login.demo.page/App.vue +0 -22
  195. package/src/pages/login.demo.page/index.js +0 -12
  196. package/src/pages/queryContent.demo.page/App.vue +0 -29
  197. package/src/pages/queryContent.demo.page/index.js +0 -18
  198. package/src/pages/ranking.black/App.vue +0 -199
  199. package/src/pages/ranking.black/index.js +0 -18
  200. package/src/pages/search.demo.page/App.vue +0 -28
  201. package/src/pages/search.demo.page/index.js +0 -12
  202. package/src/pages/simulatetrade.demo.page/app.vue +0 -121
  203. package/src/pages/simulatetrade.demo.page/index.js +0 -17
  204. package/src/pages/stockdeal.demo.page/App.vue +0 -63
  205. package/src/pages/stockdeal.demo.page/index.js +0 -19
  206. package/src/pages/stockdealcount.demo.page/App.vue +0 -37
  207. package/src/pages/stockdealcount.demo.page/index.js +0 -12
  208. package/src/pages/stockdeallastest.demo.page/App.vue +0 -74
  209. package/src/pages/stockdeallastest.demo.page/index.js +0 -18
  210. package/src/pages/stockinfo.demo.page/App.vue +0 -92
  211. package/src/pages/stockinfo.demo.page/index.html +0 -13
  212. package/src/pages/stockinfo.demo.page/index.js +0 -19
  213. package/src/pages/stockkline.demo.page/App.vue +0 -55
  214. package/src/pages/stockkline.demo.page/index.js +0 -18
  215. package/src/pages/stockmultiorder.demo.page/App.vue +0 -149
  216. package/src/pages/stockmultiorder.demo.page/index.js +0 -18
  217. package/src/pages/stockmultiperiod.demo.page/App.vue +0 -87
  218. package/src/pages/stockmultiperiod.demo.page/index.js +0 -18
  219. package/src/pages/stockorder.demo.page/App.vue +0 -69
  220. package/src/pages/stockorder.demo.page/index.js +0 -18
  221. package/src/pages/test/App.vue +0 -22
  222. package/src/pages/test/index.js +0 -7
  223. package/src/pages/tradeinfopage/app.vue +0 -40
  224. package/src/pages/tradeinfopage/index.js +0 -7
  225. package/src/pages/tradeinfopage/tradeinfo.html +0 -12
  226. package/src/utils/urlObj.js +0 -81
  227. package/src/vendor.js +0 -2
  228. package/webpack.config.js +0 -104
@@ -1,1238 +0,0 @@
1
- # Copyright (c) 2018 jones
2
- #
3
- # http://www.apache.org/licenses/LICENSE-2.0
4
- #
5
- # 开源项目 https://github.com/jones2000/HQChart
6
- #
7
- # jones_2000@163.com
8
-
9
-
10
- #####################################################################
11
- #
12
- # 股票数据类
13
- #
14
- #####################################################################
15
-
16
- import sys
17
- import requests # 网络数据下载
18
- from umychart_complier_job import JS_EXECUTE_JOB_ID, JobItem, HQ_DATA_TYPE,SymbolOption
19
- from umychart_complier_data import ChartData, HistoryData, MinuteData, SingleData
20
- from umychart_complier_help import JSComplierHelper, Variant
21
-
22
- # 全局api域名变量
23
- class TextItem:
24
- def __init__(self, color,text=None,symbol=None) :
25
- self.Text=text,
26
- self.Color=color
27
- self.Symbol=symbol
28
-
29
- class JSComplierResource :
30
- def __init__(self) :
31
- self.Domain = "https://opensource.zealink.com" # API域名
32
- self.CacheDomain = "https://opensourcecache.zealink.com" # 缓存域名
33
-
34
- drawIcon=Variant()
35
- drawIcon.Family='iconfont'
36
- drawIcon.Data={
37
- 1 : TextItem(text='\ue625', color='rgb(255,106,106)'), # 向上箭头
38
- 2 : TextItem(text='\ue68b', color='rgb(46,139,87)'), # 向下箭头
39
- 11: TextItem(text='\ue624', color='rgb(245,159,40)'), # 点赞
40
- 12: TextItem(text='\ue600', color='rgb(245,159,40)'),
41
- 13: TextItem(text='\ue70f', color='rgb(209,37,35)'), # B
42
- 14: TextItem(text='\ue64c', color='rgb(127,209,59)'), # S
43
- 9 : TextItem(text='\ue626', color='rgb(245,159,40)'), # $
44
- 36: TextItem(text='\ue68c', color='rgb(255,106,106)'), # 关闭 红色
45
- 37: TextItem(text='\ue68c', color='rgb(46,139,87)'), # 关闭 绿色
46
- 38: TextItem(text='\ue68d', color='rgb(238,44,44)'), # ▲
47
- 39: TextItem(text='\ue68e', color='rgb(0,139,69)'), # ▼
48
- 46: TextItem(text='\ue64d', color='rgb(51,51,51)'), # message
49
- }
50
- self.DrawIcon=drawIcon
51
-
52
- g_JSComplierResource=JSComplierResource()
53
-
54
- #股票财务数据
55
- class FinanceData :
56
- def __init__(self, date=None, finance=None,announcement=None) :
57
- self.Date=date # 日期
58
- self.Finance=finance # 数据 (可以是一个数组)
59
- self.Announcement=announcement
60
-
61
- def Get(self, name) :
62
- if not self.Finance :
63
- return None
64
- if not JSComplierHelper.IsJsonNumber(self.Finance,name) :
65
- return None
66
-
67
- value=self.Finance[name]
68
- return value
69
-
70
- # http://www.newone.com.cn/helpcontroller/index?code=zszy_pc
71
- class DYNAINFO_ARGUMENT_ID :
72
- YCLOSE=3
73
- OPEN=4
74
- HIGH=5
75
- LOW=6
76
- CLOSE=7
77
- VOL=8
78
- AMOUNT=10
79
- AMPLITUDE=13 # 振幅
80
- INCREASE=14 # 涨幅
81
- EXCHANGERATE=37 # 换手率
82
-
83
-
84
- class JSSymbolData() :
85
- def __init__(self, ast, option=SymbolOption(), procThrow=None) :
86
- self.AST=ast # 语法树
87
-
88
- self.Symbol=option.Symbol
89
- self.Name=None
90
- self.Data=None # 个股数据 (ChartData)
91
- self.SourceData=None # 不复权的个股数据 (ChartData)
92
- self.MarketValue=None # 总市值
93
- self.Period=option.Period # 周期
94
- self.Right=option.Right # 复权
95
- self.DataType=option.HQDataType # 默认K线数据 2=分钟走势图数据 3=多日分钟走势图
96
- self.ThrowUnexpectedNode=procThrow # 抛异常
97
-
98
- self.IndexData=None # 大盘指数
99
- self.FinanceData={} # 财务数据
100
- self.MarketValue=None # 市值
101
- self.LatestData=None # 最新行情
102
- self.MarginData={} # 融资融券
103
- self.ExtendData={} # 其他扩展数据
104
- self.NewsAnalysisData={} # 新闻统计
105
-
106
- self.MaxRequestDataCount=option.MaxRequestDataCount # 读取日线数据天数
107
- self.MaxRequestMinuteDayCount=option.MaxRequestMinuteDayCount # 读取分钟数据天数
108
-
109
- self.KLineApiUrl= g_JSComplierResource.Domain+"/API/KLine2" # 日线
110
- self.MinuteKLineApiUrl= g_JSComplierResource.Domain+'/API/KLine3' # 分钟K线
111
- self.RealtimeApiUrl= g_JSComplierResource.Domain+'/API/stock' # 实时行情
112
- self.StockHistoryDayApiUrl= g_JSComplierResource.Domain+'/API/StockHistoryDay' # 历史财务数据
113
- self.StockNewsAnalysisApiUrl= g_JSComplierResource.CacheDomain+'/cache/newsanalyze' # 新闻分析数据
114
-
115
-
116
- # 准备数据
117
- def RunDownloadJob(self, jobList) :
118
- self.GetSymbolData() # 先下载个股的数据
119
-
120
- for job in jobList :
121
- if job.ID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SYMBOL_DATA :
122
- self.GetSymbolData()
123
- elif job.ID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_INDEX_DATA :
124
- self.GetIndexData()
125
- elif job.ID in (JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_TOTAL_EQUITY_DATA,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_CAPITAL_DATA,
126
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_FLOW_EQUITY_DATA,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_NETASSET_DATA,
127
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_U_PROFIT_DATA,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_C_RESERVE_DATA,
128
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_S_EARNING_DATA,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_S_EARNING2_DATA,
129
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_N_PROFIT_DATA,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_FLOW_MARKETVALUE_DATA,
130
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARKETVALUE_DATA,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_EXCHANGE_DATA,
131
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_AL_RATIO_DATA,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PROFIT_YOY_DATA,
132
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_DIVIDEND_YIELD_DATA
133
- ) :
134
- self.GetFinanceData(job.ID, job)
135
- elif job.ID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SYMBOL_LATEST_DATA : # 最新行情数据
136
- self.GetLatestData()
137
- elif job.ID in (JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BALANCE,
138
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_RATE,
139
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_BALANCE, # 买入信息-融资余额
140
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_AMOUNT, # 买入信息-买入额
141
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_REPAY, # 买入信息-偿还额
142
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_NET, # 买入信息-融资净买入
143
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_BALANCE, # 卖出信息-融券余量
144
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_VOLUME, # 卖出信息-卖出量
145
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_REPAY, # 卖出信息-偿还量
146
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_NET) : # 卖出信息-融券净卖出
147
- self.GetMarginData(job.ID)
148
- elif job.ID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_INDEX_INCREASE_DATA: # 涨停个股统计
149
- self.GetIndexIncreaseData(job)
150
- elif job.ID in (JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_NEGATIVE, # 负面新闻
151
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_RESEARCH, # 机构调研
152
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_INTERACT, # 互动易
153
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE, # 股东增持
154
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE2, # 股东减持
155
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_TRUSTHOLDER, # 信托持股
156
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_BLOCKTRADING, # 大宗交易
157
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_COMPANYNEWS, # 官网新闻
158
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_TOPMANAGERS, # 高管要闻
159
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_PLEDGE) : # 股权质押
160
- self.GetNewsAnalysisData(job.ID)
161
-
162
-
163
-
164
- # 下载股票数据
165
- def GetSymbolData(self) :
166
- if self.Data:
167
- return
168
-
169
- if self.DataType==HQ_DATA_TYPE.MINUTE_ID: # 当天分钟数据
170
- url=self.RealtimeApiUrl
171
- postData={
172
- "field": ["name","symbol","yclose","open","price","high","low","vol","amount","date","minute","time","minutecount"],
173
- "symbol": [self.Symbol],
174
- "start": -1
175
- }
176
- print('[JSSymbolData::GetSymbolData] Download minute ',url, postData)
177
- response=requests.post(url,postData)
178
- jsonData=response.json()
179
- data=JSSymbolData.JsonDataToMinuteData(jsonData)
180
- self.SourceData=ChartData(data=data,dataType=self.DataType)
181
- self.Data=ChartData(data=data,dataType=self.DataType)
182
- self.Name=jsonData['stock'][0]['name']
183
- return
184
-
185
- if self.Period<=3 : # 请求日线数据
186
- url=self.KLineApiUrl
187
- postData={
188
- "field": [ "name", "symbol","yclose","open","price","high","low","vol",'up','down','stop','unchanged'],
189
- "symbol": [self.Symbol],
190
- "start": -1,
191
- "count": self.MaxRequestDataCount
192
- }
193
- print('[JSSymbolData::GetSymbolData] ',self.Period, url, postData)
194
- response=requests.post(url,postData)
195
- jsonData=response.json()
196
- data=JSSymbolData.JsonDataToHistoryData(jsonData)
197
- self.SourceData=ChartData(data=data,dataType=self.DataType)
198
- self.Data=ChartData(data=data, dataType=self.DataType)
199
- if self.Right>0 : # 复权
200
- rightData=self.Data.GetRightDate(self.Right)
201
- self.Data.Data=rightData
202
-
203
- if self.Period>0 and self.Period<=3 : # 周期数据
204
- periodData=self.Data.GetPeriodData(self.Period)
205
- self.Data.Data=periodData
206
-
207
- self.Data.Right=self.Right
208
- self.Data.Period=self.Period
209
- self.Name=jsonData['name']
210
-
211
- else :
212
- url=self.MinuteKLineApiUrl
213
- postData= {
214
- "field": ["name","symbol","yclose","open","price","high","low","vol"],
215
- "symbol": self.Symbol,
216
- "start": -1,
217
- "count": self.MaxRequestMinuteDayCount
218
- }
219
- print('[JSSymbolData::GetSymbolData] ',self.Period, url, postData)
220
- response=requests.post(url,postData)
221
- jsonData=response.json()
222
- data=JSSymbolData.JsonDataToMinuteHistoryData(jsonData)
223
- self.SourceData=ChartData(data=data,dataType=self.DataType)
224
- self.Data=ChartData(data=data, dataType=self.DataType)
225
-
226
- if self.Period>=5: # 周期数据
227
- periodData=self.Data.GetPeriodData(self.Period)
228
- self.Data.Data=periodData
229
-
230
- self.Data.Period=self.Period
231
- self.Name=jsonData['name']
232
-
233
- @staticmethod # 日线数据转类
234
- def JsonDataToHistoryData(data) :
235
- list = data['data']
236
- aryDayData=[]
237
- date = 0
238
- yclose = 1
239
- open = 2
240
- high = 3
241
- low = 4
242
- close = 5
243
- vol = 6
244
- amount = 7
245
- up=8
246
- down=9
247
- stop=10
248
- unchanged=11
249
- for item in list :
250
- if item[open]<=0 : #停牌的数据剔除
251
- continue
252
- kData=HistoryData()
253
- kData.Date = item[date]
254
- kData.Open = item[open]
255
- kData.YClose =item[yclose]
256
- kData.Close = item[close]
257
- kData.High = item[high]
258
- kData.Low = item[low]
259
- kData.Vol = item[vol] # 原始单位股
260
- kData.Amount = item[amount]
261
-
262
- # 上涨 下跌家数
263
- fieldCount=len(item)
264
- if fieldCount>up :
265
- kData.Up=item[up]
266
- if fieldCount>down :
267
- kData.Down=item[down]
268
- if fieldCount>stop :
269
- kData.Stop=item[stop]
270
- if fieldCount>unchanged :
271
- kData.Unchanged=item[unchanged]
272
-
273
- aryDayData.append(kData)
274
-
275
- return aryDayData
276
-
277
- @staticmethod # 1分钟K线数据转类
278
- def JsonDataToMinuteHistoryData(data):
279
- list = data['data']
280
- aryDayData=[]
281
- date = 0
282
- yclose = 1
283
- open = 2
284
- high = 3
285
- low = 4
286
- close = 5
287
- vol = 6
288
- amount = 7
289
- time = 8
290
- for item in list :
291
- kData = HistoryData()
292
-
293
- kData.Date = item[date]
294
- kData.Time=item[time]
295
- kData.Open = item[open]
296
- kData.YClose = item[yclose]
297
- kData.Close = item[close]
298
- kData.High = item[high]
299
- kData.Low = item[low]
300
- kData.Vol = item[vol] # 原始单位股
301
- kData.Amount = item[amount]
302
-
303
- aryDayData.append(kData)
304
-
305
- # 无效数据处理
306
- for i, minData in enumerate(aryDayData) :
307
- if not minData.IsVaild(5):
308
- if i == 0 :
309
- if minData.YClose > 0:
310
- minData.Open = minData.YClose
311
- minData.High = minData.YClose
312
- minData.Low = minData.YClose
313
- minData.Close = minData.YClose
314
- else : # 用前一个有效数据填充
315
- for j in range(i-1,-1,-1) :
316
- minData2 = aryDayData[j]
317
- if minData2.IsVaild(4) :
318
- if minData.YClose<=0 or minData.YClose==None:
319
- minData.YClose = minData2.Close
320
- minData.Open = minData2.Open
321
- minData.High = minData2.High
322
- minData.Low = minData2.Low
323
- minData.Close = minData2.Close
324
- break
325
- return aryDayData
326
-
327
- @staticmethod # 走势图分钟数据 转化为array[]
328
- def JsonDataToMinuteData(data) :
329
- aryMinuteData=[]
330
- stockData=data['stock'][0]
331
- minuteData=stockData['minute']
332
-
333
- for i in range(len(minuteData)) :
334
- jsData=minuteData[i]
335
-
336
- item=MinuteData()
337
- item.Close=jsData['price']
338
- item.Open=jsData['open']
339
- item.High=jsData['high']
340
- item.Low=jsData['low']
341
- item.Vol=jsData['vol'] # 股
342
- item.Amount=jsData['amount']
343
-
344
- if i==0 : # 第1个数据 写死9:25
345
- item.DateTime=str(stockData['date']) + " 0925"
346
- else :
347
- item.DateTime=str(stockData['date']) + " " +str(jsData['time'])
348
-
349
- item.Increase=jsData['increase']
350
- item.Risefall=jsData['risefall']
351
- item.AvPrice=jsData['avprice']
352
-
353
- aryMinuteData.append(item)
354
-
355
- return aryMinuteData
356
-
357
- def GetSymbolCacheData(self, dataName) :
358
- if not self.Data :
359
- return []
360
-
361
- if dataName in ('CLOSE','C') :
362
- return self.Data.GetClose()
363
- elif dataName in ('VOL', 'V') :
364
- return self.Data.GetVol()
365
- elif dataName in ('OPEN', 'O') :
366
- return self.Data.GetOpen()
367
- elif dataName in ('HIGH', 'H') :
368
- return self.Data.GetHigh()
369
- elif dataName in ('LOW',"L") :
370
- return self.Data.GetLow()
371
- elif dataName in ('AMOUNT',"AMO") :
372
- return self.Data.GetAmount()
373
-
374
-
375
- # 获取大盘指数数据
376
- def GetIndexData(self) :
377
- if self.IndexData :
378
- return
379
-
380
- if self.DataType==HQ_DATA_TYPE.MINUTE_ID: # 当天分钟数据
381
- url=self.RealtimeApiUrl
382
- postData={
383
- "field": ["name","symbol","yclose","open","price","high","low","vol","amount","date","minute","time","minutecount"],
384
- "symbol": ['000001.sh'],
385
- "start": -1
386
- }
387
-
388
- print('[JSSymbolData::GetIndexData] Download minute ',url, postData)
389
- response=requests.post(url,postData)
390
- jsonData=response.json()
391
- data=JSSymbolData.JsonDataToMinuteData(jsonData)
392
- self.IndexData=ChartData(data=data,dataType=self.DataType)
393
- return
394
-
395
- if self.Period<=3 : # 请求日线数据
396
- url=self.KLineApiUrl
397
- postData={
398
- "field": [ "name", "symbol","yclose","open","price","high","low","vol",'up','down','stop','unchanged'],
399
- "symbol": ['000001.sh'],
400
- "start": -1,
401
- "count": self.MaxRequestDataCount+200 # 多请求点的数据 确保股票剔除停牌日期以后可以对上
402
- }
403
- print('[JSSymbolData::GetIndexData] ',self.Period, url, postData)
404
- response=requests.post(url,postData)
405
- jsonData=response.json()
406
- data=JSSymbolData.JsonDataToHistoryData(jsonData)
407
- self.IndexData=ChartData(data=data, dataType=self.DataType)
408
-
409
- aryOverlayData=self.SourceData.GetOverlayData(self.IndexData.Data) # 和主图数据拟合以后的数据
410
- self.IndexData.Data=aryOverlayData
411
-
412
- if self.Period>0 and self.Period<=3 : # 周期数据
413
- periodData=self.IndexData.GetPeriodData(self.Period)
414
- self.IndexData.Data=periodData
415
-
416
- self.IndexData.Period=self.Period
417
- else :
418
- url=self.MinuteKLineApiUrl
419
- postData= {
420
- "field": ["name","symbol","yclose","open","price","high","low","vol"],
421
- "symbol": '000001.sh',
422
- "start": -1,
423
- "count": self.MaxRequestMinuteDayCount+5
424
- }
425
- print('[JSSymbolData::GetIndexData] ',self.Period, url, postData)
426
- response=requests.post(url,postData)
427
- jsonData=response.json()
428
- data=JSSymbolData.JsonDataToMinuteHistoryData(jsonData)
429
- self.IndexData=ChartData(data=data,dataType=self.DataType)
430
-
431
- aryOverlayData=self.SourceData.GetOverlayMinuteData(self.IndexData.Data) # 和主图数据拟合以后的数据
432
- self.IndexData.Data=aryOverlayData
433
-
434
- if self.Period>=5: # 周期数据
435
- periodData=self.IndexData.GetPeriodData(self.Period)
436
- self.IndexData.Data=periodData
437
-
438
- self.IndexData.Period=self.Period
439
-
440
- # 获取大盘指数缓存数据
441
- def GetIndexCacheData(self, dataName) :
442
- if not self.IndexData :
443
- return []
444
-
445
- if dataName=='INDEXA':
446
- return self.IndexData.GetAmount()
447
- elif dataName=='INDEXC':
448
- return self.IndexData.GetClose()
449
- elif dataName=='INDEXH':
450
- return self.IndexData.GetHigh()
451
- elif dataName=='INDEXL':
452
- return self.IndexData.GetLow()
453
- elif dataName=='INDEXO':
454
- return self.IndexData.GetOpen()
455
- elif dataName=='INDEXV':
456
- return self.IndexData.GetVol()
457
- elif dataName=='INDEXADV':
458
- return self.IndexData.GetUp()
459
- elif dataName=='INDEXDEC':
460
- return self.IndexData.GetDown()
461
-
462
- # 下载财务数据
463
- def GetFinanceData(self, jobID, job) :
464
- key=int(job.Args[0].Value)
465
- if key in self.FinanceData :
466
- return
467
-
468
- print('[JSSymbolData::GetFinanceData] jobID=', jobID)
469
-
470
- fieldList=["name","date","symbol"]
471
-
472
- if jobID in ( JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_FLOW_EQUITY_DATA, # 流通股本(万股)
473
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_CAPITAL_DATA, # 流通股本 手
474
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_FLOW_MARKETVALUE_DATA , #流通市值
475
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_EXCHANGE_DATA #换手率
476
- ) :
477
- fieldList.append("capital.a")
478
- elif jobID in ( JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_TOTAL_EQUITY_DATA, # 总股本(万股)
479
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARKETVALUE_DATA # 总市值
480
- ) :
481
- fieldList.append('capital.total')
482
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_U_PROFIT_DATA:
483
- fieldList.append('finance.peruprofit')
484
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_NETASSET_DATA:
485
- fieldList.append('finance.pernetasset')
486
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_C_RESERVE_DATA:
487
- fieldList.append('finance.percreserve')
488
- elif jobID in (JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_S_EARNING_DATA, JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_S_EARNING2_DATA ):
489
- fieldList.append('finance.persearning')
490
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_N_PROFIT_DATA:
491
- fieldList.append('finance.nprofit')
492
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_AL_RATIO_DATA:
493
- fieldList.append('finance.alratio')
494
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PROFIT_YOY_DATA:
495
- fieldList.append('finance.profityoy')
496
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_DIVIDEND_YIELD_DATA: # 过去4个季度现金分红总额
497
- fieldList.append('execdividend.quarter4')
498
- else :
499
- return
500
-
501
- # 请求数据
502
- url=self.StockHistoryDayApiUrl
503
- postData= { "field": fieldList,"symbol": [self.Symbol], "orderfield":"date" }
504
- print('[JSSymbolData::GetFinanceData] ',url, postData)
505
- response=requests.post(url,postData)
506
- jsonData=response.json()
507
- self.RecvStockDayData(jsonData,jobID, key)
508
-
509
- @staticmethod # 财务数据格式转换
510
- def JsonDataToFinance(data) :
511
- financeData=None
512
-
513
- for i in range(1,5) :
514
- if i==1 :
515
- finance=data['finance1']
516
- announcement=data['announcement1']
517
- elif i==2 :
518
- finance=data['finance2']
519
- announcement=data['announcement2']
520
- elif i==3 :
521
- finance=data['finance3']
522
- announcement=data['announcement3']
523
- elif i==4 :
524
- finance=data['finance4']
525
- announcement=data['announcement4']
526
-
527
- if not finance or not announcement or not JSComplierHelper.IsNumber(announcement['year']) or not JSComplierHelper.IsNumber(announcement['quarter']):
528
- continue
529
-
530
- date=data['date']
531
- if financeData : # 如果存在1天公布多个报告期数据 只取最新的一个公告期数据
532
- if financeData.Announcement['year'] < announcement['year'] :
533
- financeData=FinanceData(date,finance=finance,announcement=announcement)
534
-
535
- else :
536
- financeData=FinanceData(date,finance=finance,announcement=announcement)
537
-
538
- return financeData
539
-
540
- # 获取某一个财务数据 (返回 True/False 返回数据保存在 resData)
541
- def GetFinanceValue(self,jsData, name, resData) :
542
- financeData=JSSymbolData.JsonDataToFinance(jsData)
543
- if not financeData :
544
- return False
545
- value=financeData.Get(name)
546
- if value==None :
547
- return False
548
- resData.Value=value
549
- return True
550
-
551
-
552
- # 把历史json数据转换为内存数据
553
- def RecvStockDayData(self, recvData, jobID, key) :
554
- stocks=recvData['stock']
555
- if not stocks or len(stocks)!=1 :
556
- return
557
-
558
- aryStockDay=stocks[0]['stockday']
559
- bFinanceData=False # 是否是定期的财务数据
560
- bMarketValue=False # 是否计算市值
561
- aryData=[]
562
-
563
- for item in aryStockDay :
564
- indexData=SingleData()
565
- indexData.Date=item['date']
566
-
567
- if jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_CAPITAL_DATA :
568
- capitalData=item['capital']
569
- if not capitalData or not JSComplierHelper.IsJsonNumber(capitalData,'a'):
570
- continue
571
- indexData.Value=capitalData['a']/100 # 流通股本 手
572
- bFinanceData=True
573
-
574
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_TOTAL_EQUITY_DATA:
575
- capitalData=item['capital']
576
- if not capitalData or not JSComplierHelper.IsJsonNumber(capitalData,'total'):
577
- continue
578
- indexData.Value=capitalData['total'] #总股本 股
579
- bFinanceData=True
580
-
581
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_FLOW_EQUITY_DATA:
582
- capitalData=item['capital']
583
- if not capitalData or not JSComplierHelper.IsJsonNumber(capitalData,'a'):
584
- continue
585
- indexData.Value=capitalData['a'] # 流通股本 股
586
- bFinanceData=True
587
-
588
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_FLOW_MARKETVALUE_DATA: #流通市值
589
- capitalData=item['capital']
590
- if not capitalData or not JSComplierHelper.IsJsonNumber(capitalData,'a') :
591
- continue
592
- indexData.Value=capitalData['a'] # 流通股本
593
- bMarketValue=True
594
-
595
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARKETVALUE_DATA: # 总市值
596
- capitalData=item['capital']
597
- if not capitalData or not JSComplierHelper.IsJsonNumber(capitalData,'total') :
598
- continue
599
- indexData.Value=capitalData['total'] # 总股本
600
- bMarketValue=True
601
-
602
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_EXCHANGE_DATA: # 换手率
603
- capitalData=item['capital']
604
- if not capitalData or not JSComplierHelper.IsJsonNumber(capitalData,'a') :
605
- continue
606
- indexData.Value=capitalData['a'] # 流通股本
607
- bFinanceData=True
608
-
609
-
610
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_U_PROFIT_DATA:
611
- if not self.GetFinanceValue(item,'peruprofit',indexData) : # 每股未分配利润
612
- continue
613
- bFinanceData=True
614
-
615
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_NETASSET_DATA:
616
- if not self.GetFinanceValue(item,'pernetasset',indexData) : # 每股净资产
617
- continue
618
- bFinanceData=True
619
-
620
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_C_RESERVE_DATA:
621
- if not self.GetFinanceValue(item,'percreserve',indexData) : # 每股资本公积金
622
- continue
623
- bFinanceData=True
624
-
625
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_S_EARNING_DATA:
626
- if not self.GetFinanceValue(item,'persearning',indexData) : # 每股收益
627
- continue
628
- bFinanceData=True
629
-
630
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PER_S_EARNING2_DATA:
631
- financeData=JSSymbolData.JsonDataToFinance(item)
632
- if not financeData or not financeData.Finance or not financeData.Announcement:
633
- continue
634
-
635
- if not JSComplierHelper.IsJsonNumber(financeData.Finance,'persearning') or not JSComplierHelper.IsJsonDivideNumber(financeData.Announcement,'quarter'):
636
- continue
637
-
638
- indexData.Value=financeData.Finance['persearning']/financeData.Announcement['quarter']*4 # 每股收益(折算为全年收益) 报告期每股收益/报告期*4
639
- bFinanceData=True
640
-
641
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_N_PROFIT_DATA:
642
- if not self.GetFinanceValue(item,'nprofit',indexData) : # 净利润
643
- continue
644
- bFinanceData=True
645
-
646
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_AL_RATIO_DATA:
647
- if not self.GetFinanceValue(item,'alratio',indexData) : # 资产负债率
648
- continue
649
- bFinanceData=True
650
-
651
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_PROFIT_YOY_DATA:
652
- if not self.GetFinanceValue(item,'profityoy',indexData) : # 净利润同比增长率
653
- continue
654
- bFinanceData=True
655
-
656
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_DIVIDEND_YIELD_DATA:
657
- if not self.GetFinanceValue(item,'quarter4',indexData) : # 净利润同比增长率
658
- continue
659
- else :
660
- continue
661
-
662
- aryData.append(indexData)
663
-
664
- if bFinanceData:
665
- aryFixedData=self.SourceData.GetFittingFinanceData(aryData)
666
- elif bMarketValue :
667
- aryFixedData=self.SourceData.GetFittingMarketValueData(aryData) # 总市值用不复权的价格计算
668
- if jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARKETVALUE_DATA:
669
- self.MarketValue=aryFixedData # 总市值保存下 算其他数据可能要用
670
-
671
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_DIVIDEND_YIELD_DATA : # 股息率TTM:过去4个季度现金分红总额/总市值 * 100%
672
- aryFixedData=self.SourceData.CalculateDividendYield(aryData,self.MarketValue)
673
- else :
674
- aryFixedData=self.SourceData.GetFittingData(aryData)
675
-
676
- bindData=ChartData(data=aryFixedData)
677
- bindData.Period=self.Period
678
-
679
- if bindData.Period>0 : # 周期数据
680
- periodData=bindData.GetPeriodSingleData(bindData.Period)
681
- bindData.Data=periodData
682
-
683
- if jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_EXCHANGE_DATA : # 计算换手率 成交量/流通股本*100
684
- for i in range(len(self.Data.Data)) :
685
- if not bindData.Data[i] :
686
- continue
687
-
688
- if (JSComplierHelper.IsNumber(bindData.Data[i].Value) and bindData.Data[i].Value!=0) :
689
- bindData.Data[i].Value=self.Data.Data[i].Vol/bindData.Data[i].Value*100
690
- else :
691
- bindData.Data[i].Value=1
692
-
693
- data=bindData.GetValue()
694
- self.FinanceData[key]=data
695
-
696
-
697
- # 财务函数
698
- def GetFinanceCacheData(self, id, node) :
699
- key=int(id)
700
- if key in self.FinanceData :
701
- return self.FinanceData.get(key)
702
-
703
- return []
704
-
705
-
706
- # 下载最新行情
707
- def GetLatestData(self) :
708
- if self.LatestData:
709
- return
710
-
711
- url=self.RealtimeApiUrl
712
- postData={
713
- "field": ["name","symbol","yclose","open","price","high","low","vol","amount","date","time","increase","exchangerate","amplitude"],
714
- "symbol": [self.Symbol] }
715
-
716
- print('[JSSymbolData::GetLatestData] ',url, postData)
717
- response=requests.post(url,postData)
718
- jsonData=response.json()
719
-
720
- if not JSComplierHelper.IsJsonExist(jsonData,'stock') :
721
- return
722
-
723
- if (len(jsonData['stock'])!=1) :
724
- return
725
-
726
- stock=jsonData['stock'][0]
727
- item=Variant()
728
- item.Symbol=stock['symbol']
729
- item.Name=stock['name']
730
- item.Date=stock['date']
731
- item.Time=stock['time']
732
- item.YClose=stock['yclose']
733
- item.Price=stock['price']
734
- item.Open=stock['open']
735
- item.High=stock['high']
736
- item.Low=stock['low']
737
- item.Vol=stock['vol']
738
- item.Amount=stock['amount']
739
- item.Increase=stock['increase']
740
- item.Exchangerate=stock['exchangerate']
741
- item.Amplitude=stock['amplitude']
742
- self.LatestData=item
743
-
744
- # 最新行情
745
- def GetLatestCacheData(self, dataname) :
746
- if not self.LatestData :
747
- return None
748
-
749
- if dataname==DYNAINFO_ARGUMENT_ID.YCLOSE:
750
- return self.LatestData.YClose
751
- elif dataname==DYNAINFO_ARGUMENT_ID.OPEN:
752
- return self.LatestData.Open
753
- elif dataname==DYNAINFO_ARGUMENT_ID.HIGH:
754
- return self.LatestData.High
755
- elif dataname==DYNAINFO_ARGUMENT_ID.LOW:
756
- return self.LatestData.Low
757
- elif dataname==DYNAINFO_ARGUMENT_ID.VOL:
758
- return self.LatestData.Vol
759
- elif dataname==DYNAINFO_ARGUMENT_ID.AMOUNT:
760
- return self.LatestData.Amount
761
- elif dataname==DYNAINFO_ARGUMENT_ID.INCREASE:
762
- return self.LatestData.Increase
763
- elif dataname==DYNAINFO_ARGUMENT_ID.EXCHANGERATE:
764
- return self.LatestData.Exchangerate
765
- elif dataname==DYNAINFO_ARGUMENT_ID.AMPLITUDE:
766
- return self.LatestData.Amplitude
767
- elif dataname==DYNAINFO_ARGUMENT_ID.CLOSE:
768
- return self.LatestData.Price
769
- else :
770
- return None
771
-
772
- # 下载融资融券
773
- def GetMarginData(self, jobID) :
774
- if jobID in self.MarginData :
775
- return True
776
-
777
- fieldList=["name","date","symbol"]
778
-
779
- if jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BALANCE: # 融资融券余额
780
- fieldList.append("margin.balance")
781
-
782
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_RATE: # 融资占比
783
- fieldList.append("margin.rate")
784
-
785
- elif jobID in ( JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_BALANCE, # 买入信息-融资余额
786
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_AMOUNT, # 买入信息-买入额
787
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_REPAY, # 买入信息-偿还额
788
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_NET ) : # 买入信息-融资净买入
789
- fieldList.append("margin.buy")
790
-
791
- elif jobID in ( JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_BALANCE, # 卖出信息-融券余量
792
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_VOLUME, # 卖出信息-卖出量
793
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_REPAY, # 卖出信息-偿还量
794
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_NET ) : # 卖出信息-融券净卖出
795
- fieldList.append("margin.sell")
796
-
797
- url=self.StockHistoryDayApiUrl
798
- postData={
799
- "field": fieldList,
800
- "symbol": [self.Symbol],
801
- "orderfield":"date" }
802
-
803
- print('[JSSymbolData::GetMarginData] jobID , url, postData', jobID,url, postData)
804
-
805
- # 请求数据
806
- response=requests.post(url,postData)
807
- jsonData=response.json()
808
- self.RecvMarginData(jsonData,jobID)
809
- return True
810
-
811
-
812
- def RecvMarginData(self, jsonData,jobID) :
813
- if not JSComplierHelper.IsJsonExist(jsonData,'stock') :
814
- return
815
-
816
- if (len(jsonData['stock'])!=1) :
817
- return
818
-
819
- stock=jsonData['stock'][0]
820
- aryData, aryData2, aryData3, aryData4 = [] ,[], [], []
821
- for item in stock['stockday'] :
822
- if not JSComplierHelper.IsJsonExist(item,'margin') :
823
- continue
824
- marginData=item['margin']
825
- if not marginData :
826
- continue
827
-
828
- indexData=SingleData()
829
- indexData.Date=item['date']
830
-
831
- if jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BALANCE:
832
- if not JSComplierHelper.IsNumber(marginData['balance']) :
833
- continue
834
- indexData.Value=marginData['balance'] # 融资融券余额
835
- aryData.append(indexData)
836
-
837
- elif jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_RATE:
838
- if not JSComplierHelper.IsNumber(marginData.rate):
839
- continue
840
- indexData.Value=marginData['rate'] # 融资占比
841
- aryData.append(indexData)
842
-
843
- elif jobID in ( JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_BALANCE, # 买入信息-融资余额
844
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_AMOUNT, # 买入信息-买入额
845
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_REPAY, # 买入信息-偿还额
846
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_NET ) : # 买入信息-融资净买入
847
-
848
- if not JSComplierHelper.IsJsonExist(marginData,'buy') :
849
- continue
850
- buyData=marginData['buy']
851
- if not buyData :
852
- continue
853
-
854
- if (not JSComplierHelper.IsNumber(buyData['balance']) or not JSComplierHelper.IsNumber(buyData['amount']) or
855
- not JSComplierHelper.IsNumber(buyData['repay']) or not JSComplierHelper.IsNumber(buyData['net'])) :
856
- continue
857
-
858
- indexData.Value=buyData['balance']
859
- indexData2=SingleData()
860
- indexData2.Date=item['date']
861
- indexData2.Value=buyData['amount']
862
- indexData3=SingleData()
863
- indexData3.Date=item['date']
864
- indexData3.Value=buyData['repay']
865
- indexData4=SingleData()
866
- indexData4.Date=item['date']
867
- indexData4.Value=buyData['net']
868
-
869
- aryData.append(indexData)
870
- aryData2.append(indexData2)
871
- aryData3.append(indexData3)
872
- aryData4.append(indexData4)
873
-
874
- elif jobID in ( JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_BALANCE, # 卖出信息-融券余量
875
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_VOLUME, # 卖出信息-卖出量
876
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_REPAY, # 卖出信息-偿还量
877
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_NET ) : # 卖出信息-融券净卖出
878
- if not JSComplierHelper.IsJsonExist(marginData,'sell') :
879
- continue
880
- sellData=marginData['sell']
881
- if not sellData :
882
- continue
883
- if (not JSComplierHelper.IsNumber(sellData['balance']) or not JSComplierHelper.IsNumber(sellData['volume']) or
884
- not JSComplierHelper.IsNumber(sellData['repay']) or not JSComplierHelper.IsNumber(sellData['net'])) :
885
- continue
886
-
887
- indexData.Value=buyData['balance']
888
- indexData2=SingleData()
889
- indexData2.Date=item['date']
890
- indexData2.Value=buyData['volume']
891
- indexData3=SingleData()
892
- indexData3.Date=item['date']
893
- indexData3.Value=buyData['repay']
894
- indexData4=SingleData()
895
- indexData4.Date=item['date']
896
- indexData4.Value=buyData['net']
897
-
898
- aryData.append(indexData)
899
- aryData2.append(indexData2)
900
- aryData3.append(indexData3)
901
- aryData4.append(indexData4)
902
-
903
- else:
904
- continue
905
-
906
- allData=[]
907
- if (jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BALANCE or jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_RATE) :
908
- item=Variant()
909
- item.JobID, item.Data = jobID, aryData
910
- allData.append(item)
911
- elif jobID in (JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_BALANCE , JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_AMOUNT ,
912
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_REPAY , JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_NET) :
913
- item=Variant()
914
- item.JobID, item.Data = JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_BALANCE, aryData
915
- allData.append(item)
916
- item=Variant()
917
- item.JobID, item.Data = JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_AMOUNT, aryData2
918
- allData.append(item)
919
- item=Variant()
920
- item.JobID, item.Data = JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_REPAY, aryData3
921
- allData.append(item)
922
- item=Variant()
923
- item.JobID, item.Data = JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_NET, aryData4
924
- allData.append(item)
925
- elif jobID in (JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_BALANCE, JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_VOLUME,
926
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_REPAY, JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_NET) :
927
- item=Variant()
928
- item.JobID, item.Data = JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_BALANCE, aryData
929
- allData.append(item)
930
- item=Variant()
931
- item.JobID, item.Data = JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_VOLUME, aryData2
932
- allData.append(item)
933
- item=Variant()
934
- item.JobID, item.Data = JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_REPAY, aryData3
935
- allData.append(item)
936
- item=Variant()
937
- item.JobID, item.Data = JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_NET, aryData4
938
- allData.append(item)
939
-
940
- for item in allData :
941
- aryFixedData=self.SourceData.GetFittingData(item.Data)
942
-
943
- bindData=ChartData(data=aryFixedData)
944
- bindData.Period=self.Period # 周期
945
-
946
- if bindData.Period>0 : # 周期数据
947
- periodData=bindData.GetPeriodSingleData(bindData.Period)
948
- bindData.Data=periodData
949
-
950
- data=bindData.GetValue()
951
- self.MarginData[item.JobID]=data
952
-
953
- # 融资融券函数
954
- def GetMarginCacheData(self, id, node) :
955
- jobID=JS_EXECUTE_JOB_ID.GetMarginJobID(id)
956
- if not jobID :
957
- self.ThrowUnexpectedNode(node,'不支持MARGIN('+str(id)+')')
958
- if jobID in self.MarginData :
959
- return self.MarginData[jobID]
960
-
961
- return []
962
-
963
- # 分钟涨幅股票个数统计数据下载
964
- def GetIndexIncreaseData(self,job) :
965
- upKey=str(job.ID)+'-UpCount-'+job.Symbol
966
- downKey=str(job.ID)+'-DownCount-'+job.Symbol
967
- if upKey in self.ExtendData and downKey in self.ExtendData:
968
- return
969
-
970
- symbol=job.Symbol
971
- symbol=symbol.replace('.CI','.ci')
972
- if (self.DataType==HQ_DATA_TYPE.MINUTE_ID or self.DataType==HQ_DATA_TYPE.MULTIDAY_MINUTE_ID) : # 走势图数据
973
- url=g_JSComplierResource.CacheDomain+'/cache/analyze/increaseanalyze/'+symbol+'.json'
974
- print('[JSSymbolData::GetIndexIncreaseData] minute Get url= ' , url)
975
- # 请求数据
976
- response=requests.get(url)
977
- jsonData=response.json()
978
-
979
- elif (self.DataType==HQ_DATA_TYPE.KLINE_ID and self.Period==0) : # K线图 日线
980
- url=self.KLineApiUrl
981
- postData= {"symbol": symbol,"start": -1,"count": self.MaxRequestDataCount }
982
- print('[JSSymbolData::GetIndexIncreaseData] KLine jobID , url, postData', job.ID, url, postData)
983
- # 请求数据
984
- response=requests.post(url,postData)
985
- jsonData=response.json()
986
- self.RecvHistoryIncreaseData(jsonData,upKey,downKey)
987
-
988
- def RecvHistoryIncreaseData(self,jsonData,upKey,downKey) :
989
- if not JSComplierHelper.IsJsonExist(jsonData,'data') :
990
- return
991
- upData,downData = [], []
992
- for item in jsonData['data'] :
993
- upItem=SingleData()
994
- downItem=SingleData()
995
- upItem.Date=item[0]
996
- upItem.Value=item[8]
997
- upData.append(upItem)
998
- downItem.Date=item[0]
999
- downItem.Value=item[9]
1000
- downData.append(downItem)
1001
-
1002
- aryFixedData=self.SourceData.GetFittingData(upData)
1003
- bindData=ChartData(data=aryFixedData)
1004
- bindData.Period=self.Period # 只支持日线
1005
- data=bindData.GetValue()
1006
- self.ExtendData[upKey]=data
1007
-
1008
- aryFixedData=self.SourceData.GetFittingData(downData)
1009
- bindData=ChartData(data=aryFixedData)
1010
- bindData.Period=self.Period # 只支持日线
1011
- data=bindData.GetValue()
1012
- self.ExtendData[downKey]=data
1013
-
1014
- def RecvMinuteIncreaseData(self,jsonData,upKey,downKey) :
1015
- if not JSComplierHelper.IsJsonExist(jsonData,'minute') :
1016
- return
1017
-
1018
- minuteData=jsonData['minute']
1019
- if ( not JSComplierHelper.IsJsonExist(minuteData,'time') or not JSComplierHelper.IsJsonExist(minuteData,'up') or
1020
- not JSComplierHelper.IsJsonExist(minuteData,'down')) :
1021
- return
1022
-
1023
- dataLen=len(len(self.SourceData.Data))
1024
- upData,downData =JSComplierHelper.CreateArray(dataLen),JSComplierHelper.CreateArray(dataLen)
1025
- jsonUp=minuteData['up']
1026
- jsonDown=minuteData['down']
1027
- j=0
1028
- for i in range(dataLen) :
1029
- item=self.SourceData.Data[i]
1030
- dateTime=item.DateTime # 日期加时间
1031
- if not dateTime :
1032
- continue
1033
- aryValue=dateTime.split(' ')
1034
- if len(aryValue)!=2 :
1035
- continue
1036
- date=int(aryValue[0])
1037
- if date!=jsonData['date'] :
1038
- continue
1039
-
1040
- upData[i]=jsonUp[j]
1041
- downData[i]=jsonDown[j]
1042
- j+=1
1043
-
1044
- self.ExtendData[upKey]=upData
1045
- self.ExtendData[downKey]=downData
1046
-
1047
-
1048
-
1049
- # 分钟涨幅股票个数统计数据
1050
- def GetIndexIncreaseCacheData(self,funcName,symbol,node) :
1051
- key=None
1052
- if (funcName=='UPCOUNT') :
1053
- key=str(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_INDEX_INCREASE_DATA)+'-UpCount-'+symbol
1054
- elif (funcName=='DOWNCOUNT') :
1055
- key=str(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_INDEX_INCREASE_DATA)+'-DownCount-'+symbol
1056
-
1057
- if not key or key not in self.ExtendData :
1058
- self.ThrowUnexpectedNode(node,'不支持函数'+funcName+'('+symbol+')')
1059
-
1060
- return self.ExtendData[key]
1061
-
1062
- # 下载新闻统计
1063
- def GetNewsAnalysisData(self,jobID) :
1064
- if jobID in self.NewsAnalysisData :
1065
- return
1066
-
1067
- mapFolder={
1068
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_NEGATIVE : "negative",
1069
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_INTERACT : 'interact',
1070
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_RESEARCH : 'research', # NEWS(3) 调研
1071
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE: 'holderchange', # NEWS(4) 股东增持
1072
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE2:'holderchange', # NEWS(5) 股东减持
1073
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_TRUSTHOLDER: 'trustholder', # NEWS(6) 信托持股
1074
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_BLOCKTRADING: 'Blocktrading', # NEWS(7) 大宗交易
1075
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_COMPANYNEWS: 'companynews', # NEWS(8) 官网新闻
1076
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_TOPMANAGERS: 'topmanagers', # NEWS(9) 高管要闻
1077
- JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_PLEDGE: 'Pledge', # NEWS(10) 股权质押
1078
- }
1079
-
1080
-
1081
- if jobID not in mapFolder :
1082
- return
1083
-
1084
- folderName=mapFolder[jobID]
1085
- url=self.StockNewsAnalysisApiUrl+'/'+folderName+'/'+self.Symbol+'.json'
1086
-
1087
- # 请求数据
1088
- try :
1089
- print('[JSSymbolData::GetNewsAnalysisData] jobID , url ', jobID, url)
1090
- response=requests.get(url)
1091
- jsonData=response.json()
1092
- except :
1093
- # 没有新闻使用0数据填充
1094
- aryData=[]
1095
- for kline in self.SourceData.Data :
1096
- item=SingleData()
1097
- item.Date=kline.Date
1098
- item.Value=0
1099
- aryData.append(item)
1100
-
1101
- bindData=ChartData(data=aryData)
1102
- self.NewsAnalysisData[jobID]=bindData.GetValue()
1103
- return
1104
-
1105
- if not JSComplierHelper.IsJsonExist(jsonData,'data') or not JSComplierHelper.IsJsonExist(jsonData,'date') :
1106
- return
1107
- analyzeData=jsonData['data'] # 数据
1108
- analyzeDate=jsonData['date'] # 日期
1109
- dataLen=len(analyzeData)
1110
- if dataLen <=0 :
1111
- return
1112
-
1113
- # console.log('[JSSymbolData::RecvNewsAnalysisData] jobID',jobID, data.update);
1114
- if (jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE or jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE2) :
1115
-
1116
- aryData, aryData2 = [],[]
1117
- analyzeData2=jsonData['data2'] # 第2组数据
1118
- for i in range(dataLen) :
1119
- item=SingleData()
1120
- item.Date=analyzeDate[i]
1121
- item.Value=analyzeData[i]
1122
- if JSComplierHelper.IsNumber(item.Value) :
1123
- aryData.append(item)
1124
-
1125
- if i<len(analyzeData2) :
1126
- item=SingleData()
1127
- item.Date=analyzeDate[i]
1128
- item.Value=analyzeData2[i]
1129
- if JSComplierHelper.IsNumber(item.Value) :
1130
- aryData2.append(item)
1131
-
1132
- aryFixedData=self.SourceData.GetFittingData2(aryData,0)
1133
- bindData=ChartData(data=aryFixedData)
1134
- self.NewsAnalysisData[JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE]=bindData.GetValue()
1135
-
1136
- aryFixedData=self.SourceData.GetFittingData2(aryData2,0)
1137
- bindData=ChartData(data=aryFixedData)
1138
- self.NewsAnalysisData[JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE2]=bindData.GetValue()
1139
-
1140
- else :
1141
- aryData=[]
1142
- for i in range(dataLen) :
1143
- item=SingleData()
1144
- item.Date=analyzeDate[i]
1145
- item.Value=analyzeData[i]
1146
- aryData.append(item)
1147
-
1148
- aryFixedData=self.SourceData.GetFittingData2(aryData,0)
1149
- bindData=ChartData(data=aryFixedData)
1150
- self.NewsAnalysisData[jobID]=bindData.GetValue()
1151
-
1152
-
1153
- # 资讯统计数据
1154
- def GetNewsAnalysisCacheData(self,id,node) :
1155
- jobID=JS_EXECUTE_JOB_ID.GetNewsAnalysisID(id)
1156
- if not jobID :
1157
- self.ThrowUnexpectedNode(node,'不支持NEWS('+int(id)+')')
1158
-
1159
- if jobID in self.NewsAnalysisData :
1160
- return self.NewsAnalysisData[jobID]
1161
-
1162
- return []
1163
-
1164
- # CODELIKE 模糊股票代码
1165
- def CODELIKE(self, value) :
1166
- if self.Symbol and self.Symbol.find(value)==0 :
1167
- return 1
1168
- return 0
1169
-
1170
- def NAMELIKE(self, value) :
1171
- if self.Name and self.Name.find(value)==0 :
1172
- return 1
1173
- return 0
1174
-
1175
-
1176
- # SETCODE 市场类型
1177
- # 0:深圳 1:上海,47:中金所期货 28:郑州商品 29:大连商品 30:上海商品,27:香港指数 31:香港主板,48:香港创业板...
1178
- def SETCODE(self) :
1179
- if '.sh' in self.Symbol :
1180
- return 1
1181
- if '.sz' in self.Symbol :
1182
- return 0
1183
- return 0
1184
-
1185
- def DATE(self) :
1186
- result=[]
1187
- if not self.Data :
1188
- return result
1189
- return self.Data.GetDate()
1190
-
1191
- def YEAR(self) :
1192
- result=[]
1193
- if not self.Data :
1194
- return result
1195
- return self.Data.GetYear()
1196
-
1197
- def MONTH(self) :
1198
- result=[]
1199
- if not self.Data :
1200
- return result
1201
- return self.Data.GetMonth()
1202
-
1203
- def WEEK(self) :
1204
- result=[]
1205
- if not self.Data :
1206
- return result
1207
- return self.Data.GetWeek()
1208
-
1209
- def REFDATE(self,data,date) :
1210
- index=None
1211
- for i in range(len(self.Data.Data)) : # 查找日期对应的索引
1212
- if self.Data.Data[i].Date==date :
1213
- index=i
1214
- break
1215
-
1216
- if index==None or index>=len(data) :
1217
- return None
1218
-
1219
- return data[index]
1220
-
1221
- # 用法:结果从0到11,依次分别是1/5/15/30/60分钟,日/周/月,多分钟,多日,季,年
1222
- def PERIOD(self) :
1223
- # Period周期 0=日线 1=周线 2=月线 3=年线 4=1分钟 5=5分钟 6=15分钟 7=30分钟 8=60分钟
1224
- PERIOD_MAP=[5,6,7,11, 0,1,2,3,4,5]
1225
- return PERIOD_MAP[self.Period]
1226
-
1227
- def GetCurrBarsCount(self):
1228
- if (not self.Data):
1229
- return []
1230
- lCount=self.Data.GetCount()
1231
- if (lCount<=0):
1232
- return []
1233
-
1234
- result=[]
1235
- for i in range(lCount-1, -1, -1):
1236
- result.append(i+1) #数据从1开始
1237
-
1238
- return result