Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
5a13515
feat(dev): task #14
endless-bot May 7, 2026
7f28280
fix(ipo): resolve anyhow::Error type mismatch in member_id helper
hogan-yuan May 7, 2026
da040dc
Merge branch 'main' into endless/task-14
huacnlee May 8, 2026
d224c35
Update orders.rs
huacnlee May 8, 2026
b1cd052
Update auth.rs
huacnlee May 8, 2026
2d6d225
feat(final): task #14
endless-bot May 7, 2026
aee0e3c
cli: Add search, IPO, financial-statement, asset, and ATM commands
huacnlee May 8, 2026
3028392
.
huacnlee May 8, 2026
5339e8c
Update mod.rs
huacnlee May 8, 2026
ca63334
cli: Strip HTML tags from search result titles and excerpts
huacnlee May 8, 2026
57dfda4
cli: Fix topic search field names (creator_name, description)
huacnlee May 8, 2026
00b146b
cli: Fix IPO subscriptions display and news search time format
huacnlee May 8, 2026
c97d719
cli: Revert fabricated state_stage "0" mapping
huacnlee May 8, 2026
800fda7
cli: Fix state_stage mapping and add time to topic search
huacnlee May 8, 2026
2238de4
cli: Convert counter_id to symbol format in IPO table output
huacnlee May 8, 2026
080a9ca
cli: Improve JSON output quality across IPO, search, deposits, and ne…
huacnlee May 8, 2026
90e8055
cli: Rename withdrawal-cards to bank-cards and improve output
huacnlee May 8, 2026
877a02a
cli: Improve IPO commands — merge HK/US, fix dates, rename bank-cards
huacnlee May 8, 2026
9169f04
cli: Fix IPO listed/calendar date and amount display
huacnlee May 8, 2026
cb22837
cli: Rename IPO listed change% column to change
huacnlee May 8, 2026
4d3a9e0
cli: Fix IPO listed change column header to change%
huacnlee May 8, 2026
422647b
cli: Improve `ipo detail` Pretty output and minor fixes
huacnlee May 8, 2026
bdb711e
cli: Merge `ipo orders` and `ipo history` into single command
huacnlee May 8, 2026
3393652
cli: Align `ipo order` with top-level `order` command style
huacnlee May 8, 2026
dd0b88f
cli: Remove indent from ipo detail kv output
huacnlee May 8, 2026
e15a4ec
cli: Restore `ipo orders` plural name
huacnlee May 8, 2026
4b8a758
cli: Merge `ipo eligibility` into `ipo detail`
huacnlee May 8, 2026
f3565f1
cli: Merge `ipo holdings`, `ipo profit-loss-items` into detail/profit…
huacnlee May 8, 2026
9e72b98
cli: Improve `financial-statement` Pretty output; remove `order-stats`
huacnlee May 8, 2026
69ab08f
cli: Normalize `financial-statement` kind/report case
huacnlee May 8, 2026
06fe0ba
cli: Improve `valuation-rank` output; fix `analyst-estimates` item param
huacnlee May 8, 2026
5359a83
cli: Change valuation-rank default range to 1 month
huacnlee May 8, 2026
bfe9846
cli: Hardcode item=EPS in analyst-estimates, remove --item param
huacnlee May 8, 2026
90875cb
cli: Move short-margin under asset subcommand group
huacnlee May 8, 2026
7944d1d
cli: Move short-margin under portfolio subcommand group
huacnlee May 8, 2026
3f6086b
cli: Support multiple symbols in holding-period; default to current p…
huacnlee May 8, 2026
08ba531
cli: Improve holding-period Pretty output as symbol/days table
huacnlee May 8, 2026
5531778
cli: Move holding-period under portfolio subcommand group
huacnlee May 8, 2026
a269d1f
cli: Move trade-info under portfolio subcommand group
huacnlee May 8, 2026
d175c78
cli: Remove trade-info command
huacnlee May 8, 2026
c436d43
cli: Change holding-period to POST with JSON body
huacnlee May 8, 2026
87f5a5f
cli: Remove holding-period command
huacnlee May 8, 2026
e723206
Update orders.rs
huacnlee May 8, 2026
34e3dca
Update chart_data.rs
huacnlee May 8, 2026
daaa11b
chore: Update README commands for task-14 changes
huacnlee May 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,19 +182,58 @@ longbridge warrant issuers # Warrant issuer list (HK mark

