Sub/Unsub Trading Data
Theo dõi và hủy theo dõi dữ liệu giao dịch qua WebSocket FastConnect — bao gồm lệnh thường, khớp lệnh, danh mục và lệnh điều kiện (FCO).
Tổng quan
Kênh TRADING cho phép client nhận các sự kiện giao dịch theo thời gian thực: trạng thái lệnh, khớp lệnh, thay đổi danh mục và sự kiện lệnh điều kiện (FCO).
Client cần subscribe theo tài khoản (accountNo) để nhận event. Mỗi topic tương ứng với một nhóm sự kiện cụ thể.
Topic pattern
order.[accountNo|*]
portfolio.[accountNo|*]| Topic | Mô tả | Ví dụ |
|---|---|---|
order.<accountNo> | Sự kiện lệnh (đặt/sửa/hủy/khớp) và lệnh điều kiện (FCO) của một tài khoản cụ thể | order.0901351 |
order.* | Sự kiện lệnh và lệnh điều kiện (FCO) của tất cả tài khoản | order.* |
portfolio.<accountNo> | Cập nhật danh mục (số dư, margin) của một tài khoản cụ thể | portfolio.0901351 |
portfolio.* | Cập nhật danh mục của tất cả tài khoản | portfolio.* |
Lưu ý: Sự kiện lệnh điều kiện (FCO) được trả về trên cùng kênh
order— không cần subscribe topic riêng.
Subscribe
Gửi message với method: "SUBSCRIBE" và channel: "TRADING":
{
"method": "SUBSCRIBE",
"channel": "TRADING",
"topics": ["order.0901351", "portfolio.0901351"]
}Quy tắc subscribe
- Có thể subscribe nhiều topic trong cùng một message.
- Subscribe
order.*sẽ nhận event lệnh của tất cả tài khoản (bao gồm cả lệnh điều kiện FCO). - Subscribe
portfolio.*sẽ nhận event danh mục của tất cả tài khoản. - Subscribe cùng topic nhiều lần không gây lỗi — server bỏ qua topic đã subscribe.
- Sau khi reconnect, client phải subscribe lại toàn bộ topic cần theo dõi.
Unsubscribe
Gửi message với method: "UNSUBSCRIBE" và channel: "TRADING":
{
"method": "UNSUBSCRIBE",
"channel": "TRADING",
"topics": ["order.0901351", "portfolio.0901351"]
}Quy tắc unsubscribe
- Chỉ unsubscribe các topic đã subscribe trước đó.
- Unsubscribe topic chưa subscribe không gây lỗi — server bỏ qua.
- Unsubscribe không ảnh hưởng đến các topic khác đang subscribe.
- Để kiểm tra danh sách topic đang subscribe, dùng
LIST_SUBSCRIPTION.
Kiểm tra subscription hiện tại
{
"method": "LIST_SUBSCRIPTION"
}Response trả về scope theo nhóm:
{
"trading": "order.0901351;portfolio.0901351",
"data": ""
}Các loại event
Sau khi subscribe thành công, client sẽ nhận các event sau theo thời gian thực.
Binding event trong SDK
client.bind(client.events.onOrderEvent, function (e, data) {
console.log(e + ": ");
console.log(JSON.stringify(data));
});
client.bind(client.events.onOrderMatchEvent, function (e, data) {
console.log(e + ": ");
console.log(JSON.stringify(data));
});
client.bind(client.events.onClientPortfolioEvent, function (e, data) {
console.log(e + ": ");
console.log(JSON.stringify(data));
});Sự kiện lệnh điều kiện (FCO) được trả về qua cùng binding
onClientPortfolioEvent.
Order Event
Sự kiện trạng thái lệnh — phát sinh khi lệnh được đặt, sửa, hủy hoặc thay đổi trạng thái.
{
"eventType": "orderEvent",
"notifyId": "8c0f5f1f-7f35-4db6-8bc1-2e2ad96dca90",
"connectionId": "9f4b2b27-0ef8-4b38-a4c4-0f5d8c9f1001",
"clientRequestId": "abc-123",
"orderId": "12345678",
"accountNo": "0901351",
"symbol": "SSI",
"side": "B",
"orderType": "LO",
"price": 24500,
"quantity": 100,
"filledQty": 50,
"orderStatus": "PARTIAL_FILLED"
}| Trường | Kiểu | Mô tả |
|---|---|---|
eventType | string | Loại event: "orderEvent" |
notifyId | string | ID thông báo duy nhất |
connectionId | string | ID kết nối WebSocket hiện tại |
clientRequestId | string | ID yêu cầu do client gửi khi đặt lệnh — dùng để đối chiếu response |
orderId | string | Mã lệnh do hệ thống giao dịch cấp |
accountNo | string | Số tài khoản giao dịch |
symbol | string | Mã chứng khoán |
side | string | Chiều giao dịch: "B" (Buy) hoặc "S" (Sell) |
orderType | string | Loại lệnh: "LO", "MP", "MOK", "MTL", "ATO", "ATC" |
price | number | Giá đặt lệnh (đơn vị đồng) |
quantity | number | Khối lượng đặt |
filledQty | number | Khối lượng đã khớp |
orderStatus | string | Trạng thái lệnh: "NEW", "PARTIAL_FILLED", "FILLED", "CANCELED", "REJECTED" |
Order Match Event
Sự kiện khớp lệnh — phát sinh khi lệnh được khớp (một phần hoặc toàn bộ).
{
"eventType": "orderMatchEvent",
"notifyId": "646ed512-f5d7-4d9d-b111-59e6124b0d28",
"connectionId": "9f4b2b27-0ef8-4b38-a4c4-0f5d8c9f1001",
"orderId": "12345678",
"accountNo": "0901351",
"symbol": "SSI",
"side": "B",
"matchedPrice": 24500,
"matchedQty": 50,
"tradingDate": "2026-04-24"
}| Trường | Kiểu | Mô tả |
|---|---|---|
eventType | string | Loại event: "orderMatchEvent" |
notifyId | string | ID thông báo duy nhất |
connectionId | string | ID kết nối WebSocket hiện tại |
orderId | string | Mã lệnh được khớp |
accountNo | string | Số tài khoản giao dịch |
symbol | string | Mã chứng khoán |
side | string | Chiều giao dịch: "B" (Buy) hoặc "S" (Sell) |
matchedPrice | number | Giá khớp (đơn vị đồng) |
matchedQty | number | Khối lượng khớp trong lần khớp này |
tradingDate | string | Ngày giao dịch, định dạng YYYY-MM-DD |
Client Portfolio Event
Sự kiện cập nhật danh mục — phát sinh khi số dư hoặc tài sản thay đổi.
{
"eventType": "clientPortfolioEvent",
"notifyId": "d2130d79-241d-4b75-bfad-c7785a5ddfd8",
"connectionId": "9f4b2b27-0ef8-4b38-a4c4-0f5d8c9f1001",
"accountNo": "0901351",
"cashBalance": 5000000,
"availableBalance": 4500000,
"marketValue": 12000000,
"marginRatio": 35.5
}| Trường | Kiểu | Mô tả |
|---|---|---|
eventType | string | Loại event: "clientPortfolioEvent" |
notifyId | string | ID thông báo duy nhất |
connectionId | string | ID kết nối WebSocket hiện tại |
accountNo | string | Số tài khoản giao dịch |
cashBalance | number | Số dư tiền mặt (đơn vị đồng) |
availableBalance | number | Số dư khả dụng (đơn vị đồng) |
marketValue | number | Giá trị thị trường của danh mục (đơn vị đồng) |
marginRatio | number | Tỷ lệ margin hiện tại (%) |
FCO Event (Lệnh điều kiện)
Sự kiện lệnh điều kiện (FCO — FastConnect Conditional Order) — phát sinh khi lệnh điều kiện thay đổi trạng thái (khởi tạo, kích hoạt, khớp, hủy...).
FCO Event được trả về trên cùng kênh streaming
order— client nhận qua bindingonClientPortfolioEvent.
client.bind(client.events.onClientPortfolioEvent, function (e, data) {
// Xử lý FCO event
console.log(e + ": ");
console.log(JSON.stringify(data));
});Ví dụ FCO Event Response:
{
"type": "fcoEvent",
"data": {
"fcoId": "7528ac20-a340-4233-8bb7-a2379fc3c638",
"notifyID": 1249008,
"processStatus": "INIT",
"matchedQuantity": 0,
"isPlaceOrder": false,
"instrumentID": "ssi",
"quantity": 4000,
"price": "MP",
"account": "1231496",
"updatedTime": "1751966448000",
"status": "200",
"message": "Success",
"username": "123149"
}
}| Trường | Kiểu | Mô tả | Giá trị hợp lệ / Định dạng |
|---|---|---|---|
type | string | Loại event | "fcoEvent" |
data | object | Thông tin chi tiết của event | — |
data.fcoId | string | ID lệnh điều kiện | UUID |
data.notifyID | number | ID thông báo | — |
data.processStatus | string | Trạng thái xử lý lệnh điều kiện | Tham khảo Phụ lục FCO |
data.matchedQuantity | number | Khối lượng đã khớp | — |
data.isPlaceOrder | boolean | Trạng thái phát sinh lệnh con | true: Có lệnh thực phát sinh (xuất hiện lệnh ở Orderbook). false: Chưa có lệnh thực phát sinh |
data.instrumentID | string | Mã chứng khoán. Đối với phái sinh, truyền theo mã tổng quát hoặc chi tiết: 1M, 2M, 1Q, 2Q, VN30FYYMM | — |
data.quantity | number | Khối lượng muốn đặt lệnh | — |
data.price | string | Giá đặt (đơn vị đồng) | Giá số (vd: "23500") hoặc "MP", "MOK", "MTL" |
data.account | string | Tiểu khoản đặt lệnh (ví dụ tài khoản đuôi 8, đuôi 6) | — |
data.updatedTime | string | Thời gian cập nhật (Unix timestamp milliseconds) | "1751966448000" |
data.status | string | Mã trạng thái | Tham chiếu bảng mã lỗi |
data.message | string | Thông báo kết quả hoặc lỗi | — |
data.username | string | ID người dùng tại SSI | — |
Tham khảo thêm
- Kết nối WebSocket — thiết lập kết nối và xác thực
- Heartbeat — cơ chế ping/pong giữ kết nối
- Sub/Unsub Market Data — theo dõi dữ liệu thị trường
- Phụ lục FCO — chi tiết các loại lệnh điều kiện
- Bảng mã lỗi — tra cứu mã trạng thái và lỗi