# Sàng Lọc - Screening

> Lọc cổ phiếu theo bảng giá và chỉ số tài chính với where và sort.

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

const rows = await vn.screen({
  group: "VN30",                                  // hoặc exchange: "HOSE"
  where: { pe: { lt: 15 }, roe: { gt: 0.15 } },
  sort: "-roe",                                   // "-" là giảm dần
  limit: 10,
});
console.log(rows.map((r) => [r.symbol, r.pe, r.roe, r.marketCap]));
```

Cần chỉ định `group` (VN30, VN100, HNX30...) hoặc `exchange` (HOSE, HNX, UPCOM).

## Điều kiện

Mỗi trường nhận một hay nhiều toán tử: `lt`, `lte`, `gt`, `gte`, `eq`.

```ts
where: {
  price: { gte: 10000, lte: 50000 },  // đồng
  roe: { gt: 0.15 },                  // phân số: 15%
  pe: { lt: 12 },
}
```

| Nhóm trường | Ví dụ | Chi phí |
|---|---|---|
| Bảng giá | `price`, `changePercent`, `volume`, `value` | Không thêm request |
| Tỷ số quý dựng sẵn | `roe`, `roa`, `roic`, `grossMargin`, `ebitMargin`, `currentRatio`, `quickRatio`, `debtToEquity`, `dividendYield` | Không thêm request |
| Theo giá | `pe`, `pb`, `ps`, `marketCap` | Một request mỗi mã còn lại |

Điều kiện rẻ chạy trước, nên các trường theo giá chỉ được hỏi cho những mã đã qua bước đầu. Lọc theo nhóm nhanh hơn lọc cả sàn.

Mỗi dòng kết quả là một [ScreenRow](/docs/data/ScreenResult): giá, vốn hoá bằng đồng, tỷ số là phân số.

## Từ bản 1.x

`filters`, `sortBy`, `order` đã bỏ; truyền vào sẽ nhận lỗi kèm gợi ý. `{ field: "pe", operator: "<", value: 15 }` thành `where: { pe: { lt: 15 } }`, `sortBy: "roe", order: "desc"` thành `sort: "-roe"`.
