vnbroker 3.5.0__tar.gz

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 (216) hide show
  1. vnbroker-3.5.0/LICENSE.md +66 -0
  2. vnbroker-3.5.0/MANIFEST.in +28 -0
  3. vnbroker-3.5.0/PKG-INFO +361 -0
  4. vnbroker-3.5.0/README.md +306 -0
  5. vnbroker-3.5.0/pyproject.toml +133 -0
  6. vnbroker-3.5.0/setup.cfg +4 -0
  7. vnbroker-3.5.0/tests/test_acb_all_providers.py +287 -0
  8. vnbroker-3.5.0/vnbroker/__init__.py +93 -0
  9. vnbroker-3.5.0/vnbroker/analytics/__init__.py +31 -0
  10. vnbroker-3.5.0/vnbroker/analytics/indicators.py +379 -0
  11. vnbroker-3.5.0/vnbroker/api/__init__.py +0 -0
  12. vnbroker-3.5.0/vnbroker/api/broker.py +57 -0
  13. vnbroker-3.5.0/vnbroker/api/company.py +209 -0
  14. vnbroker-3.5.0/vnbroker/api/financial.py +147 -0
  15. vnbroker-3.5.0/vnbroker/api/listing.py +191 -0
  16. vnbroker-3.5.0/vnbroker/api/news.py +115 -0
  17. vnbroker-3.5.0/vnbroker/api/quote.py +334 -0
  18. vnbroker-3.5.0/vnbroker/api/snapshot.py +463 -0
  19. vnbroker-3.5.0/vnbroker/api/stream.py +292 -0
  20. vnbroker-3.5.0/vnbroker/api/trading.py +210 -0
  21. vnbroker-3.5.0/vnbroker/base.py +195 -0
  22. vnbroker-3.5.0/vnbroker/bot/notify.py +599 -0
  23. vnbroker-3.5.0/vnbroker/broker/__init__.py +58 -0
  24. vnbroker-3.5.0/vnbroker/broker/base.py +74 -0
  25. vnbroker-3.5.0/vnbroker/broker/exceptions.py +63 -0
  26. vnbroker-3.5.0/vnbroker/broker/registry.py +100 -0
  27. vnbroker-3.5.0/vnbroker/broker/security/__init__.py +5 -0
  28. vnbroker-3.5.0/vnbroker/broker/security/audit.py +101 -0
  29. vnbroker-3.5.0/vnbroker/broker/security/credentials.py +272 -0
  30. vnbroker-3.5.0/vnbroker/broker/security/guards.py +73 -0
  31. vnbroker-3.5.0/vnbroker/broker/security/idempotency.py +78 -0
  32. vnbroker-3.5.0/vnbroker/broker/security/redaction.py +169 -0
  33. vnbroker-3.5.0/vnbroker/broker/session.py +221 -0
  34. vnbroker-3.5.0/vnbroker/broker/ssi/__init__.py +65 -0
  35. vnbroker-3.5.0/vnbroker/broker/ssi/_enums.py +127 -0
  36. vnbroker-3.5.0/vnbroker/broker/ssi/_paths.py +52 -0
  37. vnbroker-3.5.0/vnbroker/broker/ssi/_signing.py +125 -0
  38. vnbroker-3.5.0/vnbroker/broker/ssi/_transport.py +285 -0
  39. vnbroker-3.5.0/vnbroker/broker/ssi/_utils.py +133 -0
  40. vnbroker-3.5.0/vnbroker/broker/ssi/account.py +80 -0
  41. vnbroker-3.5.0/vnbroker/broker/ssi/auth.py +322 -0
  42. vnbroker-3.5.0/vnbroker/broker/ssi/client.py +779 -0
  43. vnbroker-3.5.0/vnbroker/broker/ssi/equity.py +431 -0
  44. vnbroker-3.5.0/vnbroker/broker/ssi/exceptions.py +28 -0
  45. vnbroker-3.5.0/vnbroker/broker/ssi/fco.py +771 -0
  46. vnbroker-3.5.0/vnbroker/broker/ssi/market.py +615 -0
  47. vnbroker-3.5.0/vnbroker/broker/ssi/money.py +248 -0
  48. vnbroker-3.5.0/vnbroker/broker/ssi/portfolio.py +397 -0
  49. vnbroker-3.5.0/vnbroker/broker/ssi/stream.py +825 -0
  50. vnbroker-3.5.0/vnbroker/broker/tcbs/__init__.py +34 -0
  51. vnbroker-3.5.0/vnbroker/broker/tcbs/account.py +937 -0
  52. vnbroker-3.5.0/vnbroker/broker/tcbs/auth.py +178 -0
  53. vnbroker-3.5.0/vnbroker/broker/tcbs/client.py +689 -0
  54. vnbroker-3.5.0/vnbroker/broker/tcbs/derivatives.py +852 -0
  55. vnbroker-3.5.0/vnbroker/broker/tcbs/equity.py +980 -0
  56. vnbroker-3.5.0/vnbroker/broker/tcbs/exceptions.py +30 -0
  57. vnbroker-3.5.0/vnbroker/broker/tcbs/market.py +395 -0
  58. vnbroker-3.5.0/vnbroker/broker/tcbs/money.py +563 -0
  59. vnbroker-3.5.0/vnbroker/broker/tcbs/portfolio.py +296 -0
  60. vnbroker-3.5.0/vnbroker/brokerage/base.py +337 -0
  61. vnbroker-3.5.0/vnbroker/brokerage/tcbs/client.py +467 -0
  62. vnbroker-3.5.0/vnbroker/common/__init__.py +35 -0
  63. vnbroker-3.5.0/vnbroker/common/client.py +282 -0
  64. vnbroker-3.5.0/vnbroker/common/data.py +1743 -0
  65. vnbroker-3.5.0/vnbroker/common/indices.py +220 -0
  66. vnbroker-3.5.0/vnbroker/common/retail.py +188 -0
  67. vnbroker-3.5.0/vnbroker/common/stream.py +254 -0
  68. vnbroker-3.5.0/vnbroker/config.py +113 -0
  69. vnbroker-3.5.0/vnbroker/connector/__init__.py +13 -0
  70. vnbroker-3.5.0/vnbroker/connector/binance/__init__.py +9 -0
  71. vnbroker-3.5.0/vnbroker/connector/binance/client.py +177 -0
  72. vnbroker-3.5.0/vnbroker/connector/dnse/__init__.py +5 -0
  73. vnbroker-3.5.0/vnbroker/connector/dnse/client.py +450 -0
  74. vnbroker-3.5.0/vnbroker/connector/dnse/core/__init__.py +27 -0
  75. vnbroker-3.5.0/vnbroker/connector/dnse/core/auth.py +10 -0
  76. vnbroker-3.5.0/vnbroker/connector/dnse/core/config.py +22 -0
  77. vnbroker-3.5.0/vnbroker/connector/dnse/core/errors.py +66 -0
  78. vnbroker-3.5.0/vnbroker/connector/dnse/core/http_client.py +103 -0
  79. vnbroker-3.5.0/vnbroker/connector/dnse/core/models.py +18 -0
  80. vnbroker-3.5.0/vnbroker/connector/dnse/core/signature.py +79 -0
  81. vnbroker-3.5.0/vnbroker/connector/dnse/services/__init__.py +13 -0
  82. vnbroker-3.5.0/vnbroker/connector/dnse/services/account_service.py +73 -0
  83. vnbroker-3.5.0/vnbroker/connector/dnse/services/market_service.py +106 -0
  84. vnbroker-3.5.0/vnbroker/connector/dnse/services/order_service.py +166 -0
  85. vnbroker-3.5.0/vnbroker/connector/dnse/services/position_service.py +39 -0
  86. vnbroker-3.5.0/vnbroker/connector/dnse/services/token_service.py +19 -0
  87. vnbroker-3.5.0/vnbroker/connector/dnse/trade.py +1294 -0
  88. vnbroker-3.5.0/vnbroker/connector/dnse/websocket.py +249 -0
  89. vnbroker-3.5.0/vnbroker/constants.py +238 -0
  90. vnbroker-3.5.0/vnbroker/core/__init__.py +19 -0
  91. vnbroker-3.5.0/vnbroker/core/adaptive_controller.py +287 -0
  92. vnbroker-3.5.0/vnbroker/core/config/__init__.py +0 -0
  93. vnbroker-3.5.0/vnbroker/core/config/const.py +33 -0
  94. vnbroker-3.5.0/vnbroker/core/config/ggcolab.py +438 -0
  95. vnbroker-3.5.0/vnbroker/core/constants.py +63 -0
  96. vnbroker-3.5.0/vnbroker/core/converter/__init__.py +0 -0
  97. vnbroker-3.5.0/vnbroker/core/converter/export.py +13 -0
  98. vnbroker-3.5.0/vnbroker/core/exceptions.py +372 -0
  99. vnbroker-3.5.0/vnbroker/core/health_store.py +160 -0
  100. vnbroker-3.5.0/vnbroker/core/models.py +80 -0
  101. vnbroker-3.5.0/vnbroker/core/performance_profiles.py +164 -0
  102. vnbroker-3.5.0/vnbroker/core/registry.py +178 -0
  103. vnbroker-3.5.0/vnbroker/core/settings.py +333 -0
  104. vnbroker-3.5.0/vnbroker/core/source_router.py +405 -0
  105. vnbroker-3.5.0/vnbroker/core/types.py +581 -0
  106. vnbroker-3.5.0/vnbroker/core/unified_registry.py +202 -0
  107. vnbroker-3.5.0/vnbroker/core/utils/__init__.py +162 -0
  108. vnbroker-3.5.0/vnbroker/core/utils/async_client.py +434 -0
  109. vnbroker-3.5.0/vnbroker/core/utils/browser_profiles.py +122 -0
  110. vnbroker-3.5.0/vnbroker/core/utils/cache.py +299 -0
  111. vnbroker-3.5.0/vnbroker/core/utils/client.py +365 -0
  112. vnbroker-3.5.0/vnbroker/core/utils/compat.py +304 -0
  113. vnbroker-3.5.0/vnbroker/core/utils/deprecation.py +275 -0
  114. vnbroker-3.5.0/vnbroker/core/utils/env.py +264 -0
  115. vnbroker-3.5.0/vnbroker/core/utils/execution.py +37 -0
  116. vnbroker-3.5.0/vnbroker/core/utils/ext.py +45 -0
  117. vnbroker-3.5.0/vnbroker/core/utils/field/__init__.py +20 -0
  118. vnbroker-3.5.0/vnbroker/core/utils/field/handler.py +333 -0
  119. vnbroker-3.5.0/vnbroker/core/utils/field/kbs_mappings.py +1304 -0
  120. vnbroker-3.5.0/vnbroker/core/utils/field/mapper.py +327 -0
  121. vnbroker-3.5.0/vnbroker/core/utils/field/normalizer.py +226 -0
  122. vnbroker-3.5.0/vnbroker/core/utils/field/validator.py +394 -0
  123. vnbroker-3.5.0/vnbroker/core/utils/help.py +30 -0
  124. vnbroker-3.5.0/vnbroker/core/utils/interval.py +142 -0
  125. vnbroker-3.5.0/vnbroker/core/utils/logger.py +139 -0
  126. vnbroker-3.5.0/vnbroker/core/utils/lookback.py +223 -0
  127. vnbroker-3.5.0/vnbroker/core/utils/market.py +249 -0
  128. vnbroker-3.5.0/vnbroker/core/utils/market_events.py +387 -0
  129. vnbroker-3.5.0/vnbroker/core/utils/parser.py +1106 -0
  130. vnbroker-3.5.0/vnbroker/core/utils/proxy_manager.py +508 -0
  131. vnbroker-3.5.0/vnbroker/core/utils/transform.py +1056 -0
  132. vnbroker-3.5.0/vnbroker/core/utils/upgrade.py +459 -0
  133. vnbroker-3.5.0/vnbroker/core/utils/user_agent.py +276 -0
  134. vnbroker-3.5.0/vnbroker/core/utils/validation.py +121 -0
  135. vnbroker-3.5.0/vnbroker/explorer/__init__.py +1 -0
  136. vnbroker-3.5.0/vnbroker/explorer/dnse/__init__.py +33 -0
  137. vnbroker-3.5.0/vnbroker/explorer/dnse/company.py +291 -0
  138. vnbroker-3.5.0/vnbroker/explorer/dnse/finance.py +228 -0
  139. vnbroker-3.5.0/vnbroker/explorer/dnse/financial.py +22 -0
  140. vnbroker-3.5.0/vnbroker/explorer/dnse/listing.py +256 -0
  141. vnbroker-3.5.0/vnbroker/explorer/dnse/news.py +184 -0
  142. vnbroker-3.5.0/vnbroker/explorer/dnse/quote.py +602 -0
  143. vnbroker-3.5.0/vnbroker/explorer/dnse/trading.py +148 -0
  144. vnbroker-3.5.0/vnbroker/explorer/fmarket/__init__.py +3 -0
  145. vnbroker-3.5.0/vnbroker/explorer/fmarket/const.py +56 -0
  146. vnbroker-3.5.0/vnbroker/explorer/fmarket/fund.py +460 -0
  147. vnbroker-3.5.0/vnbroker/explorer/kbs/__init__.py +12 -0
  148. vnbroker-3.5.0/vnbroker/explorer/kbs/company.py +808 -0
  149. vnbroker-3.5.0/vnbroker/explorer/kbs/const.py +597 -0
  150. vnbroker-3.5.0/vnbroker/explorer/kbs/financial.py +828 -0
  151. vnbroker-3.5.0/vnbroker/explorer/kbs/listing.py +688 -0
  152. vnbroker-3.5.0/vnbroker/explorer/kbs/news.py +53 -0
  153. vnbroker-3.5.0/vnbroker/explorer/kbs/quote.py +734 -0
  154. vnbroker-3.5.0/vnbroker/explorer/kbs/screener.py +130 -0
  155. vnbroker-3.5.0/vnbroker/explorer/kbs/stream.py +344 -0
  156. vnbroker-3.5.0/vnbroker/explorer/kbs/trading.py +256 -0
  157. vnbroker-3.5.0/vnbroker/explorer/misc/__init__.py +2 -0
  158. vnbroker-3.5.0/vnbroker/explorer/misc/exchange_rate.py +58 -0
  159. vnbroker-3.5.0/vnbroker/explorer/misc/gold_price.py +144 -0
  160. vnbroker-3.5.0/vnbroker/explorer/rss_cafef/__init__.py +3 -0
  161. vnbroker-3.5.0/vnbroker/explorer/rss_cafef/news.py +92 -0
  162. vnbroker-3.5.0/vnbroker/explorer/rss_vneconomy/__init__.py +3 -0
  163. vnbroker-3.5.0/vnbroker/explorer/rss_vneconomy/news.py +90 -0
  164. vnbroker-3.5.0/vnbroker/explorer/ssi/__init__.py +40 -0
  165. vnbroker-3.5.0/vnbroker/explorer/ssi/_auth.py +182 -0
  166. vnbroker-3.5.0/vnbroker/explorer/ssi/company.py +250 -0
  167. vnbroker-3.5.0/vnbroker/explorer/ssi/financial.py +105 -0
  168. vnbroker-3.5.0/vnbroker/explorer/ssi/indices.py +177 -0
  169. vnbroker-3.5.0/vnbroker/explorer/ssi/listing.py +203 -0
  170. vnbroker-3.5.0/vnbroker/explorer/ssi/live.py +271 -0
  171. vnbroker-3.5.0/vnbroker/explorer/ssi/news.py +89 -0
  172. vnbroker-3.5.0/vnbroker/explorer/ssi/quote.py +334 -0
  173. vnbroker-3.5.0/vnbroker/explorer/ssi/screener.py +159 -0
  174. vnbroker-3.5.0/vnbroker/explorer/ssi/securities.py +155 -0
  175. vnbroker-3.5.0/vnbroker/explorer/ssi/trading.py +201 -0
  176. vnbroker-3.5.0/vnbroker/explorer/tcbs/__init__.py +18 -0
  177. vnbroker-3.5.0/vnbroker/explorer/tcbs/auth.py +86 -0
  178. vnbroker-3.5.0/vnbroker/explorer/tcbs/company.py +504 -0
  179. vnbroker-3.5.0/vnbroker/explorer/tcbs/const.py +137 -0
  180. vnbroker-3.5.0/vnbroker/explorer/tcbs/financial.py +265 -0
  181. vnbroker-3.5.0/vnbroker/explorer/tcbs/listing.py +373 -0
  182. vnbroker-3.5.0/vnbroker/explorer/tcbs/news.py +55 -0
  183. vnbroker-3.5.0/vnbroker/explorer/tcbs/quote.py +801 -0
  184. vnbroker-3.5.0/vnbroker/explorer/tcbs/screener.py +186 -0
  185. vnbroker-3.5.0/vnbroker/explorer/tcbs/stream.py +170 -0
  186. vnbroker-3.5.0/vnbroker/explorer/tcbs/tcbs_compatibility.py +330 -0
  187. vnbroker-3.5.0/vnbroker/explorer/tcbs/trading.py +141 -0
  188. vnbroker-3.5.0/vnbroker/explorer/tcbs/websocket.py +412 -0
  189. vnbroker-3.5.0/vnbroker/explorer/tcbs/ws_models.py +89 -0
  190. vnbroker-3.5.0/vnbroker/explorer/vci/__init__.py +8 -0
  191. vnbroker-3.5.0/vnbroker/explorer/vci/company.py +352 -0
  192. vnbroker-3.5.0/vnbroker/explorer/vci/const.py +457 -0
  193. vnbroker-3.5.0/vnbroker/explorer/vci/financial.py +677 -0
  194. vnbroker-3.5.0/vnbroker/explorer/vci/listing.py +388 -0
  195. vnbroker-3.5.0/vnbroker/explorer/vci/news.py +53 -0
  196. vnbroker-3.5.0/vnbroker/explorer/vci/quote.py +700 -0
  197. vnbroker-3.5.0/vnbroker/explorer/vci/screener.py +130 -0
  198. vnbroker-3.5.0/vnbroker/explorer/vci/stream.py +344 -0
  199. vnbroker-3.5.0/vnbroker/explorer/vci/trading.py +156 -0
  200. vnbroker-3.5.0/vnbroker/news/__init__.py +18 -0
  201. vnbroker-3.5.0/vnbroker/news/dedup.py +29 -0
  202. vnbroker-3.5.0/vnbroker/news/filtering.py +68 -0
  203. vnbroker-3.5.0/vnbroker/news/health.py +106 -0
  204. vnbroker-3.5.0/vnbroker/news/monitor.py +56 -0
  205. vnbroker-3.5.0/vnbroker/news/normalize.py +144 -0
  206. vnbroker-3.5.0/vnbroker/ui/__init__.py +20 -0
  207. vnbroker-3.5.0/vnbroker/ui/fundamental.py +48 -0
  208. vnbroker-3.5.0/vnbroker/ui/market.py +47 -0
  209. vnbroker-3.5.0/vnbroker/ui/reference.py +56 -0
  210. vnbroker-3.5.0/vnbroker/ui/registry.py +81 -0
  211. vnbroker-3.5.0/vnbroker/ui/retail.py +38 -0
  212. vnbroker-3.5.0/vnbroker.egg-info/PKG-INFO +361 -0
  213. vnbroker-3.5.0/vnbroker.egg-info/SOURCES.txt +214 -0
  214. vnbroker-3.5.0/vnbroker.egg-info/dependency_links.txt +1 -0
  215. vnbroker-3.5.0/vnbroker.egg-info/requires.txt +27 -0
  216. vnbroker-3.5.0/vnbroker.egg-info/top_level.txt +1 -0
