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-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.1231991
order.<accountNo1>-<accountNo2>Sự kiện lệnh của nhiều tài khoản cụ thểorder.1231996-1231998
order.*Sự kiện lệnh và lệnh điều kiện (FCO) của tất cả tài khoản trong phạm vi quyềnorder.*
portfolio.<accountNo>Cập nhật danh mục (tài sản, vị thế) của một tài khoản cụ thểportfolio.1231991
portfolio.<accountNo1>-<accountNo2>Cập nhật danh mục của nhiều tài khoản cụ thểportfolio.1231996-1231998
portfolio.*Cập nhật danh mục của tất cả tài khoản trong phạm vi quyề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.

Lưu ý: Subscribe topic portfolio hiện chỉ hỗ trợ tài khoản đuôi 8 (tài khoản phái sinh). Tài khoản cơ sở (đuôi 1) hoặc ký quỹ (đuôi 6) chưa được hỗ trợ.

Subscribe

Gửi message với method: "SUBSCRIBE"channel: "TRADING":

{
  "method": "SUBSCRIBE",
  "channel": "TRADING",
  "topics": [
    "order.1231991",
    "order.1231996-1231998",
    "order.*",
    "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": 123456789,
  "connectionId": "conn-001",
  "clientRequestId": "req-20240226-001",
  "orderId": "ORD123456",
  "symbol": "VNM",
  "side": "B",
  "orderType": "LO",
  "accountNo": "0901351",
  "price": "72000",
  "quantity": 1000,
  "cancelQty": 0,
  "osQty": 1000,
  "filledQty": 0,
  "inputTime": "2026/03/01 14:20:55",
  "modifiedTime": "2026/03/01 14:20:55",
  "orderStatus": "PD",
  "rejectReason": "",
  "errorCode": "",
  "errorMessage": ""
}
TrườngKiểuMô tả
eventTypestringLoại event: "orderEvent"
notifyIdLongSố serial của event message
connectionIdstringĐịnh danh phiên kết nối stream của client
clientRequestIdstringĐịnh danh lệnh trong ngày, tự động sinh nếu không truyền. Dùng để đối chiếu tương ứng với lệnh từ đầu client
orderIdstringSố định danh lệnh được ghi nhận tại hệ thống giao dịch
symbolstringMã chứng khoán
sidestringChiều mua/bán của lệnh (B → BUY / S → SELL)
orderTypestringLoại lệnh (LO, ATO, ATC,...)
accountNostringSố tài khoản đặt lệnh
pricestringGiá
quantitynumberKhối lượng
cancelQtynumberKhối lượng đã hủy
osQtynumberKhối lượng chưa khớp
filledQtynumberKhối lượng khớp
inputTimestringThời gian tiếp nhận đặt lệnh (format theo quy chuẩn chung)
modifiedTimestringThời gian sửa, cập nhật trạng thái lệnh (format theo quy chuẩn chung)
orderStatusstringTrạng thái lệnh, tham chiếu theo bảng trạng thái lệnh
rejectReasonstringLý do từ chối
errorCodestringMã lỗi lệnh
errorMessagestringThông tin lệnh lỗi

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": 1061597,
  "connectionId": "connection_id_value",
  "clientRequestId": "91530521",
  "orderId": "26022601219922",
  "symbol": "MSR",
  "side": "S",
  "accountNo": "Q276811",
  "matchPrice": "43100.0",
  "matchQty": 500,
  "matchTime": "2026/03/01 14:20:55"
}
TrườngKiểuMô tả
eventTypestringLoại event: "orderMatchEvent"
notifyIdLongSố serial của event message
connectionIdstringĐịnh danh phiên kết nối stream của client
clientRequestIdstringĐịnh danh lệnh trong ngày, tự động sinh nếu không truyền. Dùng để đối chiếu tương ứng với lệnh từ đầu client
orderIdstringSố định danh lệnh được ghi nhận tại hệ thống giao dịch
symbolstringMã chứng khoán
sidestringChiều mua/bán của lệnh (B → BUY / S → SELL)
accountNostringSố tài khoản đặt lệnh
matchPricestringGiá khớp
matchQtynumberKhối lượng khớp
matchTimestringThời gian khớp (format theo quy chuẩn chung)

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": 1023456,
  "connectionId": "CONN-8899-XYZZ",
  "symbol": "VND",
  "accountNo": "0123456789",
  "longQty": 1500,
  "shortQty": 500,
  "net": 1000,
  "bidAvgPrice": "12.35",
  "askAvgPrice": "12.40",
  "tradePrice": "12.38",
  "marketPrice": "12.45",
  "floatingPL": "1500.75",
  "tradingPL": "2500.50"
}
TrườngKiểuMô tả
eventTypestringLoại event: "clientPortfolioEvent"
notifyIdLongSố serial của event message
connectionIdstringĐịnh danh phiên kết nối stream của client
symbolstringMã chứng khoán
accountNostringSố tài khoản
longQtynumberVị thế long
shortQtynumberVị thế short
netnumberVị thế net (tính bằng long - short)
bidAvgPricestringGiá mua trung bình
askAvgPricestringGiá bán trung bình
tradePricestringGiá khớp
marketPricestringGiá thị trường
floatingPLstringLãi/lỗ tạm tính
tradingPLstringLãi/lỗ đã chốt

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