# Thị Trường - Market

> Tổng quan thị trường, độ rộng, thanh khoản, khối ngoại và lịch sử khối ngoại, thanh khoản trong phiên.

Mọi số tiền tính bằng đồng, chỉ số tính bằng điểm. Sàn: `HOSE` (mặc định), `HNX`, `UPCOM`, `ALL`.

## Tổng quan

```ts
import { vn } from "vnstock-js";

const m = await vn.market({ exchange: "HOSE" });
```

```json
{
  "date": "2026-10-20",
  "index": { "symbol": "VNINDEX", "close": 1689.12, "change": -0.72, "changePercent": -0.043, "volume": 514718024 },
  "liquidity": { "index": "VNINDEX", "value": 11650231190150, "valuePrevious": 13354737798630, "changePercent": -12.763, "unit": "VND" },
  "breadth": { "exchange": "HOSE", "advancing": 184, "declining": 144, "unchanged": 55, "ceiling": 10, "floor": 5, "total": 383 },
  "foreign": { "exchange": "HOSE", "buyValue": 1682715999463, "sellValue": 1857911081930, "netValue": -175195082467, "topNetBuy": [], "topNetSell": [], "unit": "VND" }
}
```

Truyền `asOf` để lấy bối cảnh của một phiên đã qua (xu hướng, thanh khoản so với trung bình 20 phiên); độ rộng và khối ngoại khi đó là `null` vì nguồn chỉ có cho phiên hiện tại.

```ts
const past = await vn.market({ asOf: "2026-10-10" });
console.log(past.regime, past.notes);
```

## Từng phần

```ts
const breadth = await vn.market.breadth({ exchange: "HNX" });
const liquidity = await vn.market.liquidity({ index: "VN30" });
const foreign = await vn.market.foreign({ exchange: "HOSE", top: 5 }); // phiên hiện tại, kèm top mua bán ròng
const context = await vn.market.context({ index: "VNINDEX" });         // cho LLM
```

## Lịch sử khối ngoại

VCI chỉ cho xem khối ngoại của phiên hiện tại. Repo vnstock-js tự ghi mỗi ngày sau 15:30 vào `data/foreign` và gộp theo tháng; truyền `range` để đọc lại:

```ts
const fpt = await vn.stock("FPT").foreign("3mo");                 // mỗi phiên một dòng
const hose = await vn.market.foreign({ range: "1mo" });
const all = await vn.market.foreign({ range: { from: "2026-10-01" }, exchange: "ALL" });

const net = fpt.reduce((sum, d) => sum + d.netValue, 0);         // ròng cộng dồn, đồng
```

> **Lưu ý:** Dữ liệu chỉ có từ ngày bắt đầu ghi (năm 2026). Phiên trước đó không có trong kết quả, không phải số 0. Phiên đã ghi mà mã không có giao dịch khối ngoại thì trả số 0.

## Thanh khoản trong phiên

```ts
const d = await vn.market.intraday({ exchange: "HOSE" });
console.log(d.liquidity.value, d.liquidity.changePercent, d.breadth.advancing, d.points.length);
```

`points` là thanh khoản luỹ kế theo từng phút của phiên hiện tại (phiên gần nhất khi đã đóng cửa), mỗi điểm kèm `valuePrevious` là luỹ kế của phiên trước tại cùng giờ. Giờ nghỉ trưa không có điểm nào; phiên ATC là một điểm lúc 14:45. Độ rộng là của bảng giá lúc gọi, không theo thời gian.

## Sức khoẻ thị trường

```ts
const health = await vn.index("VNINDEX").health();
console.log(health.status, health.distributionCount);
```

Chấm sức khoẻ thị trường theo phương pháp của William O'Neil: đếm ngày phân phối trong 25 phiên và tìm ngày bùng nổ xác nhận sau một đáy.