@@ -0,0 +1,66 @@
1
+ # Giấy phép tùy chỉnh vnbroker
2
+
3
+ Copyright (c) 2026 Phạm Việt Dũng (vietdungiitb@gmail.com).
4
+
5
+ Tệp này mô tả điều khoản sử dụng phần mềm vnbroker.
6
+
7
+ ## 0. Quyền của chủ sở hữu bản quyền
8
+
9
+ Giấy phép này chỉ ràng buộc **người nhận giấy phép** (bên thứ ba cài đặt hoặc sử dụng
10
+ vnbroker). **Chủ sở hữu bản quyền không bị ràng buộc bởi chính giấy phép này** và giữ
11
+ toàn quyền, bao gồm không giới hạn: sử dụng, sao chép, sửa đổi, và tích hợp vnbroker
12
+ vào **bất kỳ sản phẩm, dịch vụ, hoặc hệ thống nội bộ nào của chủ sở hữu** — kể cả khi
13
+ sản phẩm đó thu phí hoặc được phân phối thương mại.
14
+
15
+ Cụ thể, các sản phẩm do chủ sở hữu phát triển (ví dụ: VNInvest) được phép dùng vnbroker
16
+ mà **không cần xin phép thêm** và không thuộc phạm vi hạn chế ở Mục 1 và Mục 2.
17
+
18
+ Mục 1 và Mục 2 dưới đây áp dụng cho **người nhận giấy phép bên thứ ba**.
19
+
20
+ ## 1. Quyền sử dụng
21
+
22
+ Bạn được phép cài đặt, chạy, sao chép và sửa đổi phần mềm cho mục đích cá nhân, học tập và nghiên cứu phi thương mại, với điều kiện giữ nguyên thông báo bản quyền và giấy phép này trong mọi bản sao hợp lệ.
23
+
24
+ ## 2. Hạn chế
25
+
26
+ *(Các hạn chế dưới đây áp dụng cho **người nhận giấy phép bên thứ ba**; xem Mục 0.)*
27
+
28
+ Bạn không được dùng phần mềm cho:
29
+
30
+ - mục đích thương mại;
31
+ - triển khai nội bộ cho tổ chức có thu phí, doanh thu hoặc giá trị dịch vụ;
32
+ - tích hợp vào sản phẩm hoặc dịch vụ trả phí;
33
+ - phân phối lại như một phần của gói thương mại;
34
+ - bất kỳ hành vi nào vi phạm pháp luật hoặc xâm phạm quyền sở hữu trí tuệ.
35
+
36
+ Mọi trường hợp sử dụng khác ngoài phạm vi trên phải có chấp thuận bằng văn bản từ tác giả.
37
+
38
+ ## 3. Quyền sở hữu
39
+
40
+ Tác giả giữ toàn bộ quyền sở hữu trí tuệ đối với phần mềm, mã nguồn và tài liệu đi kèm, trừ khi được nêu rõ khác đi trong từng tệp.
41
+
42
+ ## 4. Miễn trừ trách nhiệm
43
+
44
+ Phần mềm được cung cấp "nguyên trạng", không kèm bất kỳ bảo đảm nào, dù là rõ ràng hay ngụ ý, bao gồm nhưng không giới hạn ở khả năng thương mại hóa, phù hợp cho một mục đích cụ thể, hoặc không phát sinh lỗi. Tác giả không chịu trách nhiệm cho bất kỳ thiệt hại trực tiếp, gián tiếp, ngẫu nhiên hoặc hệ quả nào phát sinh từ việc sử dụng phần mềm này.
45
+
46
+ ## 5. Chấm dứt
47
+
48
+ Nếu bạn vi phạm bất kỳ điều khoản nào ở đây, quyền sử dụng sẽ tự động chấm dứt và bạn phải dừng sử dụng, gỡ bỏ các bản sao đang kiểm soát, và ngừng phân phối phần mềm theo phạm vi đã vi phạm.
49
+
50
+ ## 6. Liên hệ cấp phép
51
+
52
+ Để xin phép sử dụng thương mại hoặc thỏa thuận cấp phép khác, hãy liên hệ: vietdungiitb@gmail.com
53
+
54
+ ## English summary
55
+
56
+ This license governs **licensees** (third parties installing or using vnbroker). The
57
+ copyright holder is **not** bound by this license and retains all rights, including
58
+ without limitation: use, modification, and integration of vnbroker into any product,
59
+ service, or internal system of the copyright holder, including paid or commercially
60
+ distributed ones. The holder's own products (e.g. VNInvest) require no additional
61
+ permission.
62
+
63
+ Third-party licensees may use vnbroker for personal, educational, and research purposes
64
+ only. Commercial use, redistribution in commercial products, and organizational
65
+ deployment require prior written permission from the author. The software is provided
66
+ as-is without warranty.
@@ -0,0 +1,28 @@
1
+ # Kiểm soát nội dung sdist một cách TẤT ĐỊNH.
2
+ #
3
+ # Lý do tồn tại: setuptools ghi bộ chọn file vào `vnbroker.egg-info/SOURCES.txt`
4
+ # và các lần build sau chỉ ĐỌC LẠI file đó. Nếu cây làm việc có file rác chưa
5
+ # dọn (ví dụ `docs/debug_quote.py`, `docs/login_tcbs.py` — đều đã gitignore),
6
+ # glob của egg_info nhặt chúng vào SOURCES.txt, và từ đó chúng đi vào MỌI sdist
7
+ # sau này cho tới khi egg-info bị xoá. Đo được: sdist build trên cây sạch =
8
+ # 0 file `docs/`, trên cây bẩn = 13 file `docs/*.py`.
9
+ #
10
+ # Các dòng `prune`/`global-exclude` dưới đây là subtractive nên không đổi nội
11
+ # dung sdist của một cây sạch; chúng chỉ chặn rác đi vào từ cây bẩn.
12
+ #
13
+ # Cổng chặn: scripts/check_dist_contents.py (chạy trong .github/workflows/publish.yml).
14
+
15
+ # docs/ không thuộc sdist (trên cây sạch vốn đã không có).
16
+ prune docs
17
+
18
+ # Rác dev chỉ tồn tại ở cây làm việc, không bao giờ được phát hành.
19
+ global-exclude debug_*.py
20
+ global-exclude login_*.py
21
+ global-exclude smoke_test_*.py
22
+ global-exclude regression_test.py
23
+ global-exclude test_with_jwt.py
24
+ global-exclude *.jwt
25
+ global-exclude .env
26
+ global-exclude .env.*
27
+ global-exclude *.sqlite3
28
+ global-exclude *.db
@@ -0,0 +1,361 @@
1
+ Metadata-Version: 2.4
2
+ Name: vnbroker
3
+ Version: 3.5.0
4
+ Summary: A beginner-friendly yet powerful Python toolkit for financial analysis and automation — built to make modern investing accessible to everyone
5
+ Author-email: Pham Viet Dung <vietdungiitb@gmail.com>
6
+ License-Expression: LicenseRef-Proprietary
7
+ Project-URL: Documentation, https://github.com/vietdungiitb/vnbroker/tree/main/docs
8
+ Project-URL: Source, https://github.com/vietdungiitb/vnbroker
9
+ Project-URL: IssueTracker, https://github.com/vietdungiitb/vnbroker/issues
10
+ Keywords: vnbroker,finance,vietnam,stock market,analysis,API,DNSE,broker
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Intended Audience :: Education
14
+ Classifier: Intended Audience :: Financial and Insurance Industry
15
+ Classifier: Topic :: Software Development :: Libraries
16
+ Classifier: Topic :: Office/Business :: Financial :: Investment
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Programming Language :: Python :: 3.14
23
+ Classifier: Operating System :: OS Independent
24
+ Classifier: Natural Language :: Vietnamese
25
+ Classifier: Natural Language :: English
26
+ Requires-Python: >=3.10
27
+ Description-Content-Type: text/markdown
28
+ License-File: LICENSE.md
29
+ Requires-Dist: requests
30
+ Requires-Dist: beautifulsoup4
31
+ Requires-Dist: pandas
32
+ Requires-Dist: openpyxl
33
+ Requires-Dist: pydantic
34
+ Requires-Dist: pytz
35
+ Requires-Dist: psutil
36
+ Requires-Dist: packaging>=20.0
37
+ Requires-Dist: importlib-metadata>=1.0
38
+ Requires-Dist: tenacity
39
+ Requires-Dist: httpx[http2]>=0.27.0
40
+ Requires-Dist: fake_useragent>=1.5.1
41
+ Requires-Dist: cryptography>=42.0.5
42
+ Requires-Dist: websockets>=12.0
43
+ Provides-Extra: test
44
+ Requires-Dist: pytest>=7.0; extra == "test"
45
+ Requires-Dist: pytest-cov>=4.0; extra == "test"
46
+ Requires-Dist: pytest-timeout; extra == "test"
47
+ Provides-Extra: lint
48
+ Requires-Dist: mypy>=1.10; extra == "lint"
49
+ Requires-Dist: ruff>=0.4.0; extra == "lint"
50
+ Requires-Dist: types-requests>=2.31; extra == "lint"
51
+ Requires-Dist: types-beautifulsoup4; extra == "lint"
52
+ Requires-Dist: types-python-dateutil; extra == "lint"
53
+ Requires-Dist: types-pytz; extra == "lint"
54
+ Dynamic: license-file
55
+
56
+ # vnbroker
57
+
58
+ Thư viện Python cho dữ liệu, phân tích và tự động hóa nghiệp vụ chứng khoán Việt Nam.
59
+
60
+ > **v3.5.0** — Kiến trúc hai tầng: dữ liệu thị trường ẩn danh (`auto=True`) tự chọn và xoay vòng provider; broker chọn provider tường minh. Kèm chặn double-submit lệnh SSI + hàng rào `dry_run` cho `connector/dnse`. ⚠️ Có **Breaking changes** (xem [Breaking Changes 3.5.0](#phiên-bản-350--2026-10-02--kiến-trúc-hai-tầng--an-toàn-đường-giao-dịch)) — `history()` trả `time` tz-aware.
61
+ >
62
+ > **Độc lập hoàn toàn từ v3.5.0:** `vnbroker` không phải fork hay phụ thuộc bất kỳ dự án ngoại nào. Mọi kiến trúc, bản quyền và mã nguồn được phát triển nội bộ từ đầu (`Direct Provider Architecture` — tầng 1 dữ liệu ẩn danh, tầng 2 broker lane). Xem `docs/PLAN_CLEAR_VNSTOCK_REFERENCES.md` để biết chi tiết các tham chiếu cũ đã được xóa sạch.
63
+
64
+ ## Tóm tắt
65
+
66
+ vnbroker cung cấp một lớp truy cập thống nhất để lấy dữ liệu từ nhiều nguồn trực tiếp (VCI, KBS, TCBS, DNSE), chuẩn hóa đầu ra bằng `pandas` và giảm chi phí tích hợp cho ứng dụng phân tích, dashboard, backend và công cụ nghiên cứu.
67
+
68
+ **Điểm truy cập chính:** lớp `Vnbroker` (xem `vnbroker/common/client.py`).
69
+
70
+ ## Thành phần chính
71
+
72
+ | Thành phần | Mục đích |
73
+ | --- | --- |
74
+ | `Vnbroker` | Client cấp cao để lấy stock, FX, crypto, world index và quỹ (Direct Providers) |
75
+ | `Quote` | Giá lịch sử, intraday, price depth (Multi-Source) |
76
+ | `Company` | Hồ sơ công ty, cổ đông, giao dịch nội bộ, ban lãnh đạo, công ty con, tin tức và sự kiện |
77
+ | `Finance` | Bảng cân đối kế toán, kết quả kinh doanh, lưu chuyển tiền tệ, chỉ số tài chính |
78
+ | `Listing` | Danh sách mã, nhóm ngành, nhóm chỉ số, futures, trái phiếu, covered warrant |
79
+ | `Trading` | Dữ liệu giao dịch và market board |
80
+ | `News` | Tin tức chuẩn hóa từ nhiều nguồn (VCI, KBS, TCBS + RSS) |
81
+ | `MarketSnapshot` | Snapshot thị trường cho heatmap và dashboard danh mục |
82
+ | `Fund` | Dữ liệu quỹ từ FMarket |
83
+ | `Messenger` | Gửi cảnh báo qua Slack, Telegram, Discord, Lark |
84
+ | `Broker` | **Giao dịch tài khoản cá nhân (Private Brokerage) — Direct Broker API: TCBS, SSI, DNSE** |
85
+
86
+ ## Nguồn dữ liệu (Data Sources)
87
+
88
+ ### Direct Provider Architecture
89
+
90
+ vnbroker hỗ trợ truy cập trực tiếp tới các provider mà **không cần PAT/Gateway**:
91
+
92
+ | Provider | Dữ liệu hỗ trợ | Credentials bổ sung |
93
+ | --- | --- | --- |
94
+ | `VCI` | Quote, Company, Finance, Listing, Trading, News | Không cần auth |
95
+ | `KBS` | Quote, Company, Finance, Listing, Trading | Không cần auth |
96
+ | `TCBS` | Quote, Company, Finance, Listing, Trading, News | Không cần auth |
97
+ | `DNSE` | Quote, Listing, Trading | Cần `DNSE_API_KEY` + `DNSE_API_SECRET` |
98
+ | `SSI` | Quote, Listing, Trading | Cần `VNBROKER_BROKER_SSI_API_KEY` + `VNBROKER_BROKER_SSI_API_SECRET` |
99
+
100
+
101
+ > **Lưu ý:** DNSE/SSI không có Company/Finance/News endpoints ở upstream — provider trả
102
+ > DataFrame rỗng đúng schema và **facade tự fallback sang KBS/VCI**
103
+ > (`Finance` fallback cứng sang KBS; `Company` bỏ qua DF rỗng). Kiểm tra nguồn thật qua
104
+ > `df.attrs["source_used"]` / `source_requested`, đừng tin `source` yêu cầu.
105
+
106
+ ### Private Brokerage (Direct Broker API)
107
+ - `TCBS`: Đặt/hủy/sửa lệnh, số dư, sức mua, vị thế nắm giữ, portfolio — **trực tiếp TCBS iFlash OpenAPI v1.0.0**
108
+ - `SSI`: Market data (OHLC 8 timeframe, master data), số dư/vị thế equity + phái sinh, đặt/hủy/sửa lệnh (ký RSA), **7 loại lệnh điều kiện FCO**, streaming WebSocket — **native FastConnect v3, không cần `ssi-sdk`** (xem `docs/SSI_USAGE_GUIDE.md`)
109
+ - `DNSE`: Đặt/hủy/sửa lệnh, số dư, vị thế — **trực tiếp VNDirect API**
110
+
111
+ ```python
112
+ from vnbroker import Vnbroker
113
+
114
+ vn = Vnbroker()
115
+ ssi = vn.broker(provider="ssi", api_key="...", api_secret="...")
116
+ ssi.authenticate() # market-data-only, không OTP
117
+ ohlc = ssi.get_ohlc("SSI", timeframe="1d")
118
+ ```
119
+
120
+ ## Cài đặt
121
+
122
+ > ⚠️ **Chưa phát hành trên PyPI.** `vnbroker` hiện chỉ phân phối qua GitHub.
123
+ > `pip install vnbroker` sẽ báo *No matching distribution found* — xem
124
+ > `docs/PUBLISHING.md` để biết cách phát hành và trạng thái hiện tại.
125
+
126
+ Cài trực tiếp từ GitHub:
127
+
128
+ ```bash
129
+ pip install "git+https://github.com/vietdungiitb/vnbroker.git@v3.5.0"
130
+ ```
131
+
132
+ Phát triển cục bộ:
133
+
134
+ ```bash
135
+ git clone https://github.com/vietdungiitb/vnbroker.git
136
+ cd vnbroker
137
+ pip install -e ".[test]"
138
+ ```
139
+
140
+ Dự án yêu cầu Python `>=3.10`.
141
+
142
+ ## Bắt đầu nhanh
143
+
144
+ ### 1. Market Data — Direct Provider Mode
145
+
146
+ ```python
147
+ from vnbroker import Vnbroker
148
+
149
+ # Khởi tạo đơn giản, không cần PAT
150
+ vn = Vnbroker(source="KBS") # KBS là mặc định
151
+
152
+ acb = vn.stock("ACB")
153
+ history = acb.quote.history(start="2024-01-01", end="2024-12-31")
154
+ overview = acb.company.overview()
155
+ finance = acb.finance.ratio()
156
+ news = acb.news.latest()
157
+ ```
158
+
159
+ ### 1b. Retail & Unified UI (không cần biết source)
160
+
161
+ ```python
162
+ from vnbroker import Vnbroker
163
+
164
+ retail = Vnbroker().retail()
165
+ sjc = retail.gold(source="sjc", date="2026-01-15") # hoặc source="btmc"
166
+ fx = retail.exchange_rate() # tỷ giá Vietcombank hôm nay
167
+
168
+ from vnbroker.ui import Fundamental, Market, Reference, show_api
169
+
170
+ mkt = Market() # default KBS
171
+ hist = mkt.equity("SSI").history(start="2026-01-01")
172
+ prof = Reference().company("SSI").profile()
173
+ bs = Fundamental().equity("SSI").balance_sheet(period="year")
174
+ show_api()
175
+ ```
176
+
177
+ ### 2. Chọn provider cụ thể
178
+
179
+ ```python
180
+ from vnbroker import Vnbroker
181
+
182
+ vn = Vnbroker()
183
+ acb_vci = vn.stock("ACB", source="VCI")
184
+ acb_kbs = vn.stock("ACB", source="KBS")
185
+ acb_tcbs = vn.stock("ACB", source="TCBS")
186
+ acb_dnse = vn.stock("ACB", source="DNSE") # Cần DNSE_API_KEY + DNSE_API_SECRET
187
+ ```
188
+
189
+ **Nguồn hợp lệ theo nhóm dữ liệu:**
190
+
191
+ | Nhóm | Nguồn hỗ trợ |
192
+ | --- | --- |
193
+ | `Quote` | `VCI`, `KBS`, `TCBS`, `DNSE` |
194
+ | `Company` | `VCI`, `KBS`, `TCBS`, `DNSE` |
195
+ | `Finance` | `VCI`, `KBS`, `TCBS`, `DNSE` |
196
+ | `Listing` | `VCI`, `KBS`, `TCBS`, `DNSE` |
197
+ | `Trading` | `VCI`, `KBS`, `TCBS`, `DNSE` |
198
+ | `News` | `VCI`, `KBS`, `TCBS` |
199
+ | `Fund` | `FMARKET` |
200
+
201
+ ### 3. Private Brokerage (trực tiếp API Broker)
202
+
203
+ vnbroker cung cấp **hai lane brokerage riêng biệt** cho TCBS:
204
+
205
+ #### 3a. TCBS iFlash OpenAPI v1.0.0 (Official - `vnbroker.broker.tcbs`)
206
+ API chính thức của TCBS, production-ready, test coverage đầy đủ.
207
+
208
+ ```python
209
+ from vnbroker import Vnbroker
210
+
211
+ vn = Vnbroker()
212
+
213
+ # TCBS Official OpenAPI Client
214
+ client = vn.broker(provider="tcbs", api_key="your_tcbs_openapi_key")
215
+ client.authenticate(otp="123456")
216
+
217
+ profile = client.get_profile(custody_code="105C334455")
218
+ balance = client.get_balance(account_no="0123456789")
219
+ holdings = client.get_holdings(account_no="0123456789")
220
+
221
+ # Write operations (dry_run=True mặc định)
222
+ client.enable_write()
223
+ order = client.place_order(
224
+ account_no="0123456789",
225
+ symbol="ACB",
226
+ side="BUY",
227
+ order_type="LO",
228
+ quantity=100,
229
+ price=25000,
230
+ request_id="unique-idempotency-key"
231
+ )
232
+ ```
233
+
234
+ #### 3b. TCBS Private API (Advanced - `vnbroker.brokerage.tcbs`)
235
+ API private của TCBS với HMAC-SHA256 + WebSocket streaming, dành cho advanced users.
236
+
237
+ ```python
238
+ from vnbroker.brokerage.tcbs import TCBSClient
239
+
240
+ client = TCBSClient(
241
+ api_key="your_api_key",
242
+ secret="your_base64_secret",
243
+ account_no="0123456789",
244
+ otp_handler=lambda otp_type: input(f"Enter {otp_type} OTP: ")
245
+ )
246
+
247
+ balance = client.get_balance()
248
+ positions = client.get_positions()
249
+ orders = client.get_orders()
250
+
251
+ # Real-time streaming
252
+ async for tick in client.intratick_stream(["ACB", "VNM"]):
253
+ print(f"{tick.symbol}: {tick.price} @ {tick.volume}")
254
+
255
+ # WebSocket order updates
256
+ async for order_update in client.order_updates_stream():
257
+ print(f"Order {order_update.order_id}: {order_update.status}")
258
+ ```
259
+
260
+ ### 4. Gửi cảnh báo bot
261
+
262
+ ```python
263
+ from vnbroker.bot.notify import Messenger
264
+
265
+ bot = Messenger("telegram", "-1001234567890", "BOT_TOKEN")
266
+ bot.send_message("ACB vượt ngưỡng cảnh báo")
267
+ ```
268
+
269
+ ### 5. Fund (Quỹ mở)
270
+
271
+ ```python
272
+ from vnbroker import Vnbroker
273
+
274
+ vn = Vnbroker()
275
+ funds = vn.fund()
276
+ all_funds = funds.listing()
277
+ ```
278
+
279
+ ## Biến môi trường
280
+
281
+ | Biến | Mô tả | Ví dụ |
282
+ | --- | --- | --- |
283
+ | `DNSE_API_KEY` | DNSE API Key (HMAC OpenAPI) | `your_dnse_key` |
284
+ | `DNSE_API_SECRET` | DNSE API Secret (HMAC OpenAPI) | `your_dnse_secret` |
285
+ | `DNSE_USERNAME` | DNSE Username (JWT Trading) | `your_dnse_username` |
286
+ | `DNSE_PASSWORD` | DNSE Password (JWT Trading) | `your_dnse_password` |
287
+ | `VNBROKER_BROKER_TCBS_API_KEY` | TCBS OpenAPI Key cho Broker Lane (iFlash) | `your_tcbs_key` |
288
+
289
+ ## Lưu ý quan trọng
290
+
291
+ - **Market Data:** Truy cập trực tiếp provider (VCI, KBS, TCBS, DNSE) — **không cần PAT/Gateway**.
292
+ - **Broker Lane:** Gọi trực tiếp API Broker với API Key + OTP.
293
+ - Dữ liệu giá được chuẩn hóa theo contract riêng; kiểm tra `df.attrs["price_unit"]` trước khi lưu hay so sánh.
294
+ - Một số nguồn live có thể bị giới hạn tốc độ hoặc thay đổi phía upstream; adapter của thư viện có retry và backoff.
295
+ - **FX/Crypto/World Index:** Không được hỗ trợ bởi các provider hiện tại (KBS, VCI, TCBS, DNSE). Các phương thức `fx()`, `crypto()`, `world_index()` sẽ raise `NotImplementedError` trong phiên bản tới.
296
+
297
+ ## Phiên bản 3.5.0 (2026-10-02) — Kiến trúc hai tầng + an toàn đường giao dịch
298
+
299
+ ### Breaking Changes (3.5.0)
300
+
301
+ 1. **`history()` qua `Vnbroker` trả `time` tz-aware** (`Asia/Ho_Chi_Minh`) thay vì
302
+ tz-naive, và được lọc theo `start`/`end`.
303
+ - Lý do: provider trả tz khác nhau nên `pd.concat` sinh dtype `object`; VCI còn
304
+ trả nến ngoài khoảng yêu cầu **không báo lỗi**.
305
+ - Nếu bạn so `df["time"]` với timestamp naive: dùng `.dt.tz_localize(None)`.
306
+ - Gọi provider trực tiếp (`VCIQuote(...).history()`) **không đổi**.
307
+ 2. **`connector/dnse` cần `trade.enable_write()`** trước khi gửi lệnh thật.
308
+ `place_order` / `cancel_order` / `deposit_derivative_margin` /
309
+ `withdraw_derivative_margin` giờ có `dry_run=True` mặc định.
310
+ 3. **SSI không retry tự động trên POST đặt lệnh** (chống double-submit — trước đây
311
+ 1 lời gọi có thể gửi **5 POST thật**). Hãy truyền `clientRequestId` khi định
312
+ thử lại sau lỗi mạng.
313
+
314
+ ### Tầng 1 — dữ liệu ẩn danh (không cần biết provider)
315
+
316
+ ```python
317
+ from vnbroker.ui.market import Market
318
+
319
+ mkt = Market(auto=True) # tự chọn + tự xoay vòng provider
320
+ hist = mkt.equity("ACB").history(start="2026-01-01", end="2026-06-30")
321
+
322
+ # hoặc
323
+ from vnbroker import Vnbroker
324
+ vn = Vnbroker(source="AUTO")
325
+ ```
326
+
327
+ Failover áp cho `history`, `intraday`, `price_depth`; kết quả có
328
+ `df.attrs["source_used"]` để biết provider nào đã phục vụ.
329
+ **Mặc định vẫn là `"KBS"`** — `auto=True` là tuỳ chọn, không phải mặc định.
330
+
331
+ ### Tầng 2 — broker (chọn provider tường minh)
332
+
333
+ ```python
334
+ vn.broker(provider="ssi").get_balance() # mỗi broker theo OpenAPI riêng
335
+ ```
336
+
337
+ ## Phiên bản 3.1.0 (2026-06-18) — Cleanup Release
338
+
339
+ ### Breaking Changes
340
+ - **Xóa hoàn toàn MSN explorer**: Không có dữ liệu thật.
341
+ - **Xóa hoàn toàn FMP connector**: Thiếu API key, không có module khác.
342
+ - **SUPPORTED_SOURCES thu hẹp**: Chỉ còn `KBS`, `VCI`, `TCBS`, `DNSE`. MSN, FMP, GATEWAY, AUTO đã bị loại.
343
+ - **Xóa `fx()`/`crypto()`/`world_index()` tests**: Các phương thức này chỉ hoạt động với MSN/FMP — đã bị xóa.
344
+
345
+ ### Removed
346
+ - Toàn bộ file rác: test scratch, benchmark artifacts, planning docs, caches, vninvest-sdk.
347
+ - Toàn bộ planning/audit docs cũ.
348
+ - `GATEWAY`, `MSN`, `FMP` khỏi `DataSource` enum, `core/settings.py`, `dispatch.py`, `source_router.py`, `user_agent.py`.
349
+ - 4 orphan test fixtures gây ERROR.
350
+ - `GatewayHttpClient`, `launcher.py`.
351
+
352
+ ### Testing
353
+ - **1001 passed**, 5 skipped — **0 failures** (tính 2026-10-02, `pytest tests/unit tests/contract`).
354
+
355
+ ## Đóng góp và hỗ trợ
356
+
357
+ Nếu bạn đang dùng vnbroker trong nghiên cứu, dashboard, hoặc công cụ nội bộ, vui lòng trích dẫn dự án và giữ nguyên thông báo giấy phép đi kèm.
358
+
359
+ ## Giấy phép
360
+
361
+ Xem [LICENSE.md](LICENSE.md) để biết điều khoản đầy đủ.