axdata 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. axdata/__init__.py +16 -0
  2. axdata/cache.py +19 -0
  3. axdata/client.py +1223 -0
  4. axdata-0.1.0.dist-info/METADATA +238 -0
  5. axdata-0.1.0.dist-info/RECORD +427 -0
  6. axdata-0.1.0.dist-info/WHEEL +5 -0
  7. axdata-0.1.0.dist-info/entry_points.txt +8 -0
  8. axdata-0.1.0.dist-info/licenses/LICENSE +162 -0
  9. axdata-0.1.0.dist-info/top_level.txt +6 -0
  10. axdata_core/__init__.py +221 -0
  11. axdata_core/_tdx_wire/__init__.py +35 -0
  12. axdata_core/_tdx_wire/_shim.py +140 -0
  13. axdata_core/_tdx_wire/api/__init__.py +51 -0
  14. axdata_core/_tdx_wire/api/auction.py +24 -0
  15. axdata_core/_tdx_wire/api/bars.py +24 -0
  16. axdata_core/_tdx_wire/api/base.py +26 -0
  17. axdata_core/_tdx_wire/api/codes.py +25 -0
  18. axdata_core/_tdx_wire/api/corporate.py +24 -0
  19. axdata_core/_tdx_wire/api/finance.py +24 -0
  20. axdata_core/_tdx_wire/api/intraday.py +24 -0
  21. axdata_core/_tdx_wire/api/quotes.py +26 -0
  22. axdata_core/_tdx_wire/api/resources.py +25 -0
  23. axdata_core/_tdx_wire/api/session.py +24 -0
  24. axdata_core/_tdx_wire/api/trades.py +24 -0
  25. axdata_core/_tdx_wire/client.py +33 -0
  26. axdata_core/_tdx_wire/exceptions.py +27 -0
  27. axdata_core/_tdx_wire/hosts.py +106 -0
  28. axdata_core/_tdx_wire/models/__init__.py +93 -0
  29. axdata_core/_tdx_wire/models/auction.py +26 -0
  30. axdata_core/_tdx_wire/models/corporate.py +27 -0
  31. axdata_core/_tdx_wire/models/finance.py +26 -0
  32. axdata_core/_tdx_wire/models/intraday.py +31 -0
  33. axdata_core/_tdx_wire/models/kline.py +27 -0
  34. axdata_core/_tdx_wire/models/quote.py +32 -0
  35. axdata_core/_tdx_wire/models/resource.py +24 -0
  36. axdata_core/_tdx_wire/models/security.py +24 -0
  37. axdata_core/_tdx_wire/models/session.py +27 -0
  38. axdata_core/_tdx_wire/models/subchart.py +25 -0
  39. axdata_core/_tdx_wire/models/trade.py +28 -0
  40. axdata_core/_tdx_wire/protocol/__init__.py +49 -0
  41. axdata_core/_tdx_wire/protocol/commands/__init__.py +43 -0
  42. axdata_core/_tdx_wire/protocol/commands/auction.py +110 -0
  43. axdata_core/_tdx_wire/protocol/commands/codec.py +43 -0
  44. axdata_core/_tdx_wire/protocol/commands/corporate.py +98 -0
  45. axdata_core/_tdx_wire/protocol/commands/finance.py +96 -0
  46. axdata_core/_tdx_wire/protocol/commands/intraday.py +122 -0
  47. axdata_core/_tdx_wire/protocol/commands/klines.py +102 -0
  48. axdata_core/_tdx_wire/protocol/commands/lookup.py +36 -0
  49. axdata_core/_tdx_wire/protocol/commands/price_limits.py +89 -0
  50. axdata_core/_tdx_wire/protocol/commands/quotes.py +102 -0
  51. axdata_core/_tdx_wire/protocol/commands/registry.py +36 -0
  52. axdata_core/_tdx_wire/protocol/commands/resources.py +99 -0
  53. axdata_core/_tdx_wire/protocol/commands/security.py +103 -0
  54. axdata_core/_tdx_wire/protocol/commands/session.py +82 -0
  55. axdata_core/_tdx_wire/protocol/commands/subchart.py +97 -0
  56. axdata_core/_tdx_wire/protocol/commands/trades.py +107 -0
  57. axdata_core/_tdx_wire/protocol/constants.py +124 -0
  58. axdata_core/_tdx_wire/protocol/frame.py +68 -0
  59. axdata_core/_tdx_wire/protocol/unit.py +85 -0
  60. axdata_core/_tdx_wire/py.typed +1 -0
  61. axdata_core/_tdx_wire/transport/__init__.py +34 -0
  62. axdata_core/_tdx_wire/transport/base.py +25 -0
  63. axdata_core/_tdx_wire/transport/memory.py +24 -0
  64. axdata_core/_tdx_wire/transport/pool.py +32 -0
  65. axdata_core/_tdx_wire/transport/socket.py +39 -0
  66. axdata_core/adapters/__init__.py +0 -0
  67. axdata_core/adapters/cls/__init__.py +17 -0
  68. axdata_core/adapters/cls/provider_bridge.py +23 -0
  69. axdata_core/adapters/cls/request.py +632 -0
  70. axdata_core/adapters/cls/source_adapter_registry.py +31 -0
  71. axdata_core/adapters/cninfo/__init__.py +17 -0
  72. axdata_core/adapters/cninfo/provider_bridge.py +25 -0
  73. axdata_core/adapters/cninfo/request.py +2425 -0
  74. axdata_core/adapters/cninfo/source_adapter_registry.py +42 -0
  75. axdata_core/adapters/eastmoney/__init__.py +17 -0
  76. axdata_core/adapters/eastmoney/provider_bridge.py +25 -0
  77. axdata_core/adapters/eastmoney/request.py +1128 -0
  78. axdata_core/adapters/eastmoney/source_adapter_registry.py +42 -0
  79. axdata_core/adapters/exchange/__init__.py +17 -0
  80. axdata_core/adapters/exchange/provider_bridge.py +25 -0
  81. axdata_core/adapters/exchange/request.py +1214 -0
  82. axdata_core/adapters/exchange/source_adapter_registry.py +42 -0
  83. axdata_core/adapters/kph/__init__.py +17 -0
  84. axdata_core/adapters/kph/provider_bridge.py +23 -0
  85. axdata_core/adapters/kph/request.py +509 -0
  86. axdata_core/adapters/kph/source_adapter_registry.py +31 -0
  87. axdata_core/adapters/sina/__init__.py +17 -0
  88. axdata_core/adapters/sina/provider_bridge.py +25 -0
  89. axdata_core/adapters/sina/request.py +5155 -0
  90. axdata_core/adapters/sina/source_adapter_registry.py +42 -0
  91. axdata_core/adapters/tdx/__init__.py +32 -0
  92. axdata_core/adapters/tdx/adjustment.py +50 -0
  93. axdata_core/adapters/tdx/adjustment_fetch.py +51 -0
  94. axdata_core/adapters/tdx/auction_fetch.py +51 -0
  95. axdata_core/adapters/tdx/client_factory.py +110 -0
  96. axdata_core/adapters/tdx/code_fetch.py +62 -0
  97. axdata_core/adapters/tdx/codes.py +54 -0
  98. axdata_core/adapters/tdx/derived_rows.py +69 -0
  99. axdata_core/adapters/tdx/downloader.py +193 -0
  100. axdata_core/adapters/tdx/downloader_interface_sets.py +50 -0
  101. axdata_core/adapters/tdx/downloader_profiles.py +43 -0
  102. axdata_core/adapters/tdx/downloader_registry.py +115 -0
  103. axdata_core/adapters/tdx/execution_utils.py +55 -0
  104. axdata_core/adapters/tdx/f10_executor.py +57 -0
  105. axdata_core/adapters/tdx/f10_normalize.py +61 -0
  106. axdata_core/adapters/tdx/f10_params.py +57 -0
  107. axdata_core/adapters/tdx/f10_postprocess.py +67 -0
  108. axdata_core/adapters/tdx/f10_render.py +48 -0
  109. axdata_core/adapters/tdx/f10_request.py +62 -0
  110. axdata_core/adapters/tdx/finance_fetch.py +61 -0
  111. axdata_core/adapters/tdx/finance_maps.py +54 -0
  112. axdata_core/adapters/tdx/finance_normalize.py +57 -0
  113. axdata_core/adapters/tdx/host_config.py +115 -0
  114. axdata_core/adapters/tdx/interface_sets.py +50 -0
  115. axdata_core/adapters/tdx/intraday_fetch.py +68 -0
  116. axdata_core/adapters/tdx/kline_helpers.py +58 -0
  117. axdata_core/adapters/tdx/limit_ladder_fetch.py +60 -0
  118. axdata_core/adapters/tdx/limit_ladder_topics.py +53 -0
  119. axdata_core/adapters/tdx/normalize_utils.py +75 -0
  120. axdata_core/adapters/tdx/options.py +61 -0
  121. axdata_core/adapters/tdx/price_limit_calendar.py +49 -0
  122. axdata_core/adapters/tdx/price_limit_fetch.py +53 -0
  123. axdata_core/adapters/tdx/price_limit_history.py +50 -0
  124. axdata_core/adapters/tdx/price_limits.py +58 -0
  125. axdata_core/adapters/tdx/provider_bridge.py +68 -0
  126. axdata_core/adapters/tdx/quote_fetch.py +61 -0
  127. axdata_core/adapters/tdx/quote_identity.py +49 -0
  128. axdata_core/adapters/tdx/rank_fetch.py +55 -0
  129. axdata_core/adapters/tdx/rank_params.py +52 -0
  130. axdata_core/adapters/tdx/realtime_refresh.py +45 -0
  131. axdata_core/adapters/tdx/request.py +11 -0
  132. axdata_core/adapters/tdx/request_adapter_runtime.py +41 -0
  133. axdata_core/adapters/tdx/request_client.py +51 -0
  134. axdata_core/adapters/tdx/request_compat.py +89 -0
  135. axdata_core/adapters/tdx/request_dispatch.py +50 -0
  136. axdata_core/adapters/tdx/request_filters.py +60 -0
  137. axdata_core/adapters/tdx/request_host_config.py +110 -0
  138. axdata_core/adapters/tdx/request_limits.py +59 -0
  139. axdata_core/adapters/tdx/request_methods.py +41 -0
  140. axdata_core/adapters/tdx/request_params.py +62 -0
  141. axdata_core/adapters/tdx/request_seams.py +41 -0
  142. axdata_core/adapters/tdx/resources/__init__.py +0 -0
  143. axdata_core/adapters/tdx/resources/finance_maps/__init__.py +0 -0
  144. axdata_core/adapters/tdx/resources/finance_maps/incon.dat +3702 -0
  145. axdata_core/adapters/tdx/resources/finance_maps/tdxhy.cfg +5620 -0
  146. axdata_core/adapters/tdx/resources/finance_maps/tdxzs.cfg +605 -0
  147. axdata_core/adapters/tdx/security_codes.py +54 -0
  148. axdata_core/adapters/tdx/series_history.py +57 -0
  149. axdata_core/adapters/tdx/server_cache.py +58 -0
  150. axdata_core/adapters/tdx/snapshot_normalize.py +56 -0
  151. axdata_core/adapters/tdx/source_adapter_registry.py +69 -0
  152. axdata_core/adapters/tdx/source_execution.py +44 -0
  153. axdata_core/adapters/tdx/source_execution_registry.py +70 -0
  154. axdata_core/adapters/tdx/stats_cache.py +184 -0
  155. axdata_core/adapters/tdx/stats_models.py +159 -0
  156. axdata_core/adapters/tdx/stats_resource.py +304 -0
  157. axdata_core/adapters/tdx/status_fetch.py +55 -0
  158. axdata_core/adapters/tdx/time_series_normalize.py +67 -0
  159. axdata_core/adapters/tdx/tqlex.py +50 -0
  160. axdata_core/adapters/tdx/wire_requests.py +60 -0
  161. axdata_core/adapters/tdx_ext/__init__.py +66 -0
  162. axdata_core/adapters/tdx_ext/client.py +688 -0
  163. axdata_core/adapters/tdx_ext/exceptions.py +51 -0
  164. axdata_core/adapters/tdx_ext/host_config.py +40 -0
  165. axdata_core/adapters/tdx_ext/interface_sets.py +65 -0
  166. axdata_core/adapters/tdx_ext/local_cache.py +649 -0
  167. axdata_core/adapters/tdx_ext/models.py +96 -0
  168. axdata_core/adapters/tdx_ext/options.py +36 -0
  169. axdata_core/adapters/tdx_ext/pool.py +153 -0
  170. axdata_core/adapters/tdx_ext/provider_bridge.py +35 -0
  171. axdata_core/adapters/tdx_ext/request.py +498 -0
  172. axdata_core/adapters/tdx_ext/request_execution.py +118 -0
  173. axdata_core/adapters/tdx_ext/request_instruments.py +221 -0
  174. axdata_core/adapters/tdx_ext/request_normalize.py +356 -0
  175. axdata_core/adapters/tdx_ext/request_params.py +157 -0
  176. axdata_core/adapters/tdx_ext/request_series.py +98 -0
  177. axdata_core/adapters/tdx_ext/server_cache.py +13 -0
  178. axdata_core/adapters/tdx_ext/servers.py +35 -0
  179. axdata_core/adapters/tdx_ext/source_adapter_registry.py +42 -0
  180. axdata_core/adapters/tdx_ext/source_execution.py +19 -0
  181. axdata_core/adapters/tdx_ext/source_execution_registry.py +43 -0
  182. axdata_core/adapters/tencent/__init__.py +17 -0
  183. axdata_core/adapters/tencent/provider_bridge.py +25 -0
  184. axdata_core/adapters/tencent/request.py +729 -0
  185. axdata_core/adapters/tencent/source_adapter_registry.py +42 -0
  186. axdata_core/axp.py +1843 -0
  187. axdata_core/builtin_providers.py +586 -0
  188. axdata_core/builtin_source_declarations.py +156 -0
  189. axdata_core/cli.py +1818 -0
  190. axdata_core/collector_registry.py +227 -0
  191. axdata_core/collector_runner.py +1016 -0
  192. axdata_core/collector_scheduler.py +3155 -0
  193. axdata_core/collector_templates.py +339 -0
  194. axdata_core/data_browser.py +1696 -0
  195. axdata_core/diagnostics.py +734 -0
  196. axdata_core/downloader_engine.py +1480 -0
  197. axdata_core/downloader_registry.py +62 -0
  198. axdata_core/downloaders.py +1619 -0
  199. axdata_core/legacy_provider_adapter.py +68 -0
  200. axdata_core/paths.py +51 -0
  201. axdata_core/plugin_config.py +272 -0
  202. axdata_core/plugin_status.py +419 -0
  203. axdata_core/plugins.py +1363 -0
  204. axdata_core/provider_catalog.py +462 -0
  205. axdata_core/provider_registry.py +833 -0
  206. axdata_core/quality.py +86 -0
  207. axdata_core/query.py +242 -0
  208. axdata_core/resources/__init__.py +2 -0
  209. axdata_core/resources/tdx_extended_servers.json +22 -0
  210. axdata_core/resources/tdx_quote_servers.json +49 -0
  211. axdata_core/sample_collectors.py +42 -0
  212. axdata_core/schema.py +385 -0
  213. axdata_core/source_adapter_factory.py +95 -0
  214. axdata_core/source_adapter_options.py +18 -0
  215. axdata_core/source_errors.py +43 -0
  216. axdata_core/source_execution_options.py +37 -0
  217. axdata_core/source_execution_registry.py +27 -0
  218. axdata_core/source_projection.py +21 -0
  219. axdata_core/source_request.py +441 -0
  220. axdata_core/source_session.py +355 -0
  221. axdata_core/sources/__init__.py +40 -0
  222. axdata_core/sources/base.py +112 -0
  223. axdata_core/sources/catalog.py +60 -0
  224. axdata_core/sources/cls/__init__.py +5 -0
  225. axdata_core/sources/cls/catalog.py +231 -0
  226. axdata_core/sources/cninfo/__init__.py +5 -0
  227. axdata_core/sources/cninfo/catalog.py +1994 -0
  228. axdata_core/sources/display_docs.py +139 -0
  229. axdata_core/sources/eastmoney/__init__.py +5 -0
  230. axdata_core/sources/eastmoney/catalog.py +509 -0
  231. axdata_core/sources/exchange/__init__.py +5 -0
  232. axdata_core/sources/exchange/catalog.py +361 -0
  233. axdata_core/sources/kph/__init__.py +5 -0
  234. axdata_core/sources/kph/catalog.py +255 -0
  235. axdata_core/sources/sina/__init__.py +5 -0
  236. axdata_core/sources/sina/catalog.py +2951 -0
  237. axdata_core/sources/tdx/__init__.py +5 -0
  238. axdata_core/sources/tdx/catalog.py +4546 -0
  239. axdata_core/sources/tdx_ext/__init__.py +5 -0
  240. axdata_core/sources/tdx_ext/catalog.py +1518 -0
  241. axdata_core/sources/tencent/__init__.py +5 -0
  242. axdata_core/sources/tencent/catalog.py +370 -0
  243. axdata_core/storage.py +186 -0
  244. axdata_core/tdx_f10_catalog.py +52 -0
  245. axdata_core/tdx_f10_models.py +50 -0
  246. axdata_core/tdx_f10_names.py +47 -0
  247. axdata_core/tdx_f10_specs.py +56 -0
  248. axdata_core/tdx_plugin_required.py +43 -0
  249. axdata_core/tdx_server_config.py +65 -0
  250. axdata_core/trade_calendar_cache.py +397 -0
  251. axdata_source_cninfo/__init__.py +15 -0
  252. axdata_source_cninfo/adapter.py +31 -0
  253. axdata_source_cninfo/axdata-provider.json +384 -0
  254. axdata_source_cninfo/catalog.py +209 -0
  255. axdata_source_cninfo/metadata.py +8 -0
  256. axdata_source_cninfo/provider.py +41 -0
  257. axdata_source_tdx/__init__.py +15 -0
  258. axdata_source_tdx/_tdx_wire/__init__.py +26 -0
  259. axdata_source_tdx/_tdx_wire/_binary.py +218 -0
  260. axdata_source_tdx/_tdx_wire/_code_utils.py +42 -0
  261. axdata_source_tdx/_tdx_wire/_command_codec.py +186 -0
  262. axdata_source_tdx/_tdx_wire/_command_codes.py +74 -0
  263. axdata_source_tdx/_tdx_wire/_command_defaults.py +15 -0
  264. axdata_source_tdx/_tdx_wire/_command_dispatch.py +96 -0
  265. axdata_source_tdx/_tdx_wire/_command_layouts.py +96 -0
  266. axdata_source_tdx/_tdx_wire/_command_lookup.py +25 -0
  267. axdata_source_tdx/_tdx_wire/_command_metadata.py +32 -0
  268. axdata_source_tdx/_tdx_wire/_command_registry.py +61 -0
  269. axdata_source_tdx/_tdx_wire/_connection_defaults.py +13 -0
  270. axdata_source_tdx/_tdx_wire/_host_defaults.py +51 -0
  271. axdata_source_tdx/_tdx_wire/_host_probe.py +81 -0
  272. axdata_source_tdx/_tdx_wire/_host_resource.py +70 -0
  273. axdata_source_tdx/_tdx_wire/_host_utils.py +31 -0
  274. axdata_source_tdx/_tdx_wire/_market.py +66 -0
  275. axdata_source_tdx/_tdx_wire/_request_defaults.py +11 -0
  276. axdata_source_tdx/_tdx_wire/_security_classification.py +61 -0
  277. axdata_source_tdx/_tdx_wire/_time_utils.py +7 -0
  278. axdata_source_tdx/_tdx_wire/api/__init__.py +45 -0
  279. axdata_source_tdx/_tdx_wire/api/auction.py +25 -0
  280. axdata_source_tdx/_tdx_wire/api/bars.py +31 -0
  281. axdata_source_tdx/_tdx_wire/api/base.py +39 -0
  282. axdata_source_tdx/_tdx_wire/api/codes.py +25 -0
  283. axdata_source_tdx/_tdx_wire/api/corporate.py +11 -0
  284. axdata_source_tdx/_tdx_wire/api/finance.py +10 -0
  285. axdata_source_tdx/_tdx_wire/api/intraday.py +38 -0
  286. axdata_source_tdx/_tdx_wire/api/quotes.py +78 -0
  287. axdata_source_tdx/_tdx_wire/api/resources.py +34 -0
  288. axdata_source_tdx/_tdx_wire/api/session.py +16 -0
  289. axdata_source_tdx/_tdx_wire/api/trades.py +34 -0
  290. axdata_source_tdx/_tdx_wire/client.py +470 -0
  291. axdata_source_tdx/_tdx_wire/exceptions.py +25 -0
  292. axdata_source_tdx/_tdx_wire/hosts.py +27 -0
  293. axdata_source_tdx/_tdx_wire/models/__init__.py +87 -0
  294. axdata_source_tdx/_tdx_wire/models/auction.py +58 -0
  295. axdata_source_tdx/_tdx_wire/models/corporate.py +59 -0
  296. axdata_source_tdx/_tdx_wire/models/finance.py +80 -0
  297. axdata_source_tdx/_tdx_wire/models/intraday.py +112 -0
  298. axdata_source_tdx/_tdx_wire/models/kline.py +58 -0
  299. axdata_source_tdx/_tdx_wire/models/quote.py +262 -0
  300. axdata_source_tdx/_tdx_wire/models/resource.py +18 -0
  301. axdata_source_tdx/_tdx_wire/models/security.py +28 -0
  302. axdata_source_tdx/_tdx_wire/models/session.py +30 -0
  303. axdata_source_tdx/_tdx_wire/models/subchart.py +39 -0
  304. axdata_source_tdx/_tdx_wire/models/trade.py +46 -0
  305. axdata_source_tdx/_tdx_wire/protocol/__init__.py +43 -0
  306. axdata_source_tdx/_tdx_wire/protocol/_frame_constants.py +5 -0
  307. axdata_source_tdx/_tdx_wire/protocol/commands/__init__.py +37 -0
  308. axdata_source_tdx/_tdx_wire/protocol/commands/auction.py +165 -0
  309. axdata_source_tdx/_tdx_wire/protocol/commands/codec.py +37 -0
  310. axdata_source_tdx/_tdx_wire/protocol/commands/corporate.py +163 -0
  311. axdata_source_tdx/_tdx_wire/protocol/commands/finance.py +180 -0
  312. axdata_source_tdx/_tdx_wire/protocol/commands/intraday.py +382 -0
  313. axdata_source_tdx/_tdx_wire/protocol/commands/klines.py +396 -0
  314. axdata_source_tdx/_tdx_wire/protocol/commands/lookup.py +31 -0
  315. axdata_source_tdx/_tdx_wire/protocol/commands/price_limits.py +110 -0
  316. axdata_source_tdx/_tdx_wire/protocol/commands/quotes.py +804 -0
  317. axdata_source_tdx/_tdx_wire/protocol/commands/registry.py +30 -0
  318. axdata_source_tdx/_tdx_wire/protocol/commands/resources.py +107 -0
  319. axdata_source_tdx/_tdx_wire/protocol/commands/security.py +163 -0
  320. axdata_source_tdx/_tdx_wire/protocol/commands/session.py +129 -0
  321. axdata_source_tdx/_tdx_wire/protocol/commands/subchart.py +182 -0
  322. axdata_source_tdx/_tdx_wire/protocol/commands/trades.py +275 -0
  323. axdata_source_tdx/_tdx_wire/protocol/constants.py +70 -0
  324. axdata_source_tdx/_tdx_wire/protocol/frame.py +141 -0
  325. axdata_source_tdx/_tdx_wire/protocol/unit.py +98 -0
  326. axdata_source_tdx/_tdx_wire/py.typed +1 -0
  327. axdata_source_tdx/_tdx_wire/transport/__init__.py +28 -0
  328. axdata_source_tdx/_tdx_wire/transport/base.py +21 -0
  329. axdata_source_tdx/_tdx_wire/transport/memory.py +42 -0
  330. axdata_source_tdx/_tdx_wire/transport/pool.py +148 -0
  331. axdata_source_tdx/_tdx_wire/transport/socket.py +373 -0
  332. axdata_source_tdx/adapter.py +31 -0
  333. axdata_source_tdx/adjustment.py +163 -0
  334. axdata_source_tdx/adjustment_fetch.py +148 -0
  335. axdata_source_tdx/auction_fetch.py +162 -0
  336. axdata_source_tdx/axdata-provider.json +23680 -0
  337. axdata_source_tdx/catalog.py +39 -0
  338. axdata_source_tdx/client_factory.py +61 -0
  339. axdata_source_tdx/code_fetch.py +579 -0
  340. axdata_source_tdx/codes.py +69 -0
  341. axdata_source_tdx/collectors.py +525 -0
  342. axdata_source_tdx/derived_rows.py +500 -0
  343. axdata_source_tdx/downloader.py +139 -0
  344. axdata_source_tdx/downloader_interface_sets.py +29 -0
  345. axdata_source_tdx/downloader_profiles.py +731 -0
  346. axdata_source_tdx/downloader_registry.py +85 -0
  347. axdata_source_tdx/execution_utils.py +141 -0
  348. axdata_source_tdx/f10_executor.py +414 -0
  349. axdata_source_tdx/f10_normalize.py +169 -0
  350. axdata_source_tdx/f10_params.py +221 -0
  351. axdata_source_tdx/f10_postprocess.py +405 -0
  352. axdata_source_tdx/f10_render.py +29 -0
  353. axdata_source_tdx/f10_request.py +365 -0
  354. axdata_source_tdx/finance_fetch.py +514 -0
  355. axdata_source_tdx/finance_maps.py +377 -0
  356. axdata_source_tdx/finance_normalize.py +273 -0
  357. axdata_source_tdx/host_config.py +51 -0
  358. axdata_source_tdx/interface_sets.py +180 -0
  359. axdata_source_tdx/intraday_fetch.py +600 -0
  360. axdata_source_tdx/kline_helpers.py +333 -0
  361. axdata_source_tdx/limit_ladder_fetch.py +614 -0
  362. axdata_source_tdx/limit_ladder_topics.py +280 -0
  363. axdata_source_tdx/metadata.py +8 -0
  364. axdata_source_tdx/normalize_utils.py +264 -0
  365. axdata_source_tdx/options.py +195 -0
  366. axdata_source_tdx/price_limit_calendar.py +106 -0
  367. axdata_source_tdx/price_limit_fetch.py +264 -0
  368. axdata_source_tdx/price_limit_history.py +100 -0
  369. axdata_source_tdx/price_limits.py +142 -0
  370. axdata_source_tdx/provider.py +44 -0
  371. axdata_source_tdx/provider_bridge.py +43 -0
  372. axdata_source_tdx/quote_fetch.py +485 -0
  373. axdata_source_tdx/quote_identity.py +50 -0
  374. axdata_source_tdx/rank_fetch.py +316 -0
  375. axdata_source_tdx/rank_params.py +181 -0
  376. axdata_source_tdx/realtime_refresh.py +51 -0
  377. axdata_source_tdx/request_adapter.py +533 -0
  378. axdata_source_tdx/request_adapter_runtime.py +302 -0
  379. axdata_source_tdx/request_client.py +98 -0
  380. axdata_source_tdx/request_compat.py +432 -0
  381. axdata_source_tdx/request_dispatch.py +138 -0
  382. axdata_source_tdx/request_entrypoints.py +146 -0
  383. axdata_source_tdx/request_filters.py +154 -0
  384. axdata_source_tdx/request_host_config.py +103 -0
  385. axdata_source_tdx/request_limits.py +15 -0
  386. axdata_source_tdx/request_methods.py +1910 -0
  387. axdata_source_tdx/request_params.py +225 -0
  388. axdata_source_tdx/request_seams.py +534 -0
  389. axdata_source_tdx/resources/__init__.py +0 -0
  390. axdata_source_tdx/resources/finance_maps/__init__.py +1 -0
  391. axdata_source_tdx/resources/finance_maps/incon.dat +3702 -0
  392. axdata_source_tdx/resources/finance_maps/tdxhy.cfg +5620 -0
  393. axdata_source_tdx/resources/finance_maps/tdxzs.cfg +605 -0
  394. axdata_source_tdx/resources/tdx_extended_servers.json +22 -0
  395. axdata_source_tdx/resources/tdx_quote_servers.json +49 -0
  396. axdata_source_tdx/security_codes.py +127 -0
  397. axdata_source_tdx/series_history.py +348 -0
  398. axdata_source_tdx/server_cache.py +21 -0
  399. axdata_source_tdx/snapshot_normalize.py +232 -0
  400. axdata_source_tdx/source_adapter_registry.py +42 -0
  401. axdata_source_tdx/source_execution.py +22 -0
  402. axdata_source_tdx/source_execution_registry.py +43 -0
  403. axdata_source_tdx/stats_cache.py +150 -0
  404. axdata_source_tdx/stats_models.py +161 -0
  405. axdata_source_tdx/stats_resource.py +242 -0
  406. axdata_source_tdx/status_fetch.py +209 -0
  407. axdata_source_tdx/tdx_f10_catalog.py +957 -0
  408. axdata_source_tdx/tdx_f10_models.py +47 -0
  409. axdata_source_tdx/tdx_f10_names.py +48 -0
  410. axdata_source_tdx/tdx_f10_specs.py +1142 -0
  411. axdata_source_tdx/tdx_server_config.py +389 -0
  412. axdata_source_tdx/time_series_normalize.py +370 -0
  413. axdata_source_tdx/tqlex.py +138 -0
  414. axdata_source_tdx/wire.py +32 -0
  415. axdata_source_tdx/wire_requests.py +190 -0
  416. axdata_source_tdx_ext/__init__.py +15 -0
  417. axdata_source_tdx_ext/adapter.py +31 -0
  418. axdata_source_tdx_ext/axdata-provider.json +9424 -0
  419. axdata_source_tdx_ext/catalog.py +33 -0
  420. axdata_source_tdx_ext/metadata.py +8 -0
  421. axdata_source_tdx_ext/provider.py +44 -0
  422. axdata_source_tencent/__init__.py +15 -0
  423. axdata_source_tencent/adapter.py +31 -0
  424. axdata_source_tencent/axdata-provider.json +291 -0
  425. axdata_source_tencent/catalog.py +190 -0
  426. axdata_source_tencent/metadata.py +8 -0
  427. axdata_source_tencent/provider.py +41 -0
