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".
Mặc định hệ thống dùng cổng 6789. Nếu cổng mặc định bị chặn (do firewall, router, hoặc nhà mạng), bạn có thể nhập cổng tùy chỉnh để dùng cổng khác.
Hướng dẫn bật API

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".
Sau khi tắt API Cổng (port) sẽ được đóng lại, các ứng dụng hoặc dịch vụ bên ngoài sẽ không còn truy cập được dữ liệu qua API nữa.
Hướng dẫn tắt API

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).

Trạng thái API mở

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ộtMô tả
SYMBOLMã chứng khoán
NAMETên tiếng Việt của mã chứng khoán
NAME_ENTên tiếng Anh của mã chứng khoán
EXCHANGESà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
TYPELoạ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_PXGiá tham chiếu
OPEN_PXGiá mở cửa
HIGH_PXGiá cao nhất trong phiên
LOW_PXGiá thấp nhất trong phiên
CLOSE_PXGiá đóng cửa
BID_PXGiá đặt mua cao nhất hiện tại
BID_VOLKhối lượng đặt mua tương ứng với giá BID_PX
ASK_PXGiá chào bán thấp nhất hiện tại
ASK_VOLKhối lượng chào bán tương ứng với giá ASK_PX
VOLTổng khối lượng khớp lệnh trong phiên
VALTổng giá trị giao dịch
MATCHED_VOLKhố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ộtMô tả
TRADING_TIMEThời điểm giao dịch, tính bằng Unix epoch time
OIKhối lượng hợp đồng mở
OPEN_PXGiá mở cửa
HIGH_PXGiá cao nhất trong phiên
LOW_PXGiá thấp nhất trong phiên
CLOSE_PXGiá đóng cửa
REF_PXGiá tham chiếu
VOLTổng khối lượng khớp lệnh trong phiên
VALTổng giá trị giao dịch
PT_VOLTổng khối lượng giao dịch thỏa thuận trong phiên
PT_VALTổng giá trị giao dịch thỏa thuận trong phiên
BUY_VOLTổng khối lượng mua khớp lệnh
BUY_VALTổng giá trị mua khớp lệnh tương ứng
SELL_VOLTổng khối lượng bán khớp lệnh
SELL_VALTổng giá trị bán khớp lệnh
PORT_BUY_VOLKhối lượng mua của khối tự doanh
PORT_BUY_VALGiá trị mua của khối tự doanh
PORT_SELL_VOLKhối lượng bán của khối tự doanh
PORT_SELL_VALGiá trị bán của khối tự doanh
FRN_BUY_VOLKhối lượng mua của nhà đầu tư nước ngoài
FRN_BUY_VALGiá trị mua của nhà đầu tư nước ngoài
FRN_SELL_VOLKhối lượng bán của nhà đầu tư nước ngoài
FRN_SELL_VALGiá trị bán của nhà đầu tư nước ngoài
ADJ_RATETỉ 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ộtMô tả
TRADING_TIMEThời điểm giao dịch, tính bằng Unix epoch time
OPEN_PXGiá mở cửa
HIGH_PXGiá cao nhất trong phiên
LOW_PXGiá thấp nhất trong phiên
CLOSE_PXGiá đóng cửa
REF_PXGiá tham chiếu
VOLTổng khối lượng khớp lệnh trong phiên
VALTổng giá trị giao dịch
PT_VOLTổng khối lượng giao dịch thỏa thuận trong phiên
PT_VALTổng giá trị giao dịch thỏa thuận trong phiên
BUY_VOLTổng khối lượng mua khớp lệnh
BUY_VALTổng giá trị mua khớp lệnh tương ứng
SELL_VOLTổng khối lượng bán khớp lệnh
SELL_VALTổng giá trị bán khớp lệnh
FRN_BUY_VOLKhối lượng mua của nhà đầu tư nước ngoài
FRN_BUY_VALGiá trị mua của nhà đầu tư nước ngoài
FRN_SELL_VOLKhối lượng bán của nhà đầu tư nước ngoài
FRN_SELL_VALGiá trị bán của nhà đầu tư nước ngoài
ADJ_RATETỉ 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ộtMô tả
TRADING_TIMEThời điểm giao dịch, tính bằng Unix epoch time
CLOSE_PXGiá đóng cửa
REF_PXGiá tham chiếu
VOLTổng khối lượng khớp lệnh trong phiên
SIDEChiều giao dịch (mua/bán)

Bắt đầu nhanh (Quickstart)

  1. Đăng ký gói dịch vụ DataPro phù hợp tại trang Mua.
  2. Tải & cài đặt phần mềm DataPro — đăng nhập bằng tài khoản đã mua.
  3. Vào Cài đặt → API để bật endpoint & lấy API key.
  4. Gọi API qua HTTP — đính kèm header Authorization: Bearer <API_KEY>.

Mã lỗi thường gặp

Ý nghĩaCách xử lý
401API key sai hoặc đã hết hạnKiểm tra lại key trong phần mềm DataPro
403Tài khoản không còn gói dịch vụGia hạn gói phù hợp
404Mã không tồn tạiKiểm tra symbol
429Rate limitGiảm tần suất gọi hoặc nâng gói
500Lỗi serverLiê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.
Không khuyến nghị mở API ra Internet. Xem mục Bảo mật để biết thêm chi tiết.

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

Ý nghĩa Chi tiết
200OK
401UnauthorizedAPI key sai hoặc thiếu
403ForbiddenRemote chưa bật hoặc tài khoản không phải gói trả phí
423LockedIP không khớp với IP đã cấu hình
429Too Many RequestsVượt quá giới hạn tần suất
503Server BusyThử 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.