API DataPro
Tài liệu kỹ thuật & hướng dẫn sử dụng API truy xuất dữ liệu chứng khoán DataPro.
Thông tin về API
API và điều kiện sử dụng — Chức năng API cho phép phần mềm xuất dữ liệu ra bên ngoài để các ứng dụng hoặc công cụ khác có thể truy cập và lấy dữ liệu (ví dụ: đọc file, đẩy lên cơ sở dữ liệu, …).
Tuy nhiên, để sử dụng được API, người dùng phải có gói dịch vụ của DataPro (tùy theo gói phần mềm đã đăng ký). Nếu tài khoản không còn gói này, API và phần mềm sẽ không hoạt động.
API sẽ trả về dữ liệu tương ứng với chu kỳ dữ liệu mà người dùng đang chọn trong phần mềm DataPro:
- Nếu đang chọn chu kỳ
EOD, khi gọi API, dữ liệu phút cũng sẽ là EOD. - Nếu đang chọn chu kỳ
intraday, dữ liệu trả về qua API cũng sẽ là intraday.
Cách gọi API
Gọi API với định dạng: url của bạn + endpoint
Ví dụ với Ping: http://localhost:6789/api/ping
Bật / Tắt API
Bật API
Để bật API làm theo các bước sau:
- Bước 1: Trên thanh công cụ của DataPro chọn "Cấu hình hệ thống".
- Bước 2: Giao diện Cấu hình hệ thống được mở lên, tại phần "Thông số chung" tích chọn "Xuất dữ liệu qua API" cho phép hệ thống mở một cổng (port kết nối thường qua HTTP).
- Bước 3: Nhấn nút "Lưu".
Hình 1: Hình giao diện DataPro có các bước hướng dẫn việc bật API.
Tắt API
Để tắt API làm theo các bước sau:
- Bước 1: Trên thanh công cụ của DataPro chọn "Cấu hình hệ thống".
- Bước 2: Giao diện Cấu hình hệ thống được mở lên, tại phần "Thông số chung" tích bỏ chọn "Xuất dữ liệu qua API" — hệ thống sẽ tắt chức năng xuất dữ liệu qua API.
- Bước 3: Nhấn nút "Lưu".
Hình 2: Hình giao diện DataPro có các bước hướng dẫn tắt API.
Lưu ý
Icon dưới góc trái thể hiện trạng thái hoạt động của API, nếu icon hiển thị màu đỏ tức là API đang bị tắt, khi di chuột vào icon sẽ thông báo trạng thái API cùng đường dẫn như sau: API đã bật: http://localhost:6789 (đây chính là url của bạn).
Phần mềm DataPro chính là thành phần chạy và duy trì API server. Nếu máy khác không cài (hoặc không chạy) DataPro, thì không có tiến trình nào xử lý yêu cầu API.
Ping
Gọi API với định dạng: url của bạn + endpoint
Gọi API với định dạng: url của bạn + endpoint
Ví dụ với Ping: http://localhost:6789/api/ping
- GET Endpoint: /api/ping
- Mô tả: Kiểm tra tình trạng server — trả về Unix Epoch hiện tại.
- Trả về: plain text
Lấy thông tin mã
-
Gọi API với định dạng: url của bạn + endpoint
- GET Endpoint: /api/symbols
- Mô tả: Trả về danh sách mã hoặc 1 mã chỉ định được truyền vào.
- Tham số:
{symbol?}— truyền vào mã chứng khoán để lấy thông tin của mã đó, hoặc để trống để lấy toàn bộ danh sách.
Ví dụ
| /api/symbols | (Lấy toàn bộ mã) |
| /api/symbols/VNINDEX | (Lấy thông tin mã chỉ định) |
Trả về: CSV với cấu trúc
| Tên cột | Mô tả |
|---|---|
SYMBOL | Mã chứng khoán |
NAME | Tên tiếng Việt của mã chứng khoán |
NAME_EN | Tên tiếng Anh của mã chứng khoán |
EXCHANGE | Sàn giao dịch niêm yết: GLOBE (tiền ảo, chỉ số thế giới, forex), INDUST (chỉ số ngành), HNX, HSX, UPCOM |
TYPE | Loại mã: FUND (chứng chỉ quỹ), IDX (chỉ số), DRVX (phái sinh mở rộng), STOCK (chứng khoán), CRPT (tiền ảo), CW (chứng quyền), DRV (phái sinh), EIDX (chỉ số quốc tế), FX (forex) |
REF_PX | Giá tham chiếu |
OPEN_PX | Giá mở cửa |
HIGH_PX | Giá cao nhất trong phiên |
LOW_PX | Giá thấp nhất trong phiên |
CLOSE_PX | Giá đóng cửa |
BID_PX | Giá đặt mua cao nhất hiện tại |
BID_VOL | Khối lượng đặt mua tương ứng với giá BID_PX |
ASK_PX | Giá chào bán thấp nhất hiện tại |
ASK_VOL | Khối lượng chào bán tương ứng với giá ASK_PX |
VOL | Tổng khối lượng khớp lệnh trong phiên |
VAL | Tổng giá trị giao dịch |
MATCHED_VOL | Khối lượng khớp lệnh mới nhất |
Lấy dữ liệu ngày
-
Gọi API với định dạng: url của bạn + endpoint
- GET Endpoint: /api/data/daily/{symbol}/{from?}/{to?}/{adjusted?}
- Mô tả: Trả về danh sách dữ liệu từng giao dịch theo ngày.
- Tham số:
{symbol} | Truyền vào mã chứng khoán có trong danh sách |
{from?} | Truyền vào epoch time, mặc định 0 là: từ đầu tiên |
{to?} | Truyền vào epoch time, mặc định 0 là: đến cuối cùng |
{adjusted?} | Tùy chọn hiệu chỉnh dữ liệu, mặc định là 1 (1 = hiệu chỉnh, 0 = không hiệu chỉnh) |
Ví dụ
| /api/data/daily/VNM/1760083062/1746863862/1 | (Lấy dữ liệu VNM từ ngày đến ngày) |
| /api/data/daily/VNM | (Lấy toàn bộ dữ liệu ngày có hiệu chỉnh) |
Trả về: CSV với cấu trúc
| Tên cột | Mô tả |
|---|---|
TRADING_TIME | Thời điểm giao dịch, tính bằng Unix epoch time |
OI | Khối lượng hợp đồng mở |
OPEN_PX | Giá mở cửa |
HIGH_PX | Giá cao nhất trong phiên |
LOW_PX | Giá thấp nhất trong phiên |
CLOSE_PX | Giá đóng cửa |
REF_PX | Giá tham chiếu |
VOL | Tổng khối lượng khớp lệnh trong phiên |
VAL | Tổng giá trị giao dịch |
PT_VOL | Tổng khối lượng giao dịch thỏa thuận trong phiên |
PT_VAL | Tổng giá trị giao dịch thỏa thuận trong phiên |
BUY_VOL | Tổng khối lượng mua khớp lệnh |
BUY_VAL | Tổng giá trị mua khớp lệnh tương ứng |
SELL_VOL | Tổng khối lượng bán khớp lệnh |
SELL_VAL | Tổng giá trị bán khớp lệnh |
PORT_BUY_VOL | Khối lượng mua của khối tự doanh |
PORT_BUY_VAL | Giá trị mua của khối tự doanh |
PORT_SELL_VOL | Khối lượng bán của khối tự doanh |
PORT_SELL_VAL | Giá trị bán của khối tự doanh |
FRN_BUY_VOL | Khối lượng mua của nhà đầu tư nước ngoài |
FRN_BUY_VAL | Giá trị mua của nhà đầu tư nước ngoài |
FRN_SELL_VOL | Khối lượng bán của nhà đầu tư nước ngoài |
FRN_SELL_VAL | Giá trị bán của nhà đầu tư nước ngoài |
ADJ_RATE | Tỉ lệ hiệu chỉnh (>=1) — lấy giá nhân với tỉ lệ này sẽ ra giá gốc ban đầu |
Lấy dữ liệu phút
-
Gọi API với định dạng: url của bạn + endpoint
- GET Endpoint: /api/data/minute/{symbol}/{from?}/{to?}/{adjusted?}
- Mô tả: Trả về danh sách dữ liệu từng giao dịch theo phút.
- Tham số:
{symbol} | Truyền vào mã chứng khoán có trong danh sách |
{from?} | Truyền vào epoch time, mặc định 0 là: từ đầu tiên |
{to?} | Truyền vào epoch time, mặc định 0 là: đến cuối cùng |
{adjusted?} | Tùy chọn hiệu chỉnh dữ liệu, mặc định là 1 (1 = hiệu chỉnh, 0 = không hiệu chỉnh) |
Ví dụ
| /api/data/minute/VNM/1760083062/1746863862/1 | (Lấy dữ liệu phút của VNM từ ngày đến ngày) |
| /api/data/minute/VNM | (Lấy toàn bộ dữ liệu phút có hiệu chỉnh) |
Trả về: CSV với cấu trúc
| Tên cột | Mô tả |
|---|---|
TRADING_TIME | Thời điểm giao dịch, tính bằng Unix epoch time |
OPEN_PX | Giá mở cửa |
HIGH_PX | Giá cao nhất trong phiên |
LOW_PX | Giá thấp nhất trong phiên |
CLOSE_PX | Giá đóng cửa |
REF_PX | Giá tham chiếu |
VOL | Tổng khối lượng khớp lệnh trong phiên |
VAL | Tổng giá trị giao dịch |
PT_VOL | Tổng khối lượng giao dịch thỏa thuận trong phiên |
PT_VAL | Tổng giá trị giao dịch thỏa thuận trong phiên |
BUY_VOL | Tổng khối lượng mua khớp lệnh |
BUY_VAL | Tổng giá trị mua khớp lệnh tương ứng |
SELL_VOL | Tổng khối lượng bán khớp lệnh |
SELL_VAL | Tổng giá trị bán khớp lệnh |
FRN_BUY_VOL | Khối lượng mua của nhà đầu tư nước ngoài |
FRN_BUY_VAL | Giá trị mua của nhà đầu tư nước ngoài |
FRN_SELL_VOL | Khối lượng bán của nhà đầu tư nước ngoài |
FRN_SELL_VAL | Giá trị bán của nhà đầu tư nước ngoài |
ADJ_RATE | Tỉ lệ hiệu chỉnh (>=1) — lấy giá nhân với tỉ lệ này sẽ ra giá gốc ban đầu |
Lấy dữ liệu giây
-
Gọi API với định dạng: url của bạn + endpoint
- GET Endpoint: /api/data/tick/{symbol}/{from?}/{to?}/{adjusted?}
- Mô tả: Trả về danh sách dữ liệu từng giao dịch theo giây.
- Tham số:
{symbol} | Truyền vào mã chứng khoán có trong danh sách |
{from?} | Truyền vào epoch time, mặc định 0 là: từ đầu tiên |
{to?} | Truyền vào epoch time, mặc định 0 là: đến cuối cùng |
{adjusted?} | Tùy chọn hiệu chỉnh dữ liệu, mặc định là 1 (1 = hiệu chỉnh, 0 = không hiệu chỉnh) |
Ví dụ
| /api/data/tick/VNM/1760083062/1746863862/1 | (Lấy dữ liệu giây của VNM từ ngày đến ngày) |
| /api/data/tick/VNM | (Lấy toàn bộ dữ liệu giây có hiệu chỉnh) |
Trả về: CSV với cấu trúc
| Tên cột | Mô tả |
|---|---|
TRADING_TIME | Thời điểm giao dịch, tính bằng Unix epoch time |
CLOSE_PX | Giá đóng cửa |
REF_PX | Giá tham chiếu |
VOL | Tổng khối lượng khớp lệnh trong phiên |
SIDE | Chiều giao dịch (mua/bán) |
Bắt đầu nhanh (Quickstart)
- Đăng ký gói dịch vụ DataPro phù hợp tại trang Mua.
- Tải & cài đặt phần mềm DataPro — đăng nhập bằng tài khoản đã mua.
- Vào Cài đặt → API để bật endpoint & lấy API key.
- Gọi API qua HTTP — đính kèm header
Authorization: Bearer <API_KEY>.
Mã lỗi thường gặp
| Mã | Ý nghĩa | Cách xử lý |
|---|---|---|
401 | API key sai hoặc đã hết hạn | Kiểm tra lại key trong phần mềm DataPro |
403 | Tài khoản không còn gói dịch vụ | Gia hạn gói phù hợp |
404 | Mã không tồn tại | Kiểm tra symbol |
429 | Rate limit | Giảm tần suất gọi hoặc nâng gói |
500 | Lỗi server | Liên hệ support@stockprice.vn |
Tổng quan Remote API
DataPro.Client mở một REST API cục bộ cho phép các script (Python, R, CLI...) truy xuất dữ liệu thị trường đã lưu trong bộ nhớ đệm. Mặc định, API chỉ chạy trên localhost.
Để gọi API từ một máy khác (ví dụ: trading bot trên Linux), bạn cần bật chế độ Remote trong phần Cài đặt.
Yêu cầu
- Tài khoản DataPro trả phí (SILVER / GOLD / DIAMOND), còn hạn sử dụng.
- DataPro.Client đang chạy và đã đăng nhập.
- Hai máy nằm trong cùng mạng LAN hoặc VPN.
Bật Remote API trong DataPro.Client
Bước 1: Mở ConfigForm
Vào Settings > System Configuration (Cấu hình hệ thống).
Bước 2: Cấu hình trong tab "Thông số chung"
- 1. Tích chọn "Xuất dữ liệu qua API" (Export data via API).
- 2. Giữ nguyên cổng mặc định
6789(hoặc đổi nếu cần). - 3. Tích chọn "Cho phép kết nối từ ngoài" (Allow remote connections).
- 4. Nhập IP LAN của máy remote vào ô "IP được phép remote".
- 5. Nhấn "Hiện" để xem API Key, sau đó nhấn "Sao chép" để copy.
- 6. Nhấn "Lưu" (Save) — KHÔNG ĐƯỢC BỎ QUA.
Bước 3 (Tùy chọn): Tạo lại API Key
Nếu API Key bị lộ, nhấn nút "Tạo mới" để tạo key mới.
Cấu hình Windows (chỉ làm 1 lần)
3.1 URL ACL
Chạy lệnh sau với quyền Administrator để cho phép lắng nghe trên cổng:
netsh http add urlacl url=http://+:6789/ user=Everyone listen=yes
3.2 Windows Firewall
Mở cổng trong tường lửa Windows:
netsh advfirewall firewall add rule name="DataPro API 6789" dir=in action=allow protocol=TCP localport=6789
Hoặc làm qua giao diện GUI:
1. Mở Windows Defender Firewall with Advanced Security
2. Chọn Inbound Rules → New Rule → Port → TCP → Specific local port: 6789 → Allow Đặt tên rule: DataPro API 6789 → Finish
3.3 Lấy IP máy remote
- Linux:
hostname -I - macOS:
ifconfig | grep "inet " | grep -v 127.0.0.1 - Windows:
ipconfig— tìm dòng IPv4 Address
3.4 Kiểm tra nhanh
curl http://localhost:6789/api/ping curl -v http://192.168.68.104:6789/api/ping
Gọi API từ Python
Cài đặt thư viện
pip install requests pandas
Cấu hình kết nối
import requests, pandas as pd, io, time
DATAPRO_HOST = "192.168.68.104" # IP may Windows chay DataPro
DATAPRO_PORT = 6789
API_KEY = "your-api-key-here"
BASE = f"http://{DATAPRO_HOST}:{DATAPRO_PORT}"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
Ping test
r = requests.get(f"{BASE}/api/ping", headers=HEADERS, timeout=5)
print("Server epoch:", r.text)
Lấy danh sách mã
r = requests.get(f"{BASE}/api/symbols", headers=HEADERS)
df = pd.read_csv(io.StringIO(r.text))
print(df.head())
Lấy dữ liệu ngày (Daily OHLCV)
# /api/data/daily/{symbol}/{from}/{to}/{adjusted}
r = requests.get(f"{BASE}/api/data/daily/VNM/0/0/1", headers=HEADERS)
df = pd.read_csv(io.StringIO(r.text))
print(df.tail())
Lấy dữ liệu phút (GOLD+)
r = requests.get(f"{BASE}/api/data/minute/VNM/0/0/1", headers=HEADERS)
df = pd.read_csv(io.StringIO(r.text))
print(df.tail())
Lấy dữ liệu tick (DIAMOND)
r = requests.get(f"{BASE}/api/data/tick/VNM/0/0/1", headers=HEADERS)
df = pd.read_csv(io.StringIO(r.text))
print(df.tail())
Lấy nhiều mã với rate limit
symbols = ["VNM", "FPT", "VCB", "HPG", "MWG"]
for sym in symbols:
r = requests.get(f"{BASE}/api/data/daily/{sym}/0/0/1", headers=HEADERS)
df = pd.read_csv(io.StringIO(r.text))
print(f"{sym}: {len(df)} rows")
time.sleep(0.6) # Rate limit: max ~2 req/s
Xử lý lỗi
def safe_get(url):
try:
r = requests.get(url, headers=HEADERS, timeout=10)
r.raise_for_status()
return r.text
except requests.exceptions.ConnectionError:
print("Connection refused - check DataPro is running")
except requests.exceptions.HTTPError as e:
print(f"HTTP {r.status_code}: {r.text}")
return None
Tham khảo Endpoints
Danh sách Endpoints
| Endpoint | Mô tả | Yêu cầu gói | Ghi chú |
|---|---|---|---|
/api/ping |
Trả về Unix timestamp | Bất kỳ | Kiểm tra kết nối |
/api/symbols |
Toàn bộ danh sách mã (CSV) | Bất kỳ | |
/api/symbols/{symbol} |
Thông tin 1 mã | Bất kỳ | Không phân biệt hoa/thường |
/api/data/daily/{sym}/{from}/{to}/{adj} |
Dữ liệu OHLCV theo ngày | SILVER+ | from/to: epoch giây; 0 = không giới hạn; adj: 1 = hiệu chỉnh |
/api/data/minute/{sym}/{from}/{to}/{adj} |
Dữ liệu OHLCV theo phút | GOLD+ | |
/api/data/tick/{sym}/{from}/{to}/{adj} |
Dữ liệu tick từng lệnh khớp | DIAMOND |
Mã trạng thái HTTP
| Mã | Ý nghĩa | Chi tiết |
|---|---|---|
200 | OK | |
401 | Unauthorized | API key sai hoặc thiếu |
403 | Forbidden | Remote chưa bật hoặc tài khoản không phải gói trả phí |
423 | Locked | IP không khớp với IP đã cấu hình |
429 | Too Many Requests | Vượt quá giới hạn tần suất |
503 | Server Busy | Thử lại sau 1 giây |
Lỗi thường gặp khi dùng Remote API
| Lỗi | Cách xử lý |
|---|---|
| Connection refused / timeout | Kiểm tra: DataPro đang chạy, API đã bật, firewall đã mở cổng, IP đúng, cùng mạng LAN/VPN. |
| 401 Invalid API key | Lấy lại API key từ ConfigForm. Đảm bảo header Authorization: Bearer <key> đúng. |
| 403 Remote disabled | Bật "Cho phép kết nối từ ngoài" trong ConfigForm rồi nhấn Lưu. |
| 423 IP locked | Kiểm tra và cập nhật IP trong ô "IP được phép remote" của ConfigForm. |
| 429 Too many requests | Thêm time.sleep(0.6) giữa các request. Giới hạn tối đa ~2 req/s. |
| 503 Server busy | Thử lại sau 1 giây. Server đang xử lý request khác. |
Lệnh debug
Kiểm tra kết nối từ máy remote:
# Linux / macOS curl -v http://192.168.68.104:6789/api/ping # Windows (PowerShell) Test-NetConnection -ComputerName 192.168.68.104 -Port 6789 Invoke-RestMethod http://192.168.68.104:6789/api/ping
Khuyến nghị bảo mật
- Không chia sẻ API key cho người khác.
- Thay đổi API key định kỳ (1-3 tháng).
- Sử dụng VPN hoặc SSH tunnel nếu cần truy cập qua Internet.
- Chỉ bật Remote khi cần sử dụng.
- Không commit API key vào Git — sử dụng biến môi trường.
Ví dụ SSH tunnel
Nếu máy remote không cùng LAN, dùng SSH tunnel qua jumphost:
ssh -L 6789:<windows-ip>:6789 user@jumphost
Sau đó gọi API bình thường qua localhost:6789 trên máy remote.
Câu hỏi thường gặp (FAQ)
| Câu hỏi | Trả lời |
|---|---|
| Có thể đổi cổng không? | Có. Đổi cổng trong ConfigForm rồi cập nhật lại lệnh netsh tương ứng. |
| Hỗ trợ nhiều IP remote không? | Phiên bản hiện tại hỗ trợ 1 IP. Dùng SSH tunnel cho máy thứ 2. |
| Tại sao đôi khi chậm ~1s? | Do cơ chế rate limit bảo vệ server. Giữ tần suất dưới 2 req/s. |
| API có hỗ trợ POST/PUT không? | Không. Toàn bộ API là GET, chỉ đọc dữ liệu (read-only). |
| DataPro có chạy headless được không? | Không. DataPro là ứng dụng WinForms, cần phiên GUI để hoạt động. |
| Dữ liệu có phải real-time không? | Có độ trễ vài giây so với luồng WebSocket chính. |