@@ -0,0 +1,498 @@
1
+ """Source request adapter for TDX extended-asset local catalog interfaces."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Mapping, Sequence
6
+ from typing import Any
7
+
8
+ from axdata_core.source_errors import SourceAdapterNotFound, SourceRequestValidationError
9
+
10
+ from .interface_sets import (
11
+ EXT_ASSET_INTERFACE_TO_TYPE,
12
+ FUND_NAV_INTERFACE,
13
+ INTRADAY_INTERFACE_TO_TYPE,
14
+ KLINE_INTERFACE_TO_TYPE,
15
+ OPTION_CHAIN_INTERFACE,
16
+ QUOTE_INTERFACE_TO_TYPE,
17
+ SUPPORTED_INTERFACES,
18
+ TRADES_HISTORY_INTERFACE_TO_TYPE,
19
+ TRADES_TODAY_INTERFACE_TO_TYPE,
20
+ )
21
+ from .options import normalize_tdx_ext_request_options
22
+ from .request_params import (
23
+ EXT_KLINE_PERIODS as _EXT_KLINE_PERIODS,
24
+ asset_types_param as _asset_types_param,
25
+ bool_param as _bool_param,
26
+ code_filter as _code_filter,
27
+ contains_filter as _contains_filter,
28
+ exchange_filter as _exchange_filter,
29
+ float_param as _float_param,
30
+ limit_param as _limit_param,
31
+ normalize_code as _normalize_code,
32
+ optional_text as _optional_text,
33
+ period_param as _period_param,
34
+ required_text as _required_text,
35
+ string_values as _string_values,
36
+ )
37
+ from .request_series import (
38
+ request_intraday_rows_for_item as _tdx_ext_request_intraday_rows_for_item,
39
+ request_kline_rows_for_item as _tdx_ext_request_kline_rows_for_item,
40
+ request_trade_rows_for_item as _tdx_ext_request_trade_rows_for_item,
41
+ )
42
+ from .request_execution import request_items as _tdx_ext_request_items
43
+ from .request_execution import request_quotes as _tdx_ext_request_quotes
44
+ from .request_normalize import (
45
+ bar_to_row as _bar_to_row,
46
+ empty_option_chain_row as _empty_option_chain_row,
47
+ instrument_to_row as _instrument_to_row,
48
+ intraday_to_row as _intraday_to_row,
49
+ macro_bar_to_row as _macro_bar_to_row,
50
+ macro_indicator_category_from_symbol as _macro_indicator_category_from_symbol,
51
+ macro_metadata as _macro_metadata,
52
+ macro_snapshot_row as _macro_snapshot_row,
53
+ normalize_trade_price as _normalize_trade_price,
54
+ open_close_type as _open_close_type,
55
+ option_chain_rows as _option_chain_rows,
56
+ price_tick as _price_tick,
57
+ quote_snapshot_rows as _quote_snapshot_rows,
58
+ quote_to_row as _quote_to_row,
59
+ tick_decimals as _tick_decimals,
60
+ trade_price_scale as _trade_price_scale,
61
+ trade_to_row as _trade_to_row,
62
+ )
63
+ from .request_instruments import (
64
+ find_instrument as _tdx_ext_find_instrument,
65
+ fund_nav_rows as _tdx_ext_fund_nav_rows,
66
+ instrument_code_matches as _tdx_ext_instrument_code_matches,
67
+ request_market_rows as _tdx_ext_request_market_rows,
68
+ request_instrument_rows as _tdx_ext_request_instrument_rows,
69
+ resolve_option_chain_contracts as _tdx_ext_resolve_option_chain_contracts,
70
+ resolve_requested_instruments as _tdx_ext_resolve_requested_instruments,
71
+ text_matches_any as _tdx_ext_text_matches_any,
72
+ )
73
+
74
+
75
+ _LOCAL_CACHE_EXPORTS = {
76
+ "TdxExtLocalInstrument",
77
+ "load_tdx_ext_local_instruments",
78
+ "load_tdx_ext_local_markets",
79
+ }
80
+ _POOL_EXPORTS = {"TdxExtClientPool", "flatten_results", "resolve_tdx_ext_pool_config"}
81
+
82
+
83
+ def __getattr__(name: str) -> Any:
84
+ if name == "TdxExtClient":
85
+ from .client import TdxExtClient as value
86
+ elif name in _POOL_EXPORTS:
87
+ from . import pool as pool_module
88
+
89
+ value = getattr(pool_module, name)
90
+ elif name in _LOCAL_CACHE_EXPORTS:
91
+ from . import local_cache as local_cache_module
92
+
93
+ value = getattr(local_cache_module, name)
94
+ else:
95
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
96
+ globals()[name] = value
97
+ return value
98
+
99
+
100
+ def _tdx_ext_client_class() -> Any:
101
+ client = globals().get("TdxExtClient")
102
+ if client is not None:
103
+ return client
104
+ return __getattr__("TdxExtClient")
105
+
106
+
107
+ def _tdx_ext_pool_tools() -> tuple[Any, Any, Any]:
108
+ pool_class = globals().get("TdxExtClientPool")
109
+ flatten = globals().get("flatten_results")
110
+ resolver = globals().get("resolve_tdx_ext_pool_config")
111
+ if pool_class is None or flatten is None or resolver is None:
112
+ pool_class = __getattr__("TdxExtClientPool")
113
+ flatten = __getattr__("flatten_results")
114
+ resolver = __getattr__("resolve_tdx_ext_pool_config")
115
+ return pool_class, flatten, resolver
116
+
117
+
118
+ def _load_tdx_ext_local_markets(root: str | None) -> Any:
119
+ loader = globals().get("load_tdx_ext_local_markets")
120
+ if loader is None:
121
+ loader = __getattr__("load_tdx_ext_local_markets")
122
+ return loader(root)
123
+
124
+
125
+ def _load_tdx_ext_local_instruments(root: str | None) -> Any:
126
+ loader = globals().get("load_tdx_ext_local_instruments")
127
+ if loader is None:
128
+ loader = __getattr__("load_tdx_ext_local_instruments")
129
+ return loader(root)
130
+
131
+
132
+ class TdxExtRequestAdapter:
133
+ """Adapter that exposes verified extended-asset catalog data."""
134
+
135
+ source = "tdx_ext"
136
+
137
+ def __init__(
138
+ self,
139
+ options: Mapping[str, Any] | None = None,
140
+ *,
141
+ client_pool: Any | None = None,
142
+ client_pool_config: Any | None = None,
143
+ ) -> None:
144
+ self._options = normalize_tdx_ext_request_options(dict(options or {}))
145
+ self._client_pool = client_pool
146
+ self._client_pool_config = client_pool_config
147
+ self.last_meta: dict[str, Any] = {}
148
+
149
+ def supports(self, interface_name: str) -> bool:
150
+ return interface_name in SUPPORTED_INTERFACES
151
+
152
+ def request(self, interface_name: str, params: Mapping[str, Any]) -> list[dict[str, Any]]:
153
+ if not self.supports(interface_name):
154
+ raise SourceAdapterNotFound(
155
+ f"TDX extended source adapter does not support interface {interface_name!r}."
156
+ )
157
+
158
+ root = _optional_text(params.get("tdx_root"))
159
+ if interface_name == "tdx_ext_markets_tdx":
160
+ rows = self._request_markets(params, root=root)
161
+ origin = "local_tdx_extended_cache"
162
+ elif interface_name in QUOTE_INTERFACE_TO_TYPE:
163
+ rows = self._request_realtime_snapshot(interface_name, params, root=root)
164
+ origin = "tdx_extended_source"
165
+ elif interface_name in KLINE_INTERFACE_TO_TYPE:
166
+ rows = self._request_kline(interface_name, params, root=root)
167
+ origin = "tdx_extended_source"
168
+ elif interface_name in INTRADAY_INTERFACE_TO_TYPE:
169
+ rows = self._request_intraday(interface_name, params, root=root)
170
+ origin = "tdx_extended_source"
171
+ elif interface_name in TRADES_HISTORY_INTERFACE_TO_TYPE:
172
+ rows = self._request_trades(interface_name, params, root=root, is_history=True)
173
+ origin = "tdx_extended_source"
174
+ elif interface_name in TRADES_TODAY_INTERFACE_TO_TYPE:
175
+ rows = self._request_trades(interface_name, params, root=root, is_history=False)
176
+ origin = "tdx_extended_source"
177
+ elif interface_name == OPTION_CHAIN_INTERFACE:
178
+ rows = self._request_option_chain(params, root=root)
179
+ origin = "tdx_extended_source"
180
+ elif interface_name == FUND_NAV_INTERFACE:
181
+ rows = self._request_fund_nav(params, root=root)
182
+ origin = "local_tdx_extended_cache"
183
+ else:
184
+ rows = self._request_instruments(interface_name, params, root=root)
185
+ origin = "local_tdx_extended_cache"
186
+
187
+ self.last_meta = {
188
+ "source": self.source,
189
+ "persisted": False,
190
+ "count": len(rows),
191
+ "data_origin": origin,
192
+ }
193
+ self.last_meta.update(self._execution_meta())
194
+ return rows
195
+
196
+ def _request_markets(self, params: Mapping[str, Any], *, root: str | None) -> list[dict[str, Any]]:
197
+ return _tdx_ext_request_market_rows(
198
+ params,
199
+ root=root,
200
+ load_markets=_load_tdx_ext_local_markets,
201
+ asset_types_param=_asset_types_param,
202
+ contains_filter=_contains_filter,
203
+ limit_param=_limit_param,
204
+ )
205
+
206
+ def _request_realtime_snapshot(
207
+ self,
208
+ interface_name: str,
209
+ params: Mapping[str, Any],
210
+ *,
211
+ root: str | None,
212
+ ) -> list[dict[str, Any]]:
213
+ asset_type = QUOTE_INTERFACE_TO_TYPE[interface_name]
214
+ instruments = _resolve_requested_instruments(params, asset_type=asset_type, root=root)
215
+ code_list = [(item.market_id, item.symbol) for item in instruments]
216
+ timeout = _float_param(params.get("timeout"), default=6.0)
217
+ quotes, pool_config, task_count = _tdx_ext_request_quotes(
218
+ code_list,
219
+ options=self._options,
220
+ root=root,
221
+ server_cache_root=self._server_cache_root(),
222
+ timeout=timeout,
223
+ client_factory=_tdx_ext_client_class(),
224
+ pool_tools=_tdx_ext_pool_tools(),
225
+ client_pool=self._client_pool,
226
+ client_pool_config=self._client_pool_config,
227
+ )
228
+ if pool_config:
229
+ self._set_parallel_meta(pool_config, task_count=task_count or 0)
230
+
231
+ return _quote_snapshot_rows(
232
+ instruments,
233
+ quotes,
234
+ macro_snapshot=interface_name == "macro_indicator_snapshot_tdx",
235
+ find_instrument=lambda code: _find_instrument(code, asset_type=asset_type, root=root),
236
+ )
237
+
238
+ def _request_option_chain(
239
+ self,
240
+ params: Mapping[str, Any],
241
+ *,
242
+ root: str | None,
243
+ ) -> list[dict[str, Any]]:
244
+ contracts = _resolve_option_chain_contracts(params, root=root)
245
+ if not contracts:
246
+ return []
247
+
248
+ code_list = [(item.market_id, item.symbol) for item in contracts]
249
+ timeout = _float_param(params.get("timeout"), default=6.0)
250
+ quotes, pool_config, task_count = _tdx_ext_request_quotes(
251
+ code_list,
252
+ options=self._options,
253
+ root=root,
254
+ server_cache_root=self._server_cache_root(),
255
+ timeout=timeout,
256
+ client_factory=_tdx_ext_client_class(),
257
+ pool_tools=_tdx_ext_pool_tools(),
258
+ client_pool=self._client_pool,
259
+ client_pool_config=self._client_pool_config,
260
+ )
261
+ if pool_config:
262
+ self._set_parallel_meta(pool_config, task_count=task_count or 0)
263
+
264
+ return _option_chain_rows(contracts, quotes)
265
+
266
+ def _request_fund_nav(
267
+ self,
268
+ params: Mapping[str, Any],
269
+ *,
270
+ root: str | None,
271
+ ) -> list[dict[str, Any]]:
272
+ instruments = _resolve_requested_instruments(params, asset_type="fund", root=root)
273
+ return _tdx_ext_fund_nav_rows(instruments)
274
+
275
+ def _request_trades(
276
+ self,
277
+ interface_name: str,
278
+ params: Mapping[str, Any],
279
+ *,
280
+ root: str | None,
281
+ is_history: bool,
282
+ ) -> list[dict[str, Any]]:
283
+ asset_type = (
284
+ TRADES_HISTORY_INTERFACE_TO_TYPE[interface_name]
285
+ if is_history
286
+ else TRADES_TODAY_INTERFACE_TO_TYPE[interface_name]
287
+ )
288
+ instruments = _resolve_requested_instruments(params, asset_type=asset_type, root=root)
289
+ trade_date = _required_text(params.get("trade_date"), "trade_date") if is_history else None
290
+ all_rows = _bool_param(params.get("all"), default=False)
291
+ limit = _limit_param(params, default=100000 if all_rows else 120, maximum=100000)
292
+ page_size = _limit_param({"limit": params.get("page_size", 1800)}, default=1800, maximum=1800)
293
+ timeout = _float_param(params.get("timeout"), default=6.0)
294
+ pool_tools = _tdx_ext_pool_tools()
295
+ flatten_results = pool_tools[1]
296
+
297
+ def request_item_trades(client: Any, item: TdxExtLocalInstrument) -> list[dict[str, Any]]:
298
+ return _tdx_ext_request_trade_rows_for_item(
299
+ client,
300
+ item,
301
+ is_history=is_history,
302
+ trade_date=trade_date,
303
+ all_rows=all_rows,
304
+ limit=limit,
305
+ page_size=page_size,
306
+ flatten_results=flatten_results,
307
+ )
308
+
309
+ rows, pool_config, task_count = _tdx_ext_request_items(
310
+ instruments,
311
+ options=self._options,
312
+ root=root,
313
+ server_cache_root=self._server_cache_root(),
314
+ timeout=timeout,
315
+ client_factory=_tdx_ext_client_class(),
316
+ pool_tools=pool_tools,
317
+ request_item=request_item_trades,
318
+ client_pool=self._client_pool,
319
+ client_pool_config=self._client_pool_config,
320
+ )
321
+ if pool_config:
322
+ self._set_parallel_meta(pool_config, task_count=task_count or 0)
323
+ return rows
324
+
325
+ def _request_kline(
326
+ self,
327
+ interface_name: str,
328
+ params: Mapping[str, Any],
329
+ *,
330
+ root: str | None,
331
+ ) -> list[dict[str, Any]]:
332
+ asset_type = KLINE_INTERFACE_TO_TYPE[interface_name]
333
+ instruments = _resolve_requested_instruments(params, asset_type=asset_type, root=root)
334
+ period_name = _period_param(params.get("period"), default="day")
335
+ period_raw = _EXT_KLINE_PERIODS[period_name]
336
+ count = _limit_param(params, default=30, maximum=800)
337
+ timeout = _float_param(params.get("timeout"), default=6.0)
338
+
339
+ def request_item_kline(client: Any, item: TdxExtLocalInstrument) -> list[dict[str, Any]]:
340
+ return _tdx_ext_request_kline_rows_for_item(
341
+ client,
342
+ item,
343
+ interface_name=interface_name,
344
+ period_raw=period_raw,
345
+ period_name=period_name,
346
+ count=count,
347
+ )
348
+
349
+ rows, pool_config, task_count = _tdx_ext_request_items(
350
+ instruments,
351
+ options=self._options,
352
+ root=root,
353
+ server_cache_root=self._server_cache_root(),
354
+ timeout=timeout,
355
+ client_factory=_tdx_ext_client_class(),
356
+ pool_tools=_tdx_ext_pool_tools(),
357
+ request_item=request_item_kline,
358
+ client_pool=self._client_pool,
359
+ client_pool_config=self._client_pool_config,
360
+ )
361
+ if pool_config:
362
+ self._set_parallel_meta(pool_config, task_count=task_count or 0)
363
+ return rows
364
+
365
+ def _request_intraday(
366
+ self,
367
+ interface_name: str,
368
+ params: Mapping[str, Any],
369
+ *,
370
+ root: str | None,
371
+ ) -> list[dict[str, Any]]:
372
+ asset_type = INTRADAY_INTERFACE_TO_TYPE[interface_name]
373
+ instruments = _resolve_requested_instruments(params, asset_type=asset_type, root=root)
374
+ is_history = interface_name.endswith("_history_tdx")
375
+ trade_date = _required_text(params.get("trade_date"), "trade_date") if is_history else None
376
+ timeout = _float_param(params.get("timeout"), default=6.0)
377
+
378
+ def request_item_intraday(client: Any, item: TdxExtLocalInstrument) -> list[dict[str, Any]]:
379
+ return _tdx_ext_request_intraday_rows_for_item(
380
+ client,
381
+ item,
382
+ is_history=is_history,
383
+ trade_date=trade_date,
384
+ )
385
+
386
+ rows, pool_config, task_count = _tdx_ext_request_items(
387
+ instruments,
388
+ options=self._options,
389
+ root=root,
390
+ server_cache_root=self._server_cache_root(),
391
+ timeout=timeout,
392
+ client_factory=_tdx_ext_client_class(),
393
+ pool_tools=_tdx_ext_pool_tools(),
394
+ request_item=request_item_intraday,
395
+ client_pool=self._client_pool,
396
+ client_pool_config=self._client_pool_config,
397
+ )
398
+ if pool_config:
399
+ self._set_parallel_meta(pool_config, task_count=task_count or 0)
400
+ return rows
401
+
402
+ def _server_cache_root(self) -> str | None:
403
+ value = self._options.get("server_cache_root")
404
+ return str(value) if value not in (None, "") else None
405
+
406
+ def _set_parallel_meta(self, pool_config: Any, *, task_count: int) -> None:
407
+ self._parallel_meta = {
408
+ "tdx_ext_parallel": True,
409
+ "tdx_ext_source_server_count": pool_config.source_server_count,
410
+ "tdx_ext_connections_per_server": pool_config.requested_connections_per_server,
411
+ "tdx_ext_connection_count": pool_config.connection_count,
412
+ "tdx_ext_task_count": task_count,
413
+ }
414
+
415
+ def _execution_meta(self) -> dict[str, Any]:
416
+ meta = getattr(self, "_parallel_meta", None)
417
+ if isinstance(meta, dict):
418
+ self._parallel_meta = None
419
+ return dict(meta)
420
+ return {"tdx_ext_parallel": False}
421
+
422
+ def _request_instruments(
423
+ self,
424
+ interface_name: str,
425
+ params: Mapping[str, Any],
426
+ *,
427
+ root: str | None,
428
+ ) -> list[dict[str, Any]]:
429
+ return _tdx_ext_request_instrument_rows(
430
+ interface_name,
431
+ params,
432
+ root=root,
433
+ asset_type_map=EXT_ASSET_INTERFACE_TO_TYPE,
434
+ load_instruments=_load_tdx_ext_local_instruments,
435
+ asset_types_param=_asset_types_param,
436
+ code_filter=_code_filter,
437
+ exchange_filter=_exchange_filter,
438
+ contains_filter=_contains_filter,
439
+ limit_param=_limit_param,
440
+ normalize_code=_normalize_code,
441
+ instrument_to_row=_instrument_to_row,
442
+ )
443
+
444
+
445
+ def _resolve_requested_instruments(
446
+ params: Mapping[str, Any],
447
+ *,
448
+ asset_type: str,
449
+ root: str | None,
450
+ ) -> list[TdxExtLocalInstrument]:
451
+ return _tdx_ext_resolve_requested_instruments(
452
+ params,
453
+ asset_type=asset_type,
454
+ root=root,
455
+ load_instruments=_load_tdx_ext_local_instruments,
456
+ code_filter=_code_filter,
457
+ normalize_code=_normalize_code,
458
+ validation_error=SourceRequestValidationError,
459
+ )
460
+
461
+
462
+ def _find_instrument(
463
+ code: str,
464
+ *,
465
+ asset_type: str,
466
+ root: str | None,
467
+ ) -> TdxExtLocalInstrument | None:
468
+ return _tdx_ext_find_instrument(
469
+ code,
470
+ asset_type=asset_type,
471
+ root=root,
472
+ load_instruments=_load_tdx_ext_local_instruments,
473
+ normalize_code=_normalize_code,
474
+ )
475
+
476
+
477
+ def _resolve_option_chain_contracts(
478
+ params: Mapping[str, Any],
479
+ *,
480
+ root: str | None,
481
+ ) -> list[TdxExtLocalInstrument]:
482
+ return _tdx_ext_resolve_option_chain_contracts(
483
+ params,
484
+ root=root,
485
+ load_instruments=_load_tdx_ext_local_instruments,
486
+ contains_filter=_contains_filter,
487
+ string_values=_string_values,
488
+ exchange_filter=_exchange_filter,
489
+ limit_param=_limit_param,
490
+ )
491
+
492
+
493
+ def _instrument_code_matches(item: TdxExtLocalInstrument, codes: set[str]) -> bool:
494
+ return _tdx_ext_instrument_code_matches(item, codes, normalize_code=_normalize_code)
495
+
496
+
497
+ def _text_matches_any(values: Sequence[Any], filters: Sequence[str]) -> bool:
498
+ return _tdx_ext_text_matches_any(values, filters)
@@ -0,0 +1,118 @@
1
+ """Execution helpers for TDX extended market source requests."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Callable, Mapping, Sequence
6
+ from typing import Any, TypeVar
7
+
8
+ T = TypeVar("T")
9
+ R = TypeVar("R")
10
+
11
+
12
+ def chunked(values: Sequence[T], size: int) -> list[list[T]]:
13
+ """Split a sequence into stable, non-empty chunks."""
14
+
15
+ chunk_size = max(1, int(size))
16
+ return [list(values[index : index + chunk_size]) for index in range(0, len(values), chunk_size)]
17
+
18
+
19
+ def request_quotes(
20
+ code_list: Sequence[tuple[int, str]],
21
+ *,
22
+ options: Mapping[str, Any],
23
+ root: str | None,
24
+ server_cache_root: str | None,
25
+ timeout: float,
26
+ client_factory: Any,
27
+ pool_tools: tuple[Any, Any, Any],
28
+ client_pool: Any | None = None,
29
+ client_pool_config: Any | None = None,
30
+ ) -> tuple[tuple[Any, ...], Any | None, int | None]:
31
+ """Fetch quote rows with the configured pool when useful."""
32
+
33
+ TdxExtClientPool, flatten_results, resolve_tdx_ext_pool_config = pool_tools
34
+ if client_pool is not None:
35
+ connection_count = max(1, int(getattr(client_pool, "connection_count", 1)))
36
+ quote_batches = chunked(
37
+ code_list,
38
+ max(1, (len(code_list) + connection_count - 1) // connection_count),
39
+ )
40
+ quotes = tuple(
41
+ flatten_results(
42
+ client_pool.map(
43
+ quote_batches,
44
+ lambda client, batch: client.get_quote_multi(batch),
45
+ )
46
+ )
47
+ )
48
+ return quotes, client_pool_config, len(quote_batches)
49
+
50
+ pool_config = resolve_tdx_ext_pool_config(dict(options), minimum_tasks=len(code_list))
51
+ if pool_config:
52
+ quote_batches = chunked(
53
+ code_list,
54
+ max(1, (len(code_list) + pool_config.connection_count - 1) // pool_config.connection_count),
55
+ )
56
+ with TdxExtClientPool(
57
+ servers=pool_config.servers,
58
+ connections_per_server=pool_config.connections_per_server,
59
+ connection_count=pool_config.connection_count,
60
+ timeout=timeout,
61
+ client_factory=client_factory,
62
+ ) as pool:
63
+ quotes = tuple(
64
+ flatten_results(
65
+ pool.map(
66
+ quote_batches,
67
+ lambda client, batch: client.get_quote_multi(batch),
68
+ )
69
+ )
70
+ )
71
+ return quotes, pool_config, len(quote_batches)
72
+
73
+ with client_factory.from_config(
74
+ tdx_root=root,
75
+ server_cache_root=server_cache_root,
76
+ timeout=timeout,
77
+ ) as client:
78
+ return tuple(client.get_quote_multi(code_list)), None, None
79
+
80
+
81
+ def request_items(
82
+ items: Sequence[T],
83
+ *,
84
+ options: Mapping[str, Any],
85
+ root: str | None,
86
+ server_cache_root: str | None,
87
+ timeout: float,
88
+ client_factory: Any,
89
+ pool_tools: tuple[Any, Any, Any],
90
+ request_item: Callable[[Any, T], Sequence[R]],
91
+ client_pool: Any | None = None,
92
+ client_pool_config: Any | None = None,
93
+ ) -> tuple[list[R], Any | None, int | None]:
94
+ """Run independent item requests with pool/single-client fallback."""
95
+
96
+ TdxExtClientPool, flatten_results, resolve_tdx_ext_pool_config = pool_tools
97
+ if client_pool is not None:
98
+ rows = flatten_results(client_pool.map(items, request_item))
99
+ return rows, client_pool_config, len(items)
100
+
101
+ pool_config = resolve_tdx_ext_pool_config(dict(options), minimum_tasks=len(items))
102
+ if pool_config:
103
+ with TdxExtClientPool(
104
+ servers=pool_config.servers,
105
+ connections_per_server=pool_config.connections_per_server,
106
+ connection_count=pool_config.connection_count,
107
+ timeout=timeout,
108
+ client_factory=client_factory,
109
+ ) as pool:
110
+ rows = flatten_results(pool.map(items, request_item))
111
+ return rows, pool_config, len(items)
112
+
113
+ with client_factory.from_config(
114
+ tdx_root=root,
115
+ server_cache_root=server_cache_root,
116
+ timeout=timeout,
117
+ ) as client:
118
+ return flatten_results([request_item(client, item) for item in items]), None, None