mirror of
https://github.com/0xrsydn/idx-cli.git
synced 2026-11-07 01:35:36 +00:00
feat(core): broker summaries from IPOT
Adds a BrokerSummaryProvider capability served by Indo Premier's public broker summary page: the top 10 buyers and sellers of a stock by lots over a date range, with totals. No login or key. - api/ipot: pure parser (decimal scaling of `1.6 M`-style figures), a client that retries the server's spurious 404s, and a fixture mock. - broker: Broker::summary/latest over the cache (7 days for closed ranges, 5 minutes for today), range checks, and IDX member names bundled from GetBrokerCodeList. - foreign_net_value is null for filtered summaries: the source does not apply the filters to it. The endpoint's behavior was first mapped by fzn0x/idx (MIT). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V3syn2fN2LNo5pvTSqc6eh
This commit is contained in:
parent
ebdba13a41
commit
2c93c73b6a
16 changed files with 1767 additions and 1 deletions
|
|
@ -51,6 +51,8 @@ command parses arguments, makes one idx-core call, and renders the result.
|
|||
### Dual Provider Model
|
||||
- **MSN Finance** — default provider. Rich data: quotes, fundamentals, profile, earnings, financials, sentiment, insights, news, screener, and explicit price-only chart history for supported IDX windows.
|
||||
- **Yahoo Finance** — default/auto history source. Reliable OHLCV data via `/v8/finance/chart/`.
|
||||
- **IPOT (Indo Premier)** — broker summaries, whichever provider is selected
|
||||
(`BrokerSummaryProvider`). See [Broker Summaries](#broker-summaries).
|
||||
|
||||
### MSN Endpoints
|
||||
- `https://assets.msn.com/service/`: quotes, charts, equities, earnings,
|
||||
|
|
@ -83,6 +85,22 @@ WIB as the fallback.
|
|||
when the initial batch is incomplete, and rejects a still-truncated response.
|
||||
- Full-list screen caches use an `all` key, separate from older limited results.
|
||||
|
||||
### Broker Summaries
|
||||
- `GET https://www.indopremier.com/module/saham/include/data-brokersummary.php`
|
||||
takes `code`, `start`/`end` (`MM/DD/YYYY`), `fd` (`all|F|D`) and `board`
|
||||
(`all|RG|TN|NG`). It needs no login and answers an HTML fragment: the top 10
|
||||
buyers and top 10 sellers ranked by lots (gross, so a broker can be on both
|
||||
sides), plus range totals. `api/ipot/parse.rs` parses it purely.
|
||||
- Figures of a million and more arrive abbreviated (`1.6 M`); they are scaled
|
||||
in decimal and the summary's `rounded` flag says so. `F. NVal` ignores the
|
||||
investor and board filters, so `foreign_net_value` is null for a filtered
|
||||
summary.
|
||||
- An unknown code is a 200 with `Invalid stock code!` (`SYMBOLNOTFOUND`). The
|
||||
server also answers spurious nginx 404s for seconds at a time, so the client
|
||||
retries 404 and 5xx with backoff. A range without trades is an empty summary.
|
||||
- Data is end of day: IDX hides broker codes during trading. Summaries that
|
||||
ended before today are cached for 7 days, today's for 5 minutes. Broker
|
||||
names come from `broker/codes.tsv` (IDX `GetBrokerCodeList`).
|
||||
|
||||
### Capability Gating
|
||||
```
|
||||
|
|
@ -92,6 +110,7 @@ HistoryProvider = separate trait, not all providers implement
|
|||
Factory functions:
|
||||
default_provider(kind) → Box<dyn MarketDataProvider>
|
||||
history_provider(kind, mode, verbose) → Result<(ProviderKind, Box<dyn HistoryProvider>)>
|
||||
broker_provider() → Box<dyn BrokerSummaryProvider>
|
||||
```
|
||||
|
||||
## Ownership Module (SQLite-backed)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue