หากคุณกำลังสนใจการพัฒนาระบบเทรดอัตโนมัติหรือวิเคราะห์ข้อมูลตลาดคริปโต แต่ไม่รู้จะเริ่มต้นอย่างไร บทความนี้จะพาคุณเรียนรู้การใช้ Tardis.dev Python API เพื่อดึงข้อมูล Level2 Order Book จาก Binance ตั้งแต่ขั้นตอนแรกจนถึงการนำข้อมูลไปใช้งานจริง โดยไม่ต้องมีความรู้พื้นฐานมาก่อน
Level2 Order Book คืออะไร ทำไมต้องรู้?
ก่อนจะเข้าสู่การเขียนโค้ด เรามาทำความเข้าใจกันก่อนว่า Level2 Order Book คืออะไร และทำไมนักเทรดและนักพัฒนาถึงต้องการข้อมูลนี้
Order Book คือ "สมุดคำสั่งซื้อ-ขาย" ที่แสดงรายชื่อคำสั่งที่รอการจับคู่ทั้งหมดในตลาด แบ่งออกเป็น 2 ฝั่ง:
- ฝั่งซื้อ (Bid) — คำสั่งซื้อที่รอราคาต่ำกว่าราคาตลาด
- ฝั่งขาย (Ask) — คำสั่งขายที่รอราคาสูงกว่าราคาตลาด
ตัวอย่าง Order Book แบบง่าย
┌─────────────────────────────────────────────────┐
│ LEVEL2 ORDER BOOK - BTC/USDT │
├─────────────────────────────────────────────────┤
│ ฝั่งขาย (Ask) │ ฝั่งซื้อ (Bid) │
├─────────────────────────────────────────────────┤
│ ราคา ปริมาณ │ ราคา ปริมาณ │
│ 71,500.00 0.523 │ 71,490.00 1.245 │
│ 71,501.00 0.892 │ 71,485.00 2.103 │
│ 71,502.00 0.341 │ 71,480.00 0.876 │
│ 71,505.00 1.120 │ 71,475.00 3.567 │
└─────────────────────────────────────────────────┘
Level2 vs Level1 — Level1 แสดงเฉพาะราคาที่ดีที่สุดของฝั่งซื้อและฝั่งขาย แต่ Level2 แสดงข้อมูลครบถ้วนทุกระดับราคา ทำให้เห็น "ความลึก" ของตลาดได้ชัดเจนกว่า เหมาะสำหรับการวิเคราะห์แนวรับ-แนวต้าน หาจุดเข้า-ออก หรือสร้างบอทเทรดที่ฉลาดขึ้น
เตรียมความพร้อมก่อนเริ่มต้น
สิ่งที่ต้องมี
- คอมพิวเตอร์ — Windows, Mac หรือ Linux ก็ได้
- Python 3.8 ขึ้นไป — ดาวน์โหลดได้ที่ python.org
- บัญชี Tardis.dev — สมัครฟรีที่ tardis.dev
- API Key — ได้มาหลังสมัครบริการ
การติดตั้ง Python บน Windows
สำหรับผู้ที่ยังไม่เคยติดตั้ง Python ให้ดาวน์โหลดตัวติดตั้งจากเว็บไซต์หลัก แล้วทำเครื่องหมายติ๊กถูกหน้าข้อ "Add Python to PATH" ก่อนกด Install จากนั้นเปิด Command Prompt พิมพ์คำสั่งตรวจสอบเวอร์ชัน:
python --version
pip --version
หากแสดงเวอร์ชันออกมา เช่น Python 3.11.5 แสดงว่าติดตั้งเรียบร้อยแล้ว
การติดตั้ง Python บน Mac
เปิด Terminal แล้วพิมพ์:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install python
ติดตั้งไลบรารี Tardis.dev
หลังจากติดตั้ง Python เรียบร้อยแล้ว ให้เปิด Terminal (หรือ Command Prompt) แล้วพิมพ์คำสั่งติดตั้งไลบรารี:
pip install tardis-client
รอสักครู่จนเสร็จสมบูรณ์ จะเห็นข้อความประมาณ "Successfully installed tardis-client-x.x.x"
โค้ดพื้นฐาน: ดึงข้อมูล Order Book Snapshot
มาเขียนโค้ด Python แรกกันเลย! สร้างไฟล์ใหม่ชื่อ get_orderbook.py แล้วพิมพ์โค้ดด้านล่าง:
import asyncio
from tardis_client import TardisClient
async def get_orderbook_snapshot():
# สร้าง client โดยใส่ API key ของคุณ
client = TardisClient(api_key="YOUR_TARDIS_API_KEY")
# ดึงข้อมูล Order Book สำหรับ BTC/USDT perpetual futures
# exchange = "binance", channel = "order_book", symbol = "BTC-USDT-PERPETUAL"
async for orderbook in client.query(
exchange="binance",
channel="order_book",
symbols=["BTC-USDT-PERPETUAL"],
from_timestamp=1609459200000, # 1 มกราคม 2021 00:00:00 UTC
to_timestamp=1609545600000 # 2 มกราคม 2021 00:00:00 UTC
):
print(f"Timestamp: {orderbook.timestamp}")
print(f"Bids (ฝั่งซื้อ): {orderbook.bids[:5]}") # แสดง 5 รายการแรก
print(f"Asks (ฝั่งขาย): {orderbook.asks[:5]}") # แสดง 5 รายการแรก
print("-" * 50)
asyncio.run(get_orderbook_snapshot())
คำอธิบายโค้ด:
api_key— ใส่ API key ที่ได้จากการสมัคร Tardis.devexchange— กำหนดตลาดที่ต้องการ (binance, okx, bybit ฯลฯ)symbols— คู่เทรดที่ต้องการ เช่น BTC-USDT-PERPETUALfrom_timestamp / to_timestamp— ช่วงเวลาที่ต้องการดึงข้อมูล (หน่วยมิลลิวินาที)
วิธีแปลงวันที่เป็น Timestamp
from datetime import datetime
แปลงวันที่ 1 มกราคม 2024 เป็น timestamp
dt = datetime(2024, 1, 1, 0, 0, 0)
timestamp_ms = int(dt.timestamp() * 1000)
print(f"Timestamp: {timestamp_ms}")
Output: 1704067200000
โค้ดขั้นสูง: ประมวลผลและบันทึกข้อมูล
มาเพิ่มความสามารถให้โค้ดสามารถประมวลผลข้อมูล Order Book และคำนวณความลึกของตลาดกัน:
import asyncio
import json
from datetime import datetime
from tardis_client import TardisClient
class OrderBookAnalyzer:
def __init__(self, api_key):
self.client = TardisClient(api_key=api_key)
self.data_buffer = []
async def fetch_and_analyze(self, symbol, start_ts, end_ts):
print(f"กำลังดึงข้อมูล {symbol}...")
async for orderbook in self.client.query(
exchange="binance",
channel="order_book",
symbols=[symbol],
from_timestamp=start_ts,
to_timestamp=end_ts
):
# คำนวณความลึกตลาด (Market Depth)
bid_depth = sum([float(bid[1]) for bid in orderbook.bids[:10]])
ask_depth = sum([float(ask[1]) for ask in orderbook.asks[:10]])
# คำนวณ Spread (ส่วนต่างราคาซื้อ-ขาย)
best_bid = float(orderbook.bids[0][0])
best_ask = float(orderbook.asks[0][0])
spread = best_ask - best_bid
spread_pct = (spread / best_bid) * 100
# บันทึกผลลัพธ์
result = {
"timestamp": orderbook.timestamp,
"datetime": datetime.fromtimestamp(orderbook.timestamp / 1000).isoformat(),
"best_bid": best_bid,
"best_ask": best_ask,
"spread": round(spread, 2),
"spread_pct": round(spread_pct, 4),
"bid_depth_10": round(bid_depth, 4),
"ask_depth_10": round(ask_depth, 4),
"imbalance": round(bid_depth / (bid_depth + ask_depth), 4)
}
self.data_buffer.append(result)
print(f"[{result['datetime']}] Spread: ${result['spread']} ({result['spread_pct']}%) | Imbalance: {result['imbalance']}")
def save_to_file(self, filename="orderbook_analysis.json"):
with open(filename, "w") as f:
json.dump(self.data_buffer, f, indent=2)
print(f"บันทึกข้อมูล {len(self.data_buffer)} รายการลง {filename}")
async def main():
analyzer = OrderBookAnalyzer(api_key="YOUR_TARDIS_API_KEY")
# ดึงข้อมูลย้อนหลัง 1 ชั่วโมง
end_ts = int(datetime.now().timestamp() * 1000)
start_ts = end_ts - (60 * 60 * 1000) # 1 ชั่วโมงก่อน
await analyzer.fetch_and_analyze(
symbol="BTC-USDT-PERPETUAL",
start_ts=start_ts,
end_ts=end_ts
)
analyzer.save_to_file()
asyncio.run(main())
โค้ดนี้จะดึงข้อมูล Order Book แล้วคำนวณ:
- Spread — ส่วนต่างระหว่างราคาซื้อสูงสุดกับราคาขายต่ำสุด
- Market Depth — ปริมาณรวมใน 10 อันดับแรก
- Imbalance — อัตราส่วนระหว่างความลึกฝั่งซื้อกับรวมทั้งหมด (ใช้หาว่าตลาดเอนไปทางซื้อหรือขาย)
สัญลักษณ์ (Symbol) ที่ใช้ได้กับ Binance
Tardis.dev รองรับสัญลักษณ์หลายรูปแบบ ดูตัวอย่างการใช้งาน:
| ประเภท | สัญลักษณ์ (Symbol) | ตัวอย่างการใช้งาน |
|---|---|---|
| Perpetual Futures | BTC-USDT-PERPETUAL | สัญญา BTC ต่อเนื่อง |
| Delivery Futures | BTC-USDT-211225 | สัญญา BTC ที่ครบกำหนด 25 ธันวาคม 2021 |
| Spot | BTC-USDT | ซื้อขาย BTC แบบ Spot |
| Coin-M Futures | BTC-USD-PERPETUAL | สัญญา BTC ชำระเป็น USD |
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
กรณีที่ 1: AuthenticationError - API Key ไม่ถูกต้อง
# ❌ ข้อผิดพลาดที่พบ:
AuthenticationError: Invalid API key
✅ วิธีแก้ไข:
1. ตรวจสอบว่า API key ถูกต้อง
2. ตรวจสอบว่าไม่มีช่องว่างหรือตัวอักษรพิเศษติดมา
3. ตรวจสอบว่า API key ยังไม่หมดอายุ
ตัวอย่างการตรวจสอบ:
api_key = "YOUR_TARDIS_API_KEY"
if not api_key or api_key == "YOUR_TARDIS_API_KEY":
raise ValueError("กรุณาใส่ API key ที่ถูกต้อง")
client = TardisClient(api_key=api_key)
กรณีที่ 2: RateLimitError - เรียก API บ่อยเกินไป
# ❌ ข้อผิดพลาดที่พบ:
RateLimitError: Too many requests
✅ วิธีแก้ไข:
1. เพิ่ม delay ระหว่างการเรียก
2. ใช้การ cache ข้อมูล
3. อัพเกรดเป็นแพลนที่มี limit สูงกว่า
import asyncio
import time
class RateLimitedClient:
def __init__(self, client, delay=1.0):
self.client = client
self.delay = delay
self.last_call = 0
async def query_with_limit(self, *args, **kwargs):
# รอจนครบ delay
elapsed = time.time() - self.last_call
if elapsed < self.delay:
await asyncio.sleep(self.delay - elapsed)
self.last_call = time.time()
return self.client.query(*args, **kwargs)
ใช้งาน - รอ 1 วินาทีระหว่างแต่ละคำขอ
client = TardisClient(api_key="YOUR_TARDIS_API_KEY")
limited_client = RateLimitedClient(client, delay=1.0)
กรณีที่ 3: SymbolNotFoundError - สัญลักษณ์ไม่ถูกต้อง
# ❌ ข้อผิดพลาดที่พบ:
SymbolNotFoundError: BTC/USDT is not a valid symbol
✅ วิธีแก้ไข:
1. ใช้เครื่องหมายขีดกลาง (-) แทน slash (/)
2. ตรวจสอบว่าสัญลักษณ์มีอยู่จริงในเอกสาร
❌ ผิด:
symbols=["BTC/USDT"]
✅ ถูก:
symbols=["BTC-USDT"] # Spot
symbols=["BTC-USDT-PERPETUAL"] # Perpetual Futures
ตัวอย่างการตรวจสอบสัญลักษณ์ก่อนใช้งาน:
valid_symbols = [
"BTC-USDT",
"BTC-USDT-PERPETUAL",
"ETH-USDT-PERPETUAL",
"SOL-USDT-PERPETUAL"
]
symbol = "BTC-USDT-PERPETUAL"
if symbol not in valid_symbols:
raise ValueError(f"สัญลักษณ์ {symbol} ไม่ถูกต้อง")
else:
print(f"สัญลักษณ์ {symbol} ถูกต้อง")
กรณีที่ 4: MemoryError - ดึงข้อมูลมากเกินไป
# ❌ ข้อผิดพลาดที่พบ:
หน่วยความจำเต็มเมื่อดึงข้อมูลย้อนหลังหลายเดือน
✅ วิธีแก้ไข:
1. ดึงข้อมูลเป็นช่วงสั้นๆ แทนที่จะดึงทีเดียว
2. ประมวลผลแบบ streaming แทนการเก็บทั้งหมดใน memory
3. บันทึกข้อมูลลงไฟล์เป็นช่วง
import asyncio
from datetime import datetime, timedelta
async def fetch_in_chunks(symbol, start_date, end_date, chunk_days=7):
"""ดึงข้อมูลเป็นช่วงๆ ทีละ 7 วัน"""
current = start_date
while current < end_date:
chunk_end = min(current + timedelta(days=chunk_days), end_date)