Skip to main content
Nhận dữ liệu real-time về lịch sử giá khớp, cung cầu mua/bán, và giao dịch khối ngoại — cập nhật mỗi phút qua WebSocket. Bạn mở một kết nối tới endpoint Ouranos, server sẽ tự đẩy dữ liệu tích luỹ theo từng mã chứng khoán mà bạn đăng ký. Endpoint: /ws/ouranos/v1/stream. Heartbeat là d|po mỗi 2 giây. Dữ liệu trả về dạng CODE|SYMBOL|{JSON}.

Demo tương tác

Địa chỉ WSS
Payload kết nối / xác thực
Kênh / Chủ đề
  • C001 (Price history) — Lịch sử giá khớp 1 phút: giá, khối lượng, tổng giao dịch.
  • C002S60 (Supply/demand 60s) — Cung cầu tích luỹ 1 phút: mua/bán chủ động.
  • C002S900 (Foreign exchange) — Giao dịch khối ngoại tích luỹ 15 phút.
Demo trên chỉ mang tính minh họa. Wire format thực tế là text frame dạng CODE|SYMBOL|{JSON} (pipe-delimited). Xem chi tiết bên dưới.

Kết nối

WSS /ws/ouranos/v1/stream Địa chỉ WebSocket đầy đủ mà bạn cần kết nối tới:
BẮT BUỘC: Bạn phải disable auto-ping (RFC 6455 ping frame) của WebSocket library. Server TCBS chỉ chấp nhận heartbeat dạng text frame d|po. Nếu library tự gửi binary ping, server sẽ ngắt kết nối.

Xác thực (Authentication)

Sau khi kết nối WebSocket thành công, bạn cần gửi auth message ngay. Token OpenAPI phải được base64 encode trực tiếp — không wrap trong JSON hay object nào cả. Format auth message — client gửi lên server (xxx = base64 của token_openapi):
Ví dụ cụ thể — giả sử bạn có token như sau: | | | | ----------------- | ------------------------------------------------------------------------------------------ | --- | --- | --- | ----------------------------------------------------------------------------------------- | | Token OpenAPI | igwfUq9M2IqWVhrFrYybEYKWxAxDbYzxz1RzOkp0L0S95lrMtrJDbMgFwy86r8Ir | | Base64(token) | aWd3ZlVxOU0ySXFXVmhyRnJZeWJFWUtXeEF4RGJZenh6MVJ6T2twMEwwUzk1bHJNdHJKRGJNZ0Z3eTg2cjhJcg== | | Client gửi server | d | a | | | aWd3ZlVxOU0ySXFXVmhyRnJZeWJFWUtXeEF4RGJZenh6MVJ6T2twMEwwUzk1bHJNdHJKRGJNZ0Z3eTg2cjhJcg== | Auth thành công — server trả về message sau:
Auth thất bại — server trả về lỗi kèm mã code:
Server cũng gửi kèm bản tin timeout config d|33|15. Ý nghĩa: nếu client không gửi heartbeat trong 15 giây, server sẽ ngắt kết nối.
Bạn PHẢI đợi nhận response auth thành công (d|0|{success:true...}) trước khi gửi subscribe. Gửi sớm sẽ bị bỏ qua.

Đăng ký kênh (Subscribe)

Sau khi auth thành công, bạn đăng ký các channel bằng format sau — client gửi lên server:
Ví dụ — đăng ký cả 3 channel cho TCB, POW, VIC. Client gửi:
Huỷ đăng ký — dùng d|ut thay vì d|st. Client gửi:
Bảng channel codes — các mã channel bạn có thể đăng ký:

Heartbeat — Giữ kết nối

Client PHẢI gửi heartbeat text frame mỗi 2 giây. Nếu server không nhận được heartbeat trong 15 giây → tự động ngắt kết nối. Client gửi:
Heartbeat phải là TEXT frame chứa đúng nội dung d|po. KHÔNG dùng binary/ping frame — server sẽ không nhận.

Cấu trúc Message

Server gửi về 2 loại message — control message (prefix d|) và data message (dữ liệu channel): Data message format — server trả về dữ liệu theo cấu trúc pipe-delimited:
Ví dụ thực tế — một frame server push về cho mã TCB:

Channel ID & Data Schema

C001 — Lịch sử giá khớp (Price History)

Dữ liệu giá khớp được tổng hợp mỗi 1 phút (unitTimeFrame=60). Mỗi frame bao gồm giá khớp, khối lượng, tổng giao dịch trong ngày, và chỉ báo bên mua/bán chủ động. Server trả về frame như sau:
C001 — Lịch sử giá khớp

C002S60 — Cung cầu (Supply/Demand, 1 phút)

Khối lượng mua/bán chủ động tích luỹ mỗi 1 phút. Server trả về frame như sau:
C002S60 — Cung cầu 1 phút

C002S900 — Giao dịch khối ngoại (Foreign Exchange, 15 phút)

Cùng cấu trúc như C002S60 nhưng tích luỹ mỗi 15 phút (unitTimeFrame=900). Server trả về frame như sau:
C002S900 — Khối ngoại 15 phút

Sequence Diagram

Luồng kết nối WebSocket lịch sử giá và cung cầu

Xử lý lỗi & Reconnect

Chiến lược reconnect: Dùng exponential backoff với công thức delay = min(2^attempt, 30) giây. Thử tối đa 10 lần, sau đó gửi alert cho hệ thống monitoring.

Code hoàn chỉnh


FAQ

Có. Ví dụ chỉ lịch sử giá: d|st|C001|TCB,POW. Bạn có thể kết hợp bất kỳ channel code nào bằng dấu +.
Endpoint Ouranos dùng d|po. Endpoint Thesis (bảng giá) dùng d|p|||. Mỗi endpoint có format heartbeat riêng.
Server push mỗi phút (C001 với unitTimeFrame=60) khi có giao dịch khớp. Ngoài giờ giao dịch sẽ không có data.
BU = Buy Up (mua chủ động — giá khớp tăng), SD = Sell Down (bán chủ động — giá khớp giảm). Cho biết bên nào đang chiếm ưu thế.