```bash
longbridge financial-report AAPL.US [--kind IS|BS|CF] # Multi-period financial statements (income / balance sheet / cash flow)
longbridge financial-report AAPL.US --latest # Latest financial report summary
longbridge financial-statement AAPL.US [--kind IS|BS|CF|ALL] [--report af|saf|qf|cumul] # Detailed financial statement (v3 endpoint)
longbridge institution-rating AAPL.US # Analyst rating distribution and consensus target price
longbridge institution-rating AAPL.US --history # Rating and target price change history
longbridge institution-rating AAPL.US --industry-rank [--page 1] [--limit 20] # Industry-wide institution rating ranking
longbridge institution-rating detail AAPL.US # Monthly rating trend and analyst accuracy history
longbridge dividend AAPL.US # Historical dividend records
longbridge dividend detail AAPL.US # Dividend allocation plan details
longbridge forecast-eps AAPL.US # Analyst EPS consensus forecast snapshots
longbridge consensus AAPL.US # Revenue / profit / EPS multi-period comparison with beat/miss markers
longbridge valuation AAPL.US [--indicator pe|pb|ps|dvd_yld] # Current valuation snapshot and peer comparison
longbridge valuation AAPL.US --history [--indicator pe] [--range 5] # Historical valuation time series (1 / 3 / 5 / 10 years)
longbridge valuation-rank AAPL.US [--start 20240101] [--end 20241231] # Industry valuation percentile ranking (default: last 30 days)
longbridge analyst-estimates AAPL.US # Analyst consensus EPS estimates
longbridge fund-holder AAPL.US [--count 20] # Funds and ETFs holding this stock
longbridge shareholder AAPL.US [--range all|inc|dec] [--sort chg] # Institutional shareholders with QoQ change tracking
longbridge corp-action 700.HK [--all] # Corporate actions (splits, dividends, rights, etc.) — default 30, --all for full history
```

### Deposits & Withdrawals

```bash
longbridge bank-cards # List linked bank cards
longbridge withdrawals [--page 1] [--limit 20] # Withdrawal history
longbridge deposits [--page 1] [--limit 20] [--states 0,1,2] [--currencies HKD,USD] # Deposit history
```

### Search

```bash
longbridge search TSLA [--tab market|news|posts|hashtags|help|share-lists|users|institutions] # Search across multiple content types
longbridge search-hot # Hot search keywords
```

### IPO

```bash
longbridge ipo subscriptions # IPO stocks currently in filing or subscription stage
longbridge ipo wait-listing # IPO stocks in grey-market (wait-listing) stage
longbridge ipo listed [--page 1] [--limit 20] # Recently listed IPO stocks
longbridge ipo calendar # IPO calendar (all upcoming and recent IPOs)
longbridge ipo detail <symbol> [--market HK|US] # IPO profile, timeline, eligibility, and holdings for a symbol
longbridge ipo orders [--market HK] [--status 0] [--page 1] # IPO orders (active + history) for the current account
longbridge ipo orders detail <order_id> # Full detail for a single IPO order
longbridge ipo profit-loss [--period all|1m|3m|6m|1y] [--page 1] # IPO P&L summary and item list
longbridge ipo us-subscriptions # US IPO stocks currently in subscription stage
longbridge ipo us-wait-listing # US IPO stocks in wait-listing stage
longbridge ipo us-listed [--page 1] [--limit 20] # Recently listed US IPO stocks
longbridge ipo submit TSLA.US --qty 200 --amount 1000 [--method 2] # Submit IPO subscription (prompts for confirmation)
longbridge ipo withdraw <order_id> # Withdraw IPO subscription (prompts for confirmation)
```

### Market Data

