WebSocket

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|*]
TopicMô 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ảnorder.*
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ảnportfolio.*

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"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"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ườngKiểuMô tả
eventTypestringLoại event: "orderEvent"
notifyIdstringID thông báo duy nhất
connectionIdstringID kết nối WebSocket hiện tại
clientRequestIdstringID yêu cầu do client gửi khi đặt lệnh — dùng để đối chiếu response
orderIdstringMã lệnh do hệ thống giao dịch cấp
accountNostringSố tài khoản giao dịch
symbolstringMã chứng khoán
sidestringChiều giao dịch: "B" (Buy) hoặc "S" (Sell)
orderTypestringLoại lệnh: "LO", "MP", "MOK", "MTL", "ATO", "ATC"
pricenumberGiá đặt lệnh (đơn vị đồng)
quantitynumberKhối lượng đặt
filledQtynumberKhối lượng đã khớp
orderStatusstringTrạ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ườngKiểuMô tả
eventTypestringLoại event: "orderMatchEvent"
notifyIdstringID thông báo duy nhất
connectionIdstringID kết nối WebSocket hiện tại
orderIdstringMã lệnh được khớp
accountNostringSố tài khoản giao dịch
symbolstringMã chứng khoán
sidestringChiều giao dịch: "B" (Buy) hoặc "S" (Sell)
matchedPricenumberGiá khớp (đơn vị đồng)
matchedQtynumberKhối lượng khớp trong lần khớp này
tradingDatestringNgà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ườngKiểuMô tả
eventTypestringLoại event: "clientPortfolioEvent"
notifyIdstringID thông báo duy nhất
connectionIdstringID kết nối WebSocket hiện tại
accountNostringSố tài khoản giao dịch
cashBalancenumberSố dư tiền mặt (đơn vị đồng)
availableBalancenumberSố dư khả dụng (đơn vị đồng)
marketValuenumberGiá trị thị trường của danh mục (đơn vị đồng)
marginRationumberTỷ 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 binding onClientPortfolioEvent.

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ườngKiểuMô tảGiá trị hợp lệ / Định dạng
typestringLoại event"fcoEvent"
dataobjectThông tin chi tiết của event
data.fcoIdstringID lệnh điều kiệnUUID
data.notifyIDnumberID thông báo
data.processStatusstringTrạng thái xử lý lệnh điều kiệnTham khảo Phụ lục FCO
data.matchedQuantitynumberKhối lượng đã khớp
data.isPlaceOrderbooleanTrạng thái phát sinh lệnh contrue: 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.instrumentIDstringMã 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.quantitynumberKhối lượng muốn đặt lệnh
data.pricestringGiá đặt (đơn vị đồng)Giá số (vd: "23500") hoặc "MP", "MOK", "MTL"
data.accountstringTiểu khoản đặt lệnh (ví dụ tài khoản đuôi 8, đuôi 6)
data.updatedTimestringThời gian cập nhật (Unix timestamp milliseconds)"1751966448000"
data.statusstringMã trạng tháiTham chiếu bảng mã lỗi
data.messagestringThông báo kết quả hoặc lỗi
data.usernamestringID người dùng tại SSI

Tham khảo thêm

Trên trang này