Enums & Hằng số
Các kiểu enum và hằng số trong Node.js SDK
Tất cả enum được export từ package chính:
import { OrderSide, OrderType, OrderStatus, Board, Timeframe, AccountType, DataType, FCOType, FCOOperator, FCOStatus } from '@ssi.developer/ssi-sdk';Ngoài ra package chính còn export ALLOWED_TIMEFRAMES, StreamingMethod, StreamingChannel, StreamingType, DataTopic, HTTPStatus, ServerErrorCode, các kiểu FCOStatusLike/FCOTypeLike/FCOOperatorLike và các helper topic (buildTopic, buildTopics, TOPIC_TYPES, STREAM_INTERVALS, STREAM_INTERVAL_ALL, StreamInterval). Các phần tương ứng nằm bên dưới.
OrderSide
| Giá trị | Code | Mô tả |
|---|---|---|
OrderSide.BUY | "B" | Mua |
OrderSide.SELL | "S" | Bán |
OrderType
| Giá trị | Code | Mô tả |
|---|---|---|
OrderType.ATO | "ATO" | Lệnh mở cửa |
OrderType.ATC | "ATC" | Lệnh đóng cửa |
OrderType.LO | "LO" | Lệnh giới hạn |
OrderType.MTL | "MTL" | Market To Limit |
OrderType.MP | "MP" | Lệnh thị trường |
OrderType.MOK | "MOK" | Match Or Kill |
OrderType.MAK | "MAK" | Match And Kill |
OrderType.PLO | "PLO" | Lệnh sau giờ nghỉ trưa |
OrderStatus
| Giá trị | Code | Mô tả |
|---|---|---|
OrderStatus.PENDING | "PD" | Chờ xử lý |
OrderStatus.PENDING_APPROVAL | "WA" | Chờ phê duyệt |
OrderStatus.READY | "RS" | Sẵn sàng |
OrderStatus.SENT | "SD" | Đã gửi |
OrderStatus.QUEUED | "QU" | Đã vào hàng đợi |
OrderStatus.FILLED | "FF" | Khớp toàn bộ |
OrderStatus.PARTIAL_FILLED | "PF" | Khớp một phần |
OrderStatus.PARTIAL_CANCELLED | "FFPC" | Khớp một phần + huỷ phần còn lại |
OrderStatus.PENDING_MODIFY | "WM" | Chờ sửa |
OrderStatus.PENDING_CANCEL | "WC" | Chờ huỷ |
OrderStatus.CANCELLED | "CL" | Đã huỷ |
OrderStatus.REJECTED | "RJ" | Bị từ chối |
OrderStatus.EXPIRED | "EX" | Hết hạn |
OrderStatus.PRE_SESSION | "IAV" | Trước phiên |
OrderStatus.SOI | "SOI" | Do engine lệnh/FCO báo về, SDK chỉ đặt tên theo code, không mô tả ý nghĩa |
OrderStatus.PAS | "PAS" | Như trên |
OrderStatus.CPL | "CPL" | Như trên |
OrderStatus.REQUESTED | "RQ" | Đã yêu cầu |
OrderStatus.ERROR | "ERR" | Lỗi |
Board
| Giá trị | Code | Mô tả |
|---|---|---|
Board.HOSE | "HOSE" | Sàn HOSE |
Board.HNX | "HNX" | Sàn HNX |
Board.UPCOM | "UPCOM" | Sàn UPCOM |
Board.DERIVATIVES | "DERIVATIVES" | Phái sinh. Chỉ hợp lệ với stream và master data, không dùng được với các endpoint dữ liệu REST |
Timeframe
| Giá trị | Code | Mô tả |
|---|---|---|
Timeframe.MINUTE_1 | "1m" | 1 phút |
Timeframe.MINUTE_3 | "3m" | 3 phút |
Timeframe.MINUTE_5 | "5m" | 5 phút |
Timeframe.MINUTE_15 | "15m" | 15 phút |
Timeframe.HOUR_1 | "1h" | 1 giờ |
Timeframe.DAY_1 | "1d" | 1 ngày |
Timeframe.WEEK_1 | "1w" | 1 tuần |
Timeframe.MONTH_1 | "1M" | 1 tháng |
WEEK_1 và MONTH_1 chỉ còn để tương thích ngược: server từ chối chúng với lỗi 400210. Hằng ALLOWED_TIMEFRAMES (một ReadonlySet<Timeframe>) liệt kê các khung mà endpoint OHLC chấp nhận: 1d, 1m, 3m, 5m, 15m, 1h.
import { ALLOWED_TIMEFRAMES, Timeframe } from '@ssi.developer/ssi-sdk';
ALLOWED_TIMEFRAMES.has(Timeframe.MINUTE_5); // true
ALLOWED_TIMEFRAMES.has(Timeframe.WEEK_1); // falseFCOType
Loại lệnh điều kiện (Flexible Conditional Order).
| Giá trị | Code | Mô tả |
|---|---|---|
FCOType.GTD | "gtd" | Lệnh có hiệu lực đến ngày (Good Till Date) |
FCOType.STOP | "stop" | Lệnh dừng thị trường (Stop Market) |
FCOType.STOP_LIMIT | "stop_limit" | Lệnh dừng giới hạn (Stop Limit) |
FCOType.TRAILING_STOP | "trailing_stop" | Lệnh xu hướng (Trailing Stop Market) |
FCOType.TRAILING_STOP_LIMIT | "trailing_stop_limit" | Lệnh xu hướng giới hạn (Trailing Stop Limit) |
FCOType.OCO | "oco" | Lệnh huỷ lệnh còn lại (One Cancels the Other) |
FCOType.BULL_BEAR | "bullbear" | Lệnh Bull Bear |
FCOOperator
Toán tử so sánh dùng để kích hoạt lệnh Stop / Stop Limit.
| Giá trị | Code | Mô tả |
|---|---|---|
FCOOperator.GREATER | "greater" | Lớn hơn (>) |
FCOOperator.GREATER_OR_EQUAL | "greater_or_equal" | Lớn hơn hoặc bằng (>=) |
FCOOperator.LESSER | "lesser" | Nhỏ hơn (<) |
FCOOperator.LESSER_OR_EQUAL | "lesser_or_equal" | Nhỏ hơn hoặc bằng (<=) |
FCOOperator.EQUAL | "equal" | Bằng (=) |
FCOStatus
Trạng thái xử lý của lệnh điều kiện.
| Giá trị | Code | Mô tả |
|---|---|---|
FCOStatus.INIT | "INIT" | Mới khởi tạo |
FCOStatus.WAIT | "WAIT" | Chờ kích hoạt |
FCOStatus.TRI | "TRI" | Đã kích hoạt |
FCOStatus.TRIT | "TRIT" | Đã kích hoạt thành công |
FCOStatus.TER | "TER" | Đã kết thúc |
FCOStatus.FIS | "FIS" | Hoàn tất |
FCOStatus.WC | "WC" | Chờ huỷ |
FCOStatus.EXP | "EXP" | Hết hạn |
FCOStatus.ERR | "ERR" | Lỗi |
Kiểu *Like
Tham số FCO nhận cả member của enum lẫn chuỗi giá trị tương ứng. Các kiểu FCOTypeLike, FCOOperatorLike, FCOStatusLike được export (chỉ là type) để bạn khai báo biến:
import type { FCOStatusLike } from '@ssi.developer/ssi-sdk';
const status: FCOStatusLike = 'WAIT'; // tương đương FCOStatus.WAITAccountType
| Giá trị | Code | Mô tả |
|---|---|---|
AccountType.EQUITY | "Cash" | Tài khoản tiền mặt |
AccountType.EQUITY_MARGIN | "Margin" | Tài khoản ký quỹ |
AccountType.DERIVATIVE | "Derivative" | Tài khoản phái sinh |
DataType
| Giá trị | Code | Mô tả |
|---|---|---|
DataType.QUOTE | "quote" | Dữ liệu mua/bán |
DataType.TRADE | "trade" | Dữ liệu khớp lệnh |
DataType.ODD_LOT | "oddlot" | Lô lẻ |
DataType.MARKET | "market" | Trạng thái thị trường |
DataType.ROOM | "room" | Room ngoại |
DataType.PUT | "put" | Thoả thuận |
DataType.INDEX_SUMMARY | "indexsummary" | Tổng hợp chỉ số |
Streaming Enums
StreamingMethod
Method của message gửi lên kênh streaming.
| Giá trị | Code | Mô tả |
|---|---|---|
StreamingMethod.SUBSCRIBE | "subscribe" | Đăng ký topic |
StreamingMethod.UNSUBSCRIBE | "unsubscribe" | Huỷ đăng ký topic |
StreamingMethod.PING_PONG | "ping_pong" | Heartbeat |
StreamingMethod.LIST_SUBSCRIPTION | "list_subscription" | Liệt kê các topic đang đăng ký |
DataTopic
Tiền tố topic của kênh dữ liệu thị trường (kèm dấu chấm).
| Giá trị | Code |
|---|---|
DataTopic.QUOTE | "quote." |
DataTopic.TRADE | "trade." |
DataTopic.ODD_LOT | "oddlot." |
DataTopic.MARKET | "market." |
DataTopic.INDEX_SUMMARY | "indexsummary." |
DataTopic.ROOM | "room." |
DataTopic.PUT | "put." |
StreamingChannel
| Giá trị | Code | Mô tả |
|---|---|---|
StreamingChannel.DATA | "DATA" | Kênh dữ liệu thị trường |
StreamingChannel.HEARTBEAT | "HEARTBEAT" | Kênh heartbeat |
StreamingChannel.TRADING | "TRADING" | Kênh sự kiện giao dịch |
StreamingType
| Giá trị | Code | Mô tả |
|---|---|---|
StreamingType.ORDER | "orderEvent" | Sự kiện lệnh |
StreamingType.ORDER_MATCH | "orderMatchEvent" | Sự kiện khớp lệnh |
StreamingType.PORTFOLIO | "clientPortfolioEvent" | Sự kiện danh mục |
Topic helpers
Dùng để dựng chuỗi topic đúng cú pháp thay vì tự nối chuỗi. Chi tiết cách subscribe ở API Services, mục 6.3 và mục 6.7.
| Tên | Mô tả |
|---|---|
buildTopic(topicType, filter = '*', interval?) | Dựng một topic, ví dụ trade.VNM@1m hay trade.index.VN30. Ném ValidationError nếu type, filter hoặc interval không hợp lệ |
buildTopics(topicType, filters, interval?) | Dựng một topic cho mỗi filter. Danh sách rỗng ném ValidationError |
TOPIC_TYPES | Các loại topic SDK chấp nhận: trade, quote, room, put, oddlot, market, order, portfolio, trade.index, indexsummary |
STREAM_INTERVALS | Các interval hợp lệ: tick, 1m, 5m (chỉ dùng với trade và trade.index) |
STREAM_INTERVAL_ALL | '*', dùng sau @ (ví dụ trade.VN30@*) |
StreamInterval | Kiểu 'tick' | '1m' | '5m' |
Quy tắc chính (theo mã nguồn): một topic chỉ có một filter (*, một mã, hoặc khoảng A-B), danh sách ngăn cách bằng dấu phẩy bị từ chối. Mã được viết hoa, trừ số tài khoản của order/portfolio. UPCOMINDEX được đổi thành HNXUPCOMINDEX. @* chỉ hợp lệ với trade, quote, room, put, oddlot và một mã chỉ số hoặc sàn cụ thể. Ý nghĩa của @* phía server chưa được xác nhận, xem lưu ý ở mục 6.7. asset.* và margin.* chưa có nên không nằm trong TOPIC_TYPES.
import { buildTopic, buildTopics } from '@ssi.developer/ssi-sdk';
buildTopic('trade', 'vnm', '1m'); // "trade.VNM@1m"
buildTopic('trade.index', 'VN30'); // "trade.index.VN30"
buildTopics('quote', ['SSI', 'HPG']); // ["quote.SSI", "quote.HPG"]ServerErrorCode
Mã lỗi nghiệp vụ mà server trả trong { code, msg }. Dùng để so sánh với thuộc tính code của lỗi (SSIError.code, trong đó có APIError). Một số con số được dùng lại ở nhiều nơi nên có alias (ví dụ 400104 vừa là "không gửi được OTP" vừa là "thiếu symbol"). SDK ghi chú rằng nhóm mã chữ ký 4010xx không khớp với file error-code-mapping của server: hãy tin vào con số.
| Nhóm | Member (giá trị) |
|---|---|
| Auth / tài khoản / OTP | CREDENTIAL_NOT_LINKED_TO_CLIENT (400101), TWO_FA_INFO_ERROR (400102), TWO_FA_INFO_MISSING (400103), OTP_SEND_FAILED / SYMBOL_REQUIRED (400104), PUSH_APPROVAL_CREATE_FAILED (400171), OTP_VERIFICATION_FAILED (401100), REFRESH_TOKEN_INVALID (401101), REFRESH_CLIENT_MISSING (401102), REFRESH_TOKEN_REVOKED_OR_EXPIRED (401103), REFRESH_API_KEY_GONE (401104), INVALID_API_CREDENTIAL / TOKEN_WITHOUT_OTP (401105), PUSH_APPROVAL_NOT_FOUND (401113), PUSH_APPROVAL_PENDING / SMART_OTP_PENDING (401114, về dưới dạng HTTP 202), PUSH_APPROVAL_REJECTED (401115), PUSH_APPROVAL_FOREIGN_TRANSACTION (401116), NO_SCOPE_GRANTED (403100) |
| Chữ ký request | SIGNATURE_MISSING (401006), SIGNATURE_BODY_EMPTY (401008), SIGNATURE_MISMATCH / SIGNATURE_INVALID (401013) |
| Giao dịch | MODIFY_PRICE_AND_QUANTITY (400107), REPLAY_WINDOW_EXCEEDED (400111) |
| Validator dữ liệu thị trường | SYMBOL_INVALID_CHARACTERS (400006), FROM_AFTER_TO (400202), BOARD_NOT_ALLOWED (400208), TIMEFRAME_NOT_SUPPORTED (400210, cũng dùng khi from/to rỗng), DATE_FORMAT_INVALID (400213), INDEX_SUMMARY_NEEDS_ONE_OF (504207), SECURITIES_INFO_NEEDS_ONE_OF (504208), SECURITIES_SUMMARY_NEEDS_SYMBOL_XOR_INDEX (504209) |
import { SSIError, ServerErrorCode } from '@ssi.developer/ssi-sdk';
try {
await auth.authenticate('YOUR_OTP');
} catch (error) {
if (error instanceof SSIError && error.code === ServerErrorCode.OTP_VERIFICATION_FAILED) {
console.log('Xác thực OTP thất bại');
}
}Về cách xử lý lỗi xem Xử lý lỗi.
Hằng số Trading WebSocket
Phần này thuộc Trading WebSocket, được export từ package chính @ssi.developer/ssi-sdk. Xem API Services, mục 7.
MUTATING_METHODS (một ReadonlySet<string>, export từ @ssi.developer/ssi-sdk) liệt kê các command mà server yêu cầu chữ ký. Các command này cần Config.privateKey, nếu thiếu client ném WebSocketError. Tên method được so khớp không phân biệt hoa thường.
| Command cần ký |
|---|
order.place |
order.amend |
order.cancel |
order.batchnew |
order.batchcancel |
fco.place |
fco.cancel |
Kiểu dữ liệu TradingWSResponse xem ở Models, các option ở Cấu hình.
HTTPStatus
Mã HTTP status thường gặp, dùng nội bộ để phân loại lỗi API.
| Giá trị | Code | Mô tả |
|---|---|---|
HTTPStatus.OK | 200 | Thành công |
HTTPStatus.NO_CONTENT | 204 | Thành công, không có nội dung |
HTTPStatus.BAD_REQUEST | 400 | Yêu cầu không hợp lệ |
HTTPStatus.UNAUTHORIZED | 401 | Chưa xác thực |
HTTPStatus.FORBIDDEN | 403 | Không có quyền |
HTTPStatus.NOT_FOUND | 404 | Không tìm thấy |
HTTPStatus.UNPROCESSABLE_ENTITY | 422 | Dữ liệu không xử lý được |
HTTPStatus.TOO_MANY_REQUESTS | 429 | Vượt quá giới hạn request |
HTTPStatus.INTERNAL_SERVER_ERROR | 500 | Lỗi máy chủ nội bộ |
HTTPStatus.BAD_GATEWAY | 502 | Bad Gateway |
HTTPStatus.SERVICE_UNAVAILABLE | 503 | Dịch vụ không khả dụng |
HTTPStatus.GATEWAY_TIMEOUT | 504 | Gateway timeout |