/stream/derivative). So với cổ phiếu cơ sở: channel ID khác (21/23/24/27), data type là number thay vì string. Xác thực và heartbeat giống nhau.
Demo tương tác
Địa chỉ WSSs|21(ticker match) — Giao dịch khớp: giá, khối lượng, thay đổi.s|23(bid info) — Sổ lệnh mua top 3: giá và khối lượng.s|24(offer info) — Sổ lệnh bán top 3: giá và khối lượng.s|27(day summary) — Thông tin phiên: cao, thấp, trung bình, mở cửa.
Kết nối
WSS/ws/thesis/v1/stream/derivative
Địa chỉ WebSocket đầy đủ mà bạn cần connect tới:
Xác thực (Authentication)
Sau khi kết nối WebSocket thành công, bạn phải gửi auth message trước khi subscribe bất kỳ kênh nào. Lưu ý: JWT token từ API đăng nhập cần được base64 encode trước khi đưa vào message. Client gửi auth message theo format sau:Python
Đăng ký kênh (Subscribe)
Sau khi nhận auth thành công, bạn gửi subscribe message để bắt đầu nhận dữ liệu realtime. Format như sau:
Bạn có thể gửi
bp và fe trong subscribe request (cùng format 6 channel code như cổ phiếu cơ sở), nhưng server phái sinh chỉ phát dữ liệu trên channel 21/23/24/27 (tm/bi/op/mp). Các code bp và fe sẽ được chấp nhận nhưng không tạo ra frame nào.
Heartbeat — Giữ kết nối
Client PHẢI gửi heartbeat text frame mỗi 2 giây để giữ kết nối sống. Nếu server không nhận heartbeat trong 15 giây → tự động ngắt. Frame heartbeat mà client gửi:Cấu trúc Message
Server gửi về 2 loại message. Bạn phân biệt chúng qua prefix đầu tiên:
Data message mà server push về có format như sau:
Channel ID & Data Schema
Channel 21 — Ticker Match (Giao dịch khớp)
Mỗi lệnh khớp, server push 1 message dạng JSON trên channel 21:Channel 23 — Bid Info (Sổ lệnh mua — Top 3)
Server push sổ lệnh mua top 3 trên channel 23:Channel 24 — Offer Info (Sổ lệnh bán — Top 3)
Server push sổ lệnh bán top 3 trên channel 24:Channel 27 — Day Summary (Thông tin phiên)
Server push thông tin tổng hợp phiên trên channel 27:So sánh Channel ID: Phái sinh vs Cổ phiếu
Mã hợp đồng phái sinh (Symbol)
Phái sinh sử dụng mã nội bộ TCBS, KHÔNG phải mã HNX/HSX. Ví dụ:41I1G8000 = VN30F front-month (tháng gần nhất). Mã này sẽ thay đổi khi rollover sang kỳ hạn mới.
Để lấy danh sách mã active hiện tại, bạn gọi API sau:
GET /api/v1/derivatives/contracts
Sequence Diagram — Luồng hoàn chỉnh
Luồng kết nối WebSocket phái sinhXử lý lỗi & Reconnect
Nguyên nhân disconnect
Chiến lược reconnect (khuyến nghị)
Dùng exponential backoff:delay = min(2^attempt, 30) giây. Tối đa 10 lần thử, sau đó dừng hẳn và gửi alert cho bạn xử lý thủ công.
Token lifecycle
JWT token cóexp claim — hiệu lực tối đa 8 giờ. Trước khi expire, bạn nên gọi refresh token API. Sau khi expire, server sẽ ngắt connection → bạn cần reconnect với token mới.
Ngoài giờ giao dịch
Phiên phái sinh chạy 8:45–11:30 và 13:00–14:45 (ngày thường). Ngoài giờ, bạn vẫn connect bình thường, heartbeat vẫn cần gửi, nhưng sẽ không có data message nào. Sáng hôm sau data tự chảy lại mà không cần reconnect.Code hoàn chỉnh
FAQ — Câu hỏi thường gặp
Tại sao bị disconnect sau 15-20 giây?
Tại sao bị disconnect sau 15-20 giây?
99% là do library tự gửi RFC ping frame. Bạn phải disable auto-ping và tự gửi
d|p||| mỗi 2s.Parse theo document cổ phiếu (channel 1, 2, 3...) nhưng không nhận được data?
Parse theo document cổ phiếu (channel 1, 2, 3...) nhưng không nhận được data?
Phái sinh dùng channel ID khác hoàn toàn: 21, 23, 24, 27. Xem bảng mapping ở phần Channel ID phía trên.
matchPrice trả về '1870.5' hay 1870.5?
matchPrice trả về '1870.5' hay 1870.5?
Phái sinh trả number (
1870.5), KHÔNG phải string. Khác với cổ phiếu cơ sở (trả string). Khuyến nghị: bạn nên luôn cast sang float khi parse cho an toàn.Mã 41I1G8000 là gì? Sao không dùng VN30F2507?
Mã 41I1G8000 là gì? Sao không dùng VN30F2507?
Đây là mã nội bộ TCBS cho VN30F front-month. Bạn gọi API
GET /api/v1/derivatives/contracts để lấy mapping mã hiện tại.Connect ngoài giờ giao dịch có được không?
Connect ngoài giờ giao dịch có được không?
Được. Connection sống bình thường, nhưng không có data cho đến khi phiên mở lúc 8:45.
Token expire thì sao?
Token expire thì sao?
Token hiệu lực tối đa 8 giờ. Server ngắt connection khi token hết hạn. Bạn cần detect disconnect → refresh token → reconnect.
Có rate limit không?
Có rate limit không?
Hiện chưa có document chính thức. Trong thực tế, 1 connection per token là safe. Mở nhiều connection cùng token có thể bị reject.