NodeJS

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ịCodeMô tả
OrderSide.BUY"B"Mua
OrderSide.SELL"S"Bán

OrderType

Giá trịCodeMô 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ịCodeMô 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ịCodeMô 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ịCodeMô 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);   // false

FCOType

Loại lệnh điều kiện (Flexible Conditional Order).

Giá trịCodeMô 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ịCodeMô 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ịCodeMô 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.WAIT

AccountType

Giá trịCodeMô 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ịCodeMô 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ịCodeMô 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ịCodeMô 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ịCodeMô 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ênMô 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_TYPESCác loại topic SDK chấp nhận: trade, quote, room, put, oddlot, market, order, portfolio, trade.index, indexsummary
STREAM_INTERVALSCá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@*)
StreamIntervalKiể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ómMember (giá trị)
Auth / tài khoản / OTPCREDENTIAL_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ý requestSIGNATURE_MISSING (401006), SIGNATURE_BODY_EMPTY (401008), SIGNATURE_MISMATCH / SIGNATURE_INVALID (401013)
Giao dịchMODIFY_PRICE_AND_QUANTITY (400107), REPLAY_WINDOW_EXCEEDED (400111)
Validator dữ liệu thị trườngSYMBOL_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ịCodeMô tả
HTTPStatus.OK200Thành công
HTTPStatus.NO_CONTENT204Thành công, không có nội dung
HTTPStatus.BAD_REQUEST400Yêu cầu không hợp lệ
HTTPStatus.UNAUTHORIZED401Chưa xác thực
HTTPStatus.FORBIDDEN403Không có quyền
HTTPStatus.NOT_FOUND404Không tìm thấy
HTTPStatus.UNPROCESSABLE_ENTITY422Dữ liệu không xử lý được
HTTPStatus.TOO_MANY_REQUESTS429Vượt quá giới hạn request
HTTPStatus.INTERNAL_SERVER_ERROR500Lỗi máy chủ nội bộ
HTTPStatus.BAD_GATEWAY502Bad Gateway
HTTPStatus.SERVICE_UNAVAILABLE503Dịch vụ không khả dụng
HTTPStatus.GATEWAY_TIMEOUT504Gateway timeout

Trên trang này