order.batchNew
Đặt nhiều lệnh mới trong một message (Batch Order). Mỗi lệnh trong params.orders có cấu trúc
và quy tắc như order.place.
Quy tắc chung
- Tối đa 50 lệnh mỗi batch. Các lệnh có thể thuộc nhiều tài khoản, nhưng tất cả tài khoản phải nằm trong danh sách tài khoản được cấp quyền cho API Key.
- Validation theo cơ chế all-or-nothing: nếu bất kỳ lệnh nào không hợp lệ, toàn bộ batch bị từ chối và không có lệnh nào được gửi đi.
- Chống replay:
batchRequestTime(epoch milliseconds, UTC) phải lệch không quá 30 giây so với thời gian máy chủ. - Idempotency:
batchRequestIdphải duy nhất theo từng API Key, từng loại thao tác (đặt/hủy) trong ngày; gửi lại cùngbatchRequestIdbị từ chối là request trùng lặp. - Chữ ký
signature(RSA+SHA256) được tính trên toàn bộparams, tức cảbatchRequestId,batchRequestTimevàorders.
Phản hồi: hệ thống trả về một ack duy nhất cho cả batch, trong đó mỗi lệnh có
orderStatus: "PD" — đây chưa phải kết quả khớp lệnh. Kết quả thật của từng lệnh (khớp/bị từ
chối/đã hủy) được gửi riêng qua kênh thông báo order.{accountNo} (xem mục "Đặt/sửa/hủy lệnh: xác
nhận nhanh, kết quả đến sau" ở đầu tài liệu), nên client bắt buộc phải đăng ký nhận thông báo
cho các tài khoản liên quan. Khác với REST, ack của WebSocket không chứa orderId và không phản
ánh việc từng lệnh có bị từ chối ở bước xử lý nghiệp vụ hay không.
Scope bắt buộc: tradingws:order:post.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Định danh do client tự sinh để đối chiếu response.
Định danh batch do client tạo ra, phải duy nhất theo từng API Key và từng loại thao tác (đặt/hủy) trong ngày. Dùng làm khóa idempotency.
Thời điểm client tạo batch, tính bằng epoch milliseconds (UTC). Phải lệch không quá 30 giây so với thời gian máy chủ.
Danh sách lệnh cần đặt, tối đa 50 lệnh. Mỗi phần tử có cấu trúc như `params` của `order.place`.
Mã chứng khoán.
Chiều mua hoặc bán của lệnh. (B - Buy/Mua, S - Sell/Bán)
Loại lệnh giao dịch. Mặc định `LO` nếu để trống.
Số tài khoản giao dịch.
Giá đặt lệnh. Bắt buộc và phải > 0 khi `orderType` là `LO`; không bắt buộc với các loại lệnh khác.
Khối lượng đặt lệnh.
Định danh lệnh do client tạo ra, dùng để đối chiếu trong response và event push sau này. Khi để trống, hệ thống tự sinh `clientRequestId`.
Định danh thiết bị gửi yêu cầu đặt lệnh (MAC address hoặc IMEI).
Thông tin trình duyệt/ứng dụng gửi yêu cầu.
Chữ ký RSA+SHA256 (base64) trên toàn bộ nội dung `params`, dùng SecretKey của API Key. Bắt buộc.
Unix timestamp (mili-giây) tại thời điểm gửi request, dùng làm input ký số.
Response Body
application/json
application/json
Sample Request
wscat -c wss://api.ssi.com.vn/ws/v3/trading -x '{
"id": "req-0010",
"method": "order.batchNew",
"params": {
"batchRequestId": "batch-20261014-0001",
"batchRequestTime": 1755000010000,
"orders": [
{
"symbol": "SSI",
"side": "B",
"orderType": "LO",
"price": "45.50",
"quantity": 1000,
"accountNo": "0901351",
"clientRequestId": "o-0001",
"deviceId": "MAC-AABBCCDDEEFF"
},
{
"symbol": "VNM",
"side": "S",
"orderType": "LO",
"price": "62.10",
"quantity": 500,
"accountNo": "0901351",
"clientRequestId": "o-0002",
"deviceId": "MAC-AABBCCDDEEFF"
}
]
},
"signature": "base64(RSA-SHA256(...))",
"timestamp": 1755000010000
}'Sample Response
{
"id": "req-0010",
"method": "order.batchNew",
"status": 200,
"result": {
"batchRequestId": "batch-20261014-0001",
"results": [
{
"clientRequestId": "o-0001",
"orderStatus": "PD",
"success": true
},
{
"clientRequestId": "o-0002",
"orderStatus": "PD",
"success": true
}
]
},
"rateLimit": {
"limit": 50,
"remaining": 46,
"resetMs": 870
}
}order.cancelWS
Hủy lệnh hiện có. Xác định lệnh cần hủy qua `orderId` HOẶC `clientRequestId` (bắt buộc truyền đúng một trong hai). Cùng luồng ack nhanh `PD` như `order.place`. Yêu cầu chữ ký `signature`. Scope bắt buộc: `tradingws:order:delete`.
order.batchCancelWS
Hủy nhiều lệnh trong một message (Batch Order). Mỗi lệnh trong `params.orders` có cấu trúc và quy tắc như `order.cancel` (xác định lệnh qua `orderId` HOẶC `clientRequestId`). Áp dụng cùng quy tắc chung và cùng luồng ack nhanh `PD` như `order.batchNew` (tối đa 50 lệnh, validation all-or-nothing, chống replay 30 giây, idempotency theo `batchRequestId`, chữ ký trên toàn bộ `params`). Kết quả thật của từng yêu cầu hủy đến sau qua kênh thông báo `order.{accountNo}`. Scope bắt buộc: `tradingws:order:delete`.