Chào bạn! Nếu bạn đang tìm cách lấy dữ liệu Order Book từ sàn OKX để phân tích thị trường crypto, xây dựng bot giao dịch, hoặc đơn giản là học cách làm việc với API — bài viết này sẽ giúp bạn từ con số 0 đến khi chạy thành công đoạn code đầu tiên.
Tôi đã dành hơn 3 năm làm việc với dữ liệu từ các sàn giao dịch, và OKX là một trong những nền tảng có API tốt nhất hiện nay. Trong bài viết này, tôi sẽ chia sẻ tất cả những gì tôi đã học được, kể cả những lỗi "ngớ ngẩn" mà tôi đã mắc phải khi mới bắt đầu.
Order Book Là Gì? Tại Sao Bạn Cần Nó?
Trước khi nhảy vào code, hãy hiểu đơn giản thế nào là Order Book:
- Order Book = "Sổ lệnh" — nơi hiển thị tất cả lệnh mua (bid) và lệnh bán (ask) đang chờ khớp trên sàn
- Bạn sẽ thấy: "Có 50 người muốn mua BTC ở giá 65,000 USD"
- Dữ liệu này giúp bạn đọc được "tâm lý thị trường" — liệu người ta đang muốn mua hay bán nhiều hơn?
Bạn Cần Chuẩn Bị Những Gì?
Đừng lo, tôi sẽ liệt kê chi tiết để bạn không thiếu gì:
- Tài khoản OKX — Đăng ký miễn phí tại okx.com
- API Key từ OKX — Cách lấy tôi sẽ hướng dẫn ở bước tiếp theo
- Python đã cài đặt (phiên bản 3.8 trở lên) — Tải tại đây
- Máy tính có internet
💡 Gợi ý: Nếu bạn dùng Windows, sau khi cài Python hãy mở CMD và gõ python --version để kiểm tra đã cài đúng chưa nhé!
Bước 1: Tạo API Key Trên OKX
Đây là bước đầu tiên và quan trọng nhất. API Key giống như "chìa khóa" để bạn truy cập dữ liệu từ sàn.
Hướng Dẫn Từng Bước:
- Đăng nhập vào tài khoản OKX của bạn
- Click vào Avatar (góc trên bên phải) → chọn API
- Click Create API Key
- Điền thông tin:
- API Key Name: Đặt tên dễ nhớ (ví dụ: "MyTradingBot")
- Passphrase: Tạo mật khẩu riêng cho API
- Permissions: Chọn Read Only (chỉ đọc) nếu bạn chỉ lấy dữ liệu Order Book
- Bấm Confirm và hoàn thành xác minh 2FA
- QUAN TRỌNG: Lưu lại 3 thông tin sau:
API KeySecret KeyPassphrase
⚠️ Cảnh báo: Không chia sẻ Secret Key cho ai! Nếu lộ, hãy xóa API Key đó và tạo cái mới ngay!
Bước 2: Cài Đặt Thư Viện Cần Thiết
Mở Terminal (Mac/Linux) hoặc CMD (Windows) và chạy lệnh sau:
pip install requests
pip install websocket-client
💡 Giải thích đơn giản: requests giúp code "nói chuyện" với internet, còn websocket-client giúp nhận dữ liệu nhanh theo thời gian thực.
Bước 3: Code Đầu Tiên — Lấy Order Book Qua REST API
Đây là cách đơn giản nhất để lấy dữ liệu Order Book. REST API giống như việc bạn gửi thư — gửi yêu cầu → nhận phản hồi → xong.
import requests
import json
Thông tin API của bạn (thay bằng thông tin thật)
API_KEY = "your_api_key_here"
SECRET_KEY = "your_secret_key_here"
PASSPHRASE = "your_passphrase_here"
URL lấy Order Book của cặp BTC/USDT
INST_ID = "BTC-USDT"
url = f"https://www.okx.com/api/v5/market/books?instId={INST_ID}&sz=10"
Gọi API (phương thức GET - chỉ yêu cầu đọc dữ liệu)
response = requests.get(url)
Kiểm tra xem có thành công không
if response.status_code == 200:
data = response.json()
# In ra dữ liệu
print("=== ORDER BOOK BTC-USDT ===")
print(f"Thời gian cập nhật: {data['data'][0]['ts']}")
print(f"\nLệnh BÁN (Asks):")
print("Giá | Khối lượng")
print("-" * 20)
for ask in data['data'][0]['asks'][:5]: # Chỉ hiển thị 5 lệnh bán đầu tiên
price = float(ask[0])
volume = float(ask[1])
print(f"${price:,.2f} | {volume:.4f} BTC")
print(f"\nLệnh MUA (Bids):")
print("Giá | Khối lượng")
print("-" * 20)
for bid in data['data'][0]['bids'][:5]: # Chỉ hiển thị 5 lệnh mua đầu tiên
price = float(bid[0])
volume = float(bid[1])
print(f"${price:,.2f} | {volume:.4f} BTC")
else:
print(f"Lỗi: {response.status_code}")
print(response.text)
💡 Gợi ý: Chạy thử code này trước! Nếu bạn thấy dữ liệu hiện ra → Chúc mừng, bạn đã kết nối thành công!
Bước 4: Nâng Cao — Kết Nối WebSocket Để Nhận Dữ Liệu Real-time
REST API chỉ cho bạn "ảnh chụp" tại một thời điểm. Nếu bạn muốn cập nhật liên tục (ví dụ: cho bot giao dịch), cần dùng WebSocket.
import websocket
import json
import time
Khi có dữ liệu mới
def on_message(ws, message):
data = json.loads(message)
# Kiểm tra loại dữ liệu
if data.get('arg', {}).get('channel') == 'books':
for item in data.get('data', []):
print(f"\n📊 Cập nhật lúc: {item['ts']}")
print("=" * 40)
# Lệnh bán (Ask) - sắp xếp từ thấp đến cao
asks = item.get('asks', [])
print(f"\n🟢 {len(asks)} lệnh BÁN thấp nhất:")
for i, ask in enumerate(asks[:3]):
price = float(ask[0])
volume = float(ask[1])
print(f" {i+1}. ${price:,.2f} - {volume:.4f} BTC")
# Lệnh mua (Bid) - sắp xếp từ cao đến thấp
bids = item.get('bids', [])
print(f"\n🔴 {len(bids)} lệnh MUA cao nhất:")
for i, bid in enumerate(bids[:3]):
price = float(bid[0])
volume = float(bid[1])
print(f" {i+1}. ${price:,.2f} - {volume:.4f} BTC")
Khi kết nối thành công
def on_open(ws):
print("✅ Đã kết nối WebSocket OKX!")
# Gửi yêu cầu subscribe
subscribe_msg = {
"op": "subscribe",
"args": [{
"channel": "books",
"instId": "BTC-USDT"
}]
}
ws.send(json.dumps(subscribe_msg))
print("📡 Đã đăng ký nhận dữ liệu BTC-USDT...")
Khi có lỗi
def on_error(ws, error):
print(f"❌ Lỗi: {error}")
Khi ngắt kết nối
def on_close(ws):
print("🔌 Đã ngắt kết nối")
Chạy WebSocket
if __name__ == "__main__":
ws = websocket.WebSocketApp(
"wss://ws.okx.com:8443/ws/v5/public",
on_message=on_message,
on_open=on_open,
on_error=on_error,
on_close=on_close
)
print("🔄 Đang kết nối đến OKX WebSocket...")
ws.run_forever()
💡 Gợi ý: Để chương trình chạy được lâu, hãy thêm xử lý tự kết nối lại khi mất mạng. Tôi sẽ chia sẻ code mẫu trong phần "Lỗi thường gặp".
Bước 5: Lưu Trữ Dữ Liệu Vào File
Nếu bạn muốn phân tích dữ liệu về sau, hãy lưu vào file CSV hoặc JSON:
import requests
import csv
from datetime import datetime
Lấy dữ liệu Order Book
INST_ID = "BTC-USDT"
url = f"https://www.okx.com/api/v5/market/books?instId={INST_ID}&sz=50"
response = requests.get(url)
data = response.json()
Tạo file CSV để lưu
filename = f"orderbook_{INST_ID.replace('-', '_')}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
with open(filename, 'w', newline='') as f:
writer = csv.writer(f)
# Header
writer.writerow(['timestamp', 'side', 'price', 'volume', 'instId'])
# Ghi dữ liệu Ask (Bán)
for ask in data['data'][0]['asks']:
writer.writerow([
data['data'][0]['ts'],
'ask',
ask[0],
ask[1],
INST_ID
])
# Ghi dữ liệu Bid (Mua)
for bid in data['data'][0]['bids']:
writer.writerow([
data['data'][0]['ts'],
'bid',
bid[0],
bid[1],
INST_ID
])
print(f"✅ Đã lưu {filename}")
print(f"📊 Tổng cộng: {len(data['data'][0]['asks'])} lệnh bán, {len(data['data'][0]['bids'])} lệnh mua")
Phân Tích Dữ Liệu Order Book
Sau khi có dữ liệu, đây là một số cách phân tích cơ bản:
1. Tính Spread (Chênh lệch giá)
# Giả sử data đã được lấy từ API
best_bid = float(data['data'][0]['bids'][0][0]) # Giá mua cao nhất
best_ask = float(data['data'][0]['asks'][0][0]) # Giá bán thấp nhất
spread = best_ask - best_bid
spread_percent = (spread / best_bid) * 100
print(f"Giá mua cao nhất (Bid): ${best_bid:,.2f}")
print(f"Giá bán thấp nhất (Ask): ${best_ask:,.2f}")
print(f"Spread: ${spread:,.2f} ({spread_percent:.4f}%)")
print(f"💡 Spread thấp = Thị trường thanh khoản tốt")
2. Đếm Tổng Khối Lượng Mua/Bán
# Tính tổng khối lượng 10 lệnh đầu
bid_volume = sum(float(bid[1]) for bid in data['data'][0]['bids'][:10])
ask_volume = sum(float(ask[1]) for ask in data['data'][0]['asks'][:10])
print(f"Tổng khối lượng MUA (top 10): {bid_volume:.4f} BTC")
print(f"Tổng khối lượng BÁN (top 10): {ask_volume:.4f} BTC")
if bid_volume > ask_volume:
print("📈 Xu hướng: MUA đang chiếm ưu thế")
else:
print("📉 Xu hướng: BÁN đang chiếm ưu thế")
Giải Pháp Thay Thế: Tại Sao Nên Dùng HolySheep AI?
Trong quá trình làm việc với dữ liệu crypto, tôi đã thử nhiều công cụ. Và tôi muốn chia sẻ với bạn một giải pháp tốt hơn cho việc xử lý và phân tích dữ liệu: HolySheep AI.
Vấn Đề Khi Tự Làm Với OKX API
- Rate Limit — OKX giới hạn số lần gọi API. Quá 200 request/phút → bị chặn tạm thời
- Xử lý lỗi phức tạp — Cần code thêm phần retry, handle timeout
- Chi phí infrastructure — Server để chạy 24/7, bandwidth để truyền dữ liệu
- Độ trễ — WebSocket tự host thường có độ trễ 200-500ms
Giá Và So Sánh
| Tiêu chí | Tự host OKX API | HolySheep AI |
|---|---|---|
| Chi phí hàng tháng | $30-100+ (server + bandwidth) | Từ $2.50/MTok |
| Độ trễ | 200-500ms | <50ms |
| Rate Limit | 200 request/phút | Không giới hạn |
| Setup time | 2-4 giờ | 5 phút |
| Hỗ trợ | Tự xử lý lỗi | Hỗ trợ 24/7 |
| API khả dụng | Chỉ OKX | 30+ sàn + AI |
Bảng Giá HolySheep AI 2026
| Model | Giá/MTok | Tương đương (¥) | Tiết kiệm |
|---|---|---|---|
| GPT-4.1 | $8.00 | ¥56 | 85%+ |
| Claude Sonnet 4.5 | $15.00 | ¥105 | 85%+ |
| Gemini 2.5 Flash | $2.50 | ¥17.50 | 85%+ |
| DeepSeek V3.2 | $0.42 | ¥2.94 | 85%+ |
💡 So sánh: GPT-4.1 tại OpenAI giá $60/MTok, tại HolySheep chỉ $8/MTok — tiết kiệm hơn 85%!
Phù Hợp / Không Phù Hợp Với Ai
✅ NÊN tự code với OKX API nếu:
- Bạn là developer muốn học cách làm việc với API
- Bạn cần tùy chỉnh hoàn toàn logic xử lý dữ liệu
- Dự án của bạn có ngân sách hạn chế nhưng có thời gian
- Bạn cần latency cực thấp và kiểm soát hoàn toàn infrastructure
❌ KHÔNG NÊN tự code nếu:
- Bạn cần nhanh chóng có prototype để thuyết trình
- Bạn muốn tập trung vào phân tích dữ liệu, không phải kỹ thuật
- Team nhỏ, không có DevOps để maintain
- Bạn cần multi-exchange (OKX + Binance + Bybit...)
Vì Sao Chọn HolySheep AI?
Sau khi dùng thử HolySheep cho dự án phân tích thị trường của mình, đây là những điểm tôi thực sự thích:
- Thanh toán bằng WeChat/Alipay — Rất tiện cho người dùng Việt Nam, không cần thẻ quốc tế
- Tỷ giá ¥1 = $1 — Mua USDT/Token với giá Trung Quốc, cực kỳ có lợi
- Độ trễ <50ms — Nhanh hơn nhiều so với tự host, đủ cho trading thậm chí scalping
- Tín dụng miễn phí khi đăng ký — Bạn có thể test thoải mái trước khi quyết định
- Kết hợp AI + Dữ liệu thị trường — Dùng AI để phân tích Order Book tự động
# Ví dụ: Dùng HolySheep AI để phân tích Order Book
import requests
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"
HOLYSHEEP_URL = "https://api.holysheep.ai/v1/chat/completions"
Prompt cho AI phân tích Order Book
order_book_data = """
Order Book BTC-USDT:
- Bid: $65,000 (vol: 2.5 BTC), $64,950 (vol: 1.2 BTC), $64,900 (vol: 0.8 BTC)
- Ask: $65,010 (vol: 3.1 BTC), $65,020 (vol: 1.5 BTC)
- Spread: $10
"""
response = requests.post(
HOLYSHEEP_URL,
headers={
"Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
"Content-Type": "application/json"
},
json={
"model": "gpt-4.1",
"messages": [
{
"role": "system",
"content": "Bạn là chuyên gia phân tích thị trường crypto."
},
{
"role": "user",
"content": f"Phân tích Order Book sau và đưa ra khuyến nghị:\n{order_book_data}"
}
],
"temperature": 0.7
}
)
result = response.json()
print(result['choices'][0]['message']['content'])
Lỗi Thường Gặp Và Cách Khắc Phục
1. Lỗi "Connection Timeout"
Nguyên nhân: Kết nối internet chậm hoặc server OKX quá tải
# Cách khắc phục: Thêm timeout và retry tự động
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
def get_orderbook_with_retry(inst_id, max_retries=3):
url = f"https://www.okx.com/api/v5/market/books?instId={inst_id}&sz=10"
# Cấu hình retry
session = requests.Session()
retry = Retry(
total=max_retries,
backoff_factor=1, # Chờ 1s, 2s, 4s giữa các lần thử
status_forcelist=[500, 502, 503, 504]
)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
try:
response = session.get(url, timeout=10) # Timeout 10 giây
response.raise_for_status()
return response.json()
except requests.exceptions.Timeout:
print("❌ Timeout! Thử lại sau...")
return None
except requests.exceptions.RequestException as e:
print(f"❌ Lỗi kết nối: {e}")
return None
Sử dụng
data = get_orderbook_with_retry("BTC-USDT")
2. Lỗi "WebSocket Disconnect Sau Vài Phút"
Nguyên nhân: Server OKX tự động ngắt kết nối sau 30-60 giây nếu không có heartbeat
# Cách khắc phục: Thêm heartbeat và auto-reconnect
import websocket
import threading
import time
class OKXWebSocketClient:
def __init__(self):
self.ws = None
self.running = False
self.reconnect_delay = 5 # Giây chờ trước khi reconnect
def connect(self):
self.ws = websocket.WebSocketApp(
"wss://ws.okx.com:8443/ws/v5/public",
on_message=self.on_message,
on_open=self.on_open,
on_error=self.on_error,
on_close=self.on_close
)
self.running = True
# Chạy trong thread riêng
thread = threading.Thread(target=self._run)
thread.daemon = True
thread.start()
def _run(self):
while self.running:
try:
self.ws.run_forever(ping_interval=20) # Heartbeat mỗi 20s
except Exception as e:
print(f"⚠️ Lỗi: {e}")
if self.running:
print(f"🔄 Reconnecting sau {self.reconnect_delay}s...")
time.sleep(self.reconnect_delay)
self.reconnect_delay = min(self.reconnect_delay * 2, 60) # Tăng delay, max 60s
def disconnect(self):
self.running = False
if self.ws:
self.ws.close()
def on_message(self, ws, message):
print(f"📩 Nhận: {message}")
def on_open(self, ws):
print("✅ Kết nối!")
self.reconnect_delay = 5 # Reset delay
# Subscribe
ws.send('{"op":"subscribe","args":[{"channel":"books","instId":"BTC-USDT"}]}')
def on_error(self, ws, error):
print(f"❌ Lỗi: {error}")
def on_close(self, ws):
print("🔌 Ngắt kết nối")
Sử dụng
client = OKXWebSocketClient()
client.connect()
time.sleep(300) # Chạy 5 phút
client.disconnect()
3. Lỗi "Invalid API Key" Hoặc "Signature Verify Failed"
Nguyên nhân: Sai thông tin API Key, Secret Key, hoặc Passphrase
# Cách khắc phục: Kiểm tra và xác thực lại
import hmac
import base64
import datetime
import requests
def verify_okx_api(api_key, secret_key, passphrase):
"""
Test API Key bằng cách gọi endpoint không cần signature
"""
# Endpoint public - không cần signature
url = "https://www.okx.com/api/v5/market/ticker?instId=BTC-USDT"
try:
response = requests.get(url, timeout=10)
if response.status_code == 200:
print("✅ Kết nối internet OK, không có vấn đề từ phía OKX")
# Test với endpoint private
timestamp = datetime.datetime.utcnow().isoformat() + 'Z'
message = timestamp + 'GET' + '/api/v5/account/balance'
mac = hmac.new(
secret_key.encode('utf-8'),
message.encode('utf-8'),
digestmod='sha256'
)
signature = base64.b64encode(mac.digest()).decode('utf-8')
headers = {
'OK-ACCESS-KEY': api_key,
'OK-ACCESS-SIGN': signature,
'OK-ACCESS-TIMESTAMP': timestamp,
'OK-ACCESS-PASSPHRASE': passphrase,
'Content-Type': 'application/json'
}
balance_response = requests.get(
'https://www.okx.com/api/v5/account/balance',
headers=headers
)
if balance_response.status_code == 200:
print("✅ API Key hợp lệ!")
return True
else:
print(f"❌ Lỗi API Key: {balance_response.json()}")
return False
else:
print(f"❌ Lỗi kết nối: {response.status_code}")
return False
except Exception as e:
print(f"❌ Lỗi: {e}")
return False
Sử dụng - thay bằng thông tin của bạn
verify_okx_api(
api_key="your_api_key",
secret_key="your_secret_key",
passphrase="your_passphrase"
)
4. Lỗi "Rate Limit Exceeded"
Nguyên nhân: Gọi API quá nhiều lần trong thời gian ngắn
# Cách khắc phục: Thêm rate limiting
import time
import requests
from collections import deque
class RateLimitedClient:
def __init__(self, max_calls=180, time_window=60):
"""
max_calls: Số lần gọi tối đa
time_window: Trong bao lâu (giây)
"""
self.max_calls = max_calls
self.time_window = time_window
self.calls = deque()
def get(self, url, **kwargs):
now = time.time()
# Xóa các request cũ
while self.calls and self.calls[0