/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ỉ WSSC001(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:
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):
igwfUq9M2IqWVhrFrYybEYKWxAxDbYzxz1RzOkp0L0S95lrMtrJDbMgFwy86r8Ir | | Base64(token) | aWd3ZlVxOU0ySXFXVmhyRnJZeWJFWUtXeEF4RGJZenh6MVJ6T2twMEwwUzk1bHJNdHJKRGJNZ0Z3eTg2cjhJcg== | | Client gửi server | d | a | | | aWd3ZlVxOU0ySXFXVmhyRnJZeWJFWUtXeEF4RGJZenh6MVJ6T2twMEwwUzk1bHJNdHJKRGJNZ0Z3eTg2cjhJcg== |
Auth thành công — server trả về message sau:
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.
Đă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:d|ut thay vì d|st. Client gửi:
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:Cấu trúc Message
Server gửi về 2 loại message — control message (prefixd|) và data message (dữ liệu channel):
Data message format — server trả về dữ liệu theo cấu trúc pipe-delimited:
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:
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: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:
Sequence Diagram
Luồng kết nối WebSocket lịch sử giá và cung cầuXử 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ó thể subscribe từng channel riêng lẻ không?
Có thể subscribe từng channel riêng lẻ không?
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 +.Heartbeat dùng d|p||| hay d|po?
Heartbeat dùng d|p||| hay d|po?
Endpoint Ouranos dùng
d|po. Endpoint Thesis (bảng giá) dùng d|p|||. Mỗi endpoint có format heartbeat riêng.Data push liên tục hay chỉ khi có thay đổi?
Data push liên tục hay chỉ khi có thay đổi?
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.action=BU/SD nghĩa là gì?
action=BU/SD nghĩa là gì?
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ế.