```bash
Expand Down Expand Up @@ -247,6 +286,8 @@ longbridge order cancel <order_id> # Cancel a pending or
longbridge order replace <order_id> --qty 200 --price 255.00 # Modify quantity or price of a pending order
longbridge assets [--currency USD] # Asset overview: net assets, cash, buy power, margins, and per-currency breakdown
longbridge cash-flow [--start 2024-01-01] # Cash flow records (deposits, withdrawals, dividends, settlements)
longbridge portfolio # Portfolio overview: total assets, P/L, holdings, and cash breakdown
longbridge portfolio short-margin # Short-selling margin deposit details
longbridge positions # Current stock (equity) positions across all sub-accounts
longbridge fund-positions # Current fund (mutual fund) positions across all sub-accounts
longbridge margin-ratio TSLA.US # Margin ratio requirements for a symbol
Expand Down
102 changes: 0 additions & 102 deletions scripts/mock-server.ts

This file was deleted.

105 changes: 104 additions & 1 deletion src/cli/asset.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ use anyhow::Result;
use serde_json::Value;

use super::api::http_get;
use super::output::{fmt_datetime, parse_datetime_end, parse_datetime_start, print_table};
use super::output::{
fmt_datetime, parse_datetime_end, parse_datetime_start, print_json_value, print_table,
};
use super::OutputFormat;

fn print_json(value: &Value) {
Expand Down Expand Up @@ -497,3 +499,104 @@ pub async fn cmd_profit_analysis_by_market(
}
Ok(())
}

// ── short margin ─────────────────────────────────────────────────────────────

pub async fn cmd_short_margin(format: &OutputFormat, verbose: bool) -> Result<()> {
let data = http_get("/v1/asset/cash/short-margin", &[], verbose).await?;
match format {
OutputFormat::Json => print_json(&data),
OutputFormat::Pretty => {
if let Some(list) = data["short_list"].as_array() {
if list.is_empty() {
println!("No short margin records.");
return Ok(());
}
let headers = ["code", "amount", "currency"];
let rows: Vec<Vec<String>> = list
.iter()
.map(|item| {
vec![
val_str(&item["code"]),
val_str(&item["amount"]),
val_str(&item["currency"]),
]
})
.collect();
print_table(&headers, rows, &OutputFormat::Pretty);
} else {
print_json(&data);
}
}
}
Ok(())
}

// ── holding period ────────────────────────────────────────────────────────────

pub async fn cmd_holding_period(
symbols: Vec<String>,
format: &OutputFormat,
verbose: bool,
) -> Result<()> {
let resolved: Vec<String> = if symbols.is_empty() {
let resp = crate::openapi::trade().stock_positions(None).await?;
resp.channels
.into_iter()
.flat_map(|ch| ch.positions.into_iter().map(|p| p.symbol))
.collect()
} else {
symbols
};
let cids: Vec<serde_json::Value> = resolved
.iter()
.map(|s| serde_json::Value::String(crate::utils::counter::symbol_to_counter_id(s)))
.collect();
let body = serde_json::json!({ "counter_ids": cids });
let data = super::api::http_post("/v1/asset/positions/holding-period", body, verbose).await?;
match format {
OutputFormat::Json => print_json(&data),
OutputFormat::Pretty => {
if let Some(map) = data["stocks_period"].as_object() {
if map.is_empty() {
println!("No holding period data.");
return Ok(());
}
let mut rows: Vec<Vec<String>> = map
.iter()
.map(|(cid, days)| {
let symbol = crate::utils::counter::counter_id_to_symbol(cid);
let d = match days {
serde_json::Value::String(s) => s.clone(),
serde_json::Value::Number(n) => n.to_string(),
_ => "-".to_string(),
};
vec![symbol, d]
})
.collect();
rows.sort_by(|a, b| a[0].cmp(&b[0]));
print_table(&["symbol", "days held"], rows, &OutputFormat::Pretty);
} else {
print_json(&data);
}
}
}
Ok(())
}

// ── trade info (pre-trade position + cash) ───────────────────────────────────

pub async fn cmd_trade_info(symbol: String, format: &OutputFormat, verbose: bool) -> Result<()> {
let cid = crate::utils::counter::symbol_to_counter_id(&symbol);
let data = http_get(
"/v1/asset/positions/trade-info",
&[("counter_id", cid.as_str())],
verbose,
)
.await?;
match format {
OutputFormat::Json => print_json(&data),
OutputFormat::Pretty => print_json_value(&data, format),
}
Ok(())
}
Loading
Loading