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.
- vnbroker-3.5.0/LICENSE.md +66 -0
- vnbroker-3.5.0/MANIFEST.in +28 -0
- vnbroker-3.5.0/PKG-INFO +361 -0
- vnbroker-3.5.0/README.md +306 -0
- vnbroker-3.5.0/pyproject.toml +133 -0
- vnbroker-3.5.0/setup.cfg +4 -0
- vnbroker-3.5.0/tests/test_acb_all_providers.py +287 -0
- vnbroker-3.5.0/vnbroker/__init__.py +93 -0
- vnbroker-3.5.0/vnbroker/analytics/__init__.py +31 -0
- vnbroker-3.5.0/vnbroker/analytics/indicators.py +379 -0
- vnbroker-3.5.0/vnbroker/api/__init__.py +0 -0
- vnbroker-3.5.0/vnbroker/api/broker.py +57 -0
- vnbroker-3.5.0/vnbroker/api/company.py +209 -0
- vnbroker-3.5.0/vnbroker/api/financial.py +147 -0
- vnbroker-3.5.0/vnbroker/api/listing.py +191 -0
- vnbroker-3.5.0/vnbroker/api/news.py +115 -0
- vnbroker-3.5.0/vnbroker/api/quote.py +334 -0
- vnbroker-3.5.0/vnbroker/api/snapshot.py +463 -0
- vnbroker-3.5.0/vnbroker/api/stream.py +292 -0
- vnbroker-3.5.0/vnbroker/api/trading.py +210 -0
- vnbroker-3.5.0/vnbroker/base.py +195 -0
- vnbroker-3.5.0/vnbroker/bot/notify.py +599 -0
- vnbroker-3.5.0/vnbroker/broker/__init__.py +58 -0
- vnbroker-3.5.0/vnbroker/broker/base.py +74 -0
- vnbroker-3.5.0/vnbroker/broker/exceptions.py +63 -0
- vnbroker-3.5.0/vnbroker/broker/registry.py +100 -0
- vnbroker-3.5.0/vnbroker/broker/security/__init__.py +5 -0
- vnbroker-3.5.0/vnbroker/broker/security/audit.py +101 -0
- vnbroker-3.5.0/vnbroker/broker/security/credentials.py +272 -0
- vnbroker-3.5.0/vnbroker/broker/security/guards.py +73 -0
- vnbroker-3.5.0/vnbroker/broker/security/idempotency.py +78 -0
- vnbroker-3.5.0/vnbroker/broker/security/redaction.py +169 -0
- vnbroker-3.5.0/vnbroker/broker/session.py +221 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/__init__.py +65 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/_enums.py +127 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/_paths.py +52 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/_signing.py +125 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/_transport.py +285 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/_utils.py +133 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/account.py +80 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/auth.py +322 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/client.py +779 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/equity.py +431 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/exceptions.py +28 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/fco.py +771 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/market.py +615 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/money.py +248 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/portfolio.py +397 -0
- vnbroker-3.5.0/vnbroker/broker/ssi/stream.py +825 -0
- vnbroker-3.5.0/vnbroker/broker/tcbs/__init__.py +34 -0
- vnbroker-3.5.0/vnbroker/broker/tcbs/account.py +937 -0
- vnbroker-3.5.0/vnbroker/broker/tcbs/auth.py +178 -0
- vnbroker-3.5.0/vnbroker/broker/tcbs/client.py +689 -0
- vnbroker-3.5.0/vnbroker/broker/tcbs/derivatives.py +852 -0
- vnbroker-3.5.0/vnbroker/broker/tcbs/equity.py +980 -0
- vnbroker-3.5.0/vnbroker/broker/tcbs/exceptions.py +30 -0
- vnbroker-3.5.0/vnbroker/broker/tcbs/market.py +395 -0
- vnbroker-3.5.0/vnbroker/broker/tcbs/money.py +563 -0
- vnbroker-3.5.0/vnbroker/broker/tcbs/portfolio.py +296 -0
- vnbroker-3.5.0/vnbroker/brokerage/base.py +337 -0
- vnbroker-3.5.0/vnbroker/brokerage/tcbs/client.py +467 -0
- vnbroker-3.5.0/vnbroker/common/__init__.py +35 -0
- vnbroker-3.5.0/vnbroker/common/client.py +282 -0
- vnbroker-3.5.0/vnbroker/common/data.py +1743 -0
- vnbroker-3.5.0/vnbroker/common/indices.py +220 -0
- vnbroker-3.5.0/vnbroker/common/retail.py +188 -0
- vnbroker-3.5.0/vnbroker/common/stream.py +254 -0
- vnbroker-3.5.0/vnbroker/config.py +113 -0
- vnbroker-3.5.0/vnbroker/connector/__init__.py +13 -0
- vnbroker-3.5.0/vnbroker/connector/binance/__init__.py +9 -0
- vnbroker-3.5.0/vnbroker/connector/binance/client.py +177 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/__init__.py +5 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/client.py +450 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/core/__init__.py +27 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/core/auth.py +10 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/core/config.py +22 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/core/errors.py +66 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/core/http_client.py +103 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/core/models.py +18 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/core/signature.py +79 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/services/__init__.py +13 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/services/account_service.py +73 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/services/market_service.py +106 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/services/order_service.py +166 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/services/position_service.py +39 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/services/token_service.py +19 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/trade.py +1294 -0
- vnbroker-3.5.0/vnbroker/connector/dnse/websocket.py +249 -0
- vnbroker-3.5.0/vnbroker/constants.py +238 -0
- vnbroker-3.5.0/vnbroker/core/__init__.py +19 -0
- vnbroker-3.5.0/vnbroker/core/adaptive_controller.py +287 -0
- vnbroker-3.5.0/vnbroker/core/config/__init__.py +0 -0
- vnbroker-3.5.0/vnbroker/core/config/const.py +33 -0
- vnbroker-3.5.0/vnbroker/core/config/ggcolab.py +438 -0
- vnbroker-3.5.0/vnbroker/core/constants.py +63 -0
- vnbroker-3.5.0/vnbroker/core/converter/__init__.py +0 -0
- vnbroker-3.5.0/vnbroker/core/converter/export.py +13 -0
- vnbroker-3.5.0/vnbroker/core/exceptions.py +372 -0
- vnbroker-3.5.0/vnbroker/core/health_store.py +160 -0
- vnbroker-3.5.0/vnbroker/core/models.py +80 -0
- vnbroker-3.5.0/vnbroker/core/performance_profiles.py +164 -0
- vnbroker-3.5.0/vnbroker/core/registry.py +178 -0
- vnbroker-3.5.0/vnbroker/core/settings.py +333 -0
- vnbroker-3.5.0/vnbroker/core/source_router.py +405 -0
- vnbroker-3.5.0/vnbroker/core/types.py +581 -0
- vnbroker-3.5.0/vnbroker/core/unified_registry.py +202 -0
- vnbroker-3.5.0/vnbroker/core/utils/__init__.py +162 -0
- vnbroker-3.5.0/vnbroker/core/utils/async_client.py +434 -0
- vnbroker-3.5.0/vnbroker/core/utils/browser_profiles.py +122 -0
- vnbroker-3.5.0/vnbroker/core/utils/cache.py +299 -0
- vnbroker-3.5.0/vnbroker/core/utils/client.py +365 -0
- vnbroker-3.5.0/vnbroker/core/utils/compat.py +304 -0
- vnbroker-3.5.0/vnbroker/core/utils/deprecation.py +275 -0
- vnbroker-3.5.0/vnbroker/core/utils/env.py +264 -0
- vnbroker-3.5.0/vnbroker/core/utils/execution.py +37 -0
- vnbroker-3.5.0/vnbroker/core/utils/ext.py +45 -0
- vnbroker-3.5.0/vnbroker/core/utils/field/__init__.py +20 -0
- vnbroker-3.5.0/vnbroker/core/utils/field/handler.py +333 -0
- vnbroker-3.5.0/vnbroker/core/utils/field/kbs_mappings.py +1304 -0
- vnbroker-3.5.0/vnbroker/core/utils/field/mapper.py +327 -0
- vnbroker-3.5.0/vnbroker/core/utils/field/normalizer.py +226 -0
- vnbroker-3.5.0/vnbroker/core/utils/field/validator.py +394 -0
- vnbroker-3.5.0/vnbroker/core/utils/help.py +30 -0
- vnbroker-3.5.0/vnbroker/core/utils/interval.py +142 -0
- vnbroker-3.5.0/vnbroker/core/utils/logger.py +139 -0
- vnbroker-3.5.0/vnbroker/core/utils/lookback.py +223 -0
- vnbroker-3.5.0/vnbroker/core/utils/market.py +249 -0
- vnbroker-3.5.0/vnbroker/core/utils/market_events.py +387 -0
- vnbroker-3.5.0/vnbroker/core/utils/parser.py +1106 -0
- vnbroker-3.5.0/vnbroker/core/utils/proxy_manager.py +508 -0
- vnbroker-3.5.0/vnbroker/core/utils/transform.py +1056 -0
- vnbroker-3.5.0/vnbroker/core/utils/upgrade.py +459 -0
- vnbroker-3.5.0/vnbroker/core/utils/user_agent.py +276 -0
- vnbroker-3.5.0/vnbroker/core/utils/validation.py +121 -0
- vnbroker-3.5.0/vnbroker/explorer/__init__.py +1 -0
- vnbroker-3.5.0/vnbroker/explorer/dnse/__init__.py +33 -0
- vnbroker-3.5.0/vnbroker/explorer/dnse/company.py +291 -0
- vnbroker-3.5.0/vnbroker/explorer/dnse/finance.py +228 -0
- vnbroker-3.5.0/vnbroker/explorer/dnse/financial.py +22 -0
- vnbroker-3.5.0/vnbroker/explorer/dnse/listing.py +256 -0
- vnbroker-3.5.0/vnbroker/explorer/dnse/news.py +184 -0
- vnbroker-3.5.0/vnbroker/explorer/dnse/quote.py +602 -0
- vnbroker-3.5.0/vnbroker/explorer/dnse/trading.py +148 -0
- vnbroker-3.5.0/vnbroker/explorer/fmarket/__init__.py +3 -0
- vnbroker-3.5.0/vnbroker/explorer/fmarket/const.py +56 -0
- vnbroker-3.5.0/vnbroker/explorer/fmarket/fund.py +460 -0
- vnbroker-3.5.0/vnbroker/explorer/kbs/__init__.py +12 -0
- vnbroker-3.5.0/vnbroker/explorer/kbs/company.py +808 -0
- vnbroker-3.5.0/vnbroker/explorer/kbs/const.py +597 -0
- vnbroker-3.5.0/vnbroker/explorer/kbs/financial.py +828 -0
- vnbroker-3.5.0/vnbroker/explorer/kbs/listing.py +688 -0
- vnbroker-3.5.0/vnbroker/explorer/kbs/news.py +53 -0
- vnbroker-3.5.0/vnbroker/explorer/kbs/quote.py +734 -0
- vnbroker-3.5.0/vnbroker/explorer/kbs/screener.py +130 -0
- vnbroker-3.5.0/vnbroker/explorer/kbs/stream.py +344 -0
- vnbroker-3.5.0/vnbroker/explorer/kbs/trading.py +256 -0
- vnbroker-3.5.0/vnbroker/explorer/misc/__init__.py +2 -0
- vnbroker-3.5.0/vnbroker/explorer/misc/exchange_rate.py +58 -0
- vnbroker-3.5.0/vnbroker/explorer/misc/gold_price.py +144 -0
- vnbroker-3.5.0/vnbroker/explorer/rss_cafef/__init__.py +3 -0
- vnbroker-3.5.0/vnbroker/explorer/rss_cafef/news.py +92 -0
- vnbroker-3.5.0/vnbroker/explorer/rss_vneconomy/__init__.py +3 -0
- vnbroker-3.5.0/vnbroker/explorer/rss_vneconomy/news.py +90 -0
- vnbroker-3.5.0/vnbroker/explorer/ssi/__init__.py +40 -0
- vnbroker-3.5.0/vnbroker/explorer/ssi/_auth.py +182 -0
- vnbroker-3.5.0/vnbroker/explorer/ssi/company.py +250 -0
- vnbroker-3.5.0/vnbroker/explorer/ssi/financial.py +105 -0
- vnbroker-3.5.0/vnbroker/explorer/ssi/indices.py +177 -0
- vnbroker-3.5.0/vnbroker/explorer/ssi/listing.py +203 -0
- vnbroker-3.5.0/vnbroker/explorer/ssi/live.py +271 -0
- vnbroker-3.5.0/vnbroker/explorer/ssi/news.py +89 -0
- vnbroker-3.5.0/vnbroker/explorer/ssi/quote.py +334 -0
- vnbroker-3.5.0/vnbroker/explorer/ssi/screener.py +159 -0
- vnbroker-3.5.0/vnbroker/explorer/ssi/securities.py +155 -0
- vnbroker-3.5.0/vnbroker/explorer/ssi/trading.py +201 -0
- vnbroker-3.5.0/vnbroker/explorer/tcbs/__init__.py +18 -0
- vnbroker-3.5.0/vnbroker/explorer/tcbs/auth.py +86 -0
- vnbroker-3.5.0/vnbroker/explorer/tcbs/company.py +504 -0
- vnbroker-3.5.0/vnbroker/explorer/tcbs/const.py +137 -0
- vnbroker-3.5.0/vnbroker/explorer/tcbs/financial.py +265 -0
- vnbroker-3.5.0/vnbroker/explorer/tcbs/listing.py +373 -0
- vnbroker-3.5.0/vnbroker/explorer/tcbs/news.py +55 -0
- vnbroker-3.5.0/vnbroker/explorer/tcbs/quote.py +801 -0
- vnbroker-3.5.0/vnbroker/explorer/tcbs/screener.py +186 -0
- vnbroker-3.5.0/vnbroker/explorer/tcbs/stream.py +170 -0
- vnbroker-3.5.0/vnbroker/explorer/tcbs/tcbs_compatibility.py +330 -0
- vnbroker-3.5.0/vnbroker/explorer/tcbs/trading.py +141 -0
- vnbroker-3.5.0/vnbroker/explorer/tcbs/websocket.py +412 -0
- vnbroker-3.5.0/vnbroker/explorer/tcbs/ws_models.py +89 -0
- vnbroker-3.5.0/vnbroker/explorer/vci/__init__.py +8 -0
- vnbroker-3.5.0/vnbroker/explorer/vci/company.py +352 -0
- vnbroker-3.5.0/vnbroker/explorer/vci/const.py +457 -0
- vnbroker-3.5.0/vnbroker/explorer/vci/financial.py +677 -0
- vnbroker-3.5.0/vnbroker/explorer/vci/listing.py +388 -0
- vnbroker-3.5.0/vnbroker/explorer/vci/news.py +53 -0
- vnbroker-3.5.0/vnbroker/explorer/vci/quote.py +700 -0
- vnbroker-3.5.0/vnbroker/explorer/vci/screener.py +130 -0
- vnbroker-3.5.0/vnbroker/explorer/vci/stream.py +344 -0
- vnbroker-3.5.0/vnbroker/explorer/vci/trading.py +156 -0
- vnbroker-3.5.0/vnbroker/news/__init__.py +18 -0
- vnbroker-3.5.0/vnbroker/news/dedup.py +29 -0
- vnbroker-3.5.0/vnbroker/news/filtering.py +68 -0
- vnbroker-3.5.0/vnbroker/news/health.py +106 -0
- vnbroker-3.5.0/vnbroker/news/monitor.py +56 -0
- vnbroker-3.5.0/vnbroker/news/normalize.py +144 -0
- vnbroker-3.5.0/vnbroker/ui/__init__.py +20 -0
- vnbroker-3.5.0/vnbroker/ui/fundamental.py +48 -0
- vnbroker-3.5.0/vnbroker/ui/market.py +47 -0
- vnbroker-3.5.0/vnbroker/ui/reference.py +56 -0
- vnbroker-3.5.0/vnbroker/ui/registry.py +81 -0
- vnbroker-3.5.0/vnbroker/ui/retail.py +38 -0
- vnbroker-3.5.0/vnbroker.egg-info/PKG-INFO +361 -0
- vnbroker-3.5.0/vnbroker.egg-info/SOURCES.txt +214 -0
- vnbroker-3.5.0/vnbroker.egg-info/dependency_links.txt +1 -0
- vnbroker-3.5.0/vnbroker.egg-info/requires.txt +27 -0
- 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
|
vnbroker-3.5.0/PKG-INFO
ADDED
|
@@ -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 đủ.
|