Bài viết gần đây
-
Lộ Trình Học AI Trading Cho Người Đã Biết Bot Hedging (A–Z)
Tháng 9 8, 2026 -
Reinforcement Learning Cho Bot DCA: Dạy Bot Biết Khi Nào Nên Nín
Tháng 9 8, 2026
| Hướng Dẫn CCXT Kết Nối Binance Với Python Từ A-Z
Được viết bởi Đặng Trí Thanh vào ngày 25/07/2026 lúc 20:13 | 71 lượt xem
CCXT (CryptoCurrency eXchange Trading) là thư viện Python/JavaScript kết nối hàng trăm sàn crypto qua API thống nhất. Bài này hướng dẫn CCXT Python Binance từ A-Z: cài đặt, bảo mật API key, đọc giá, đặt lệnh spot demo, và lưu ý khi làm bot.
Nền Python: Python Cơ bản · Bot tổng quan: Lập trình bot trading là gì?
CCXT là gì? Vì sao dùng với Binance?
- Một API cho nhiều sàn — đổi sàn ít sửa code hơn.
- fetch_ticker, fetch_ohlcv, create_order — tên hàm chuẩn hóa.
- Cộng đồng lớn, tài liệu tiếng Anh đầy đủ.
Binance là sàn phổ biến để học API; luôn bắt đầu testnet trước mainnet.
Cài đặt
pip install ccxt python-dotenv
Tạo file .env (không commit Git):
BINANCE_API_KEY=your_key
BINANCE_SECRET=your_secret
Khởi tạo kết nối (read-only trước)
import ccxt
import os
from dotenv import load_dotenv
load_dotenv()
exchange = ccxt.binance({
"apiKey": os.getenv("BINANCE_API_KEY"),
"secret": os.getenv("BINANCE_SECRET"),
"enableRateLimit": True,
"options": {"defaultType": "spot"},
})
ticker = exchange.fetch_ticker("BTC/USDT")
print("Last:", ticker["last"])
enableRateLimit: True tránh bị ban IP khi gọi quá nhanh.
Lấy nến OHLCV (cho backtest / signal)
ohlcv = exchange.fetch_ohlcv("BTC/USDT", timeframe="1h", limit=100)
# Mỗi row: [timestamp, open, high, low, close, volume]
for row in ohlcv[-3:]:
print(row)
Đưa vào Pandas để tính MA, RSI giống backtest Python CK VN — chỉ khác nguồn dữ liệu.
Đặt lệnh spot (chỉ demo / testnet)
# Ví dụ cấu trúc — kiểm tra min notional, precision trước khi chạy
order = exchange.create_order(
symbol="BTC/USDT",
type="limit",
side="buy",
amount=0.001,
price=50000,
)
print(order["id"])
Trên mainnet, một lệnh sai có thể mất tiền thật. Dùng Binance Testnet khi học.
Bảo mật API key
| Nên | Không nên |
|---|---|
| IP whitelist | Bật Withdraw trên API key bot |
| Quyền tối thiểu (trade only) | Hard-code key trong repo |
| Rotate key định kỳ | Chia sẻ key qua chat |
Rate limit và lỗi thường gặp
- DDoSProtection / Rate limit: giảm tần suất, bật
enableRateLimit. - Insufficient balance: kiểm tra USDT/coin trước lệnh.
- Invalid symbol: dùng
BTC/USDTđúng format CCXT.
CCXT vs MT5 / CK VN
| CCXT + Binance | MT5 / CK VN | |
|---|---|---|
| Thị trường | Crypto 24/7 | FX, một số CK VN qua broker |
| Pháp lý VN | Cần tự tìm hiểu | Theo quy định trong nước |
| Học API | Testnet dễ | Phụ thuộc broker |
Algo tổng quan: Algorithmic trading tại Việt Nam.
Bước tiếp theo
- Bot paper trên testnet.
- Ghép signal + risk manager trước khi VPS live.
- Khóa thực chiến: Xây dựng IB bằng Bot Auto Trading.
FAQ
CCXT có miễn phí không?
Thư viện mã nguồn mở; phí giao dịch do sàn thu.
Futures Binance dùng CCXT được không?
Có — set defaultType: 'future' và đọc doc CCXT cho Binance futures.
Cần VPS không?
Bot 24/7 nên chạy server; học API thì laptop đủ.
Đặng Trí Thanh
Giám đốc Công nghệ · DNT Digital · Giảng viên Hướng Nghiệp Dữ Liệu
Đào tạo và triển khai thực chiến Python, MT5 và hệ thống bot auto trading / IB cho học viên và doanh nghiệp.
Xây dựng IB bằng Bot Auto Trading: https://www.huongnghiepdulieu.com/xay-dung-ib-bang-bot-auto-trading/ · Lịch khai giảng · Hotline 0934 145 100
Đọc thêm
- Binance Python Bot: hướng dẫn API CCXT & Futures Trading Bot
- Python Cheat Sheet: Hướng dẫn cơ bản cho người mới bắt đầu
🚀 CCXT Binance Python — Bản Đồ Đi Đến Bot Giao Dịch
Bài trước đã giới thiệu cách kết nối CCXT với Binance ở mức cơ bản: cài đặt, đọc giá, lấy nến, đặt lệnh spot demo và bảo mật API key. Phần này đào sâu để bạn biến một đoạn “đọc giá” thành một bot giao dịch hoàn chỉnh chạy trên testnet: xây dựng vòng lặp bot, quản lý lệnh, kiểm soát rủi ro, chạy trên VPS và đo hiệu quả.
Nếu chưa đọc phần nền tảng, hãy quay lại: Python Cơ bản và Lập trình bot trading là gì?.
🧱 Cấu Trúc Một Bot CCXT Hoàn Chỉnh
Một bot giao dịch không chỉ là một hàm đặt lệnh. Nó cần vòng lặp chính chạy liên tục, đọc dữ liệu, tính tín hiệu, thực thi và ghi log. Cấu trúc tham khảo:
# [CẤU TRÚC BOT CCXT - PYTHON]
# 1. Khởi tạo exchange (testnet)
# 2. Vòng lặp chính:
# - fetch_ohlcv -> tính MA/RSI
# - nếu có tín hiệu -> kiểm tra vị thế hiện tại
# - nếu chưa có lệnh -> create_order
# 3. Ngủ một khoảng (sleep) rồi lặp lại
# 4. Ghi log mỗi bước để dễ debug
import ccxt
import time
import os
from dotenv import load_dotenv
load_dotenv()
exchange = ccxt.binance({
"apiKey": os.getenv("BINANCE_API_KEY"),
"secret": os.getenv("BINANCE_SECRET"),
"enableRateLimit": True,
"options": {"defaultType": "spot", "sandboxMode": True},
})
SYMBOL = "BTC/USDT"
INTERVAL = "5m"
POSITION_SIZE = 0.001 # BTC - nho, chi demo
def get_signal(symbol):
ohlcv = exchange.fetch_ohlcv(symbol, INTERVAL, limit=50)
closes = [c[4] for c in ohlcv]
ma_fast = sum(closes[-5:]) / 5
ma_slow = sum(closes[-20:]) / 20
return "BUY" if ma_fast > ma_slow else "SELL"
def has_position():
# fetch_balance de xem co dang giu coin khong (don gian)
balance = exchange.fetch_balance()
free = balance["free"].get("BTC", 0)
return free > POSITION_SIZE * 0.9
while True:
try:
signal = get_signal(SYMBOL)
print(f"[{time.strftime('%H:%M:%S')}] Signal={signal}")
if signal == "BUY" and not has_position():
order = exchange.create_order(SYMBOL, "market", "buy", POSITION_SIZE)
print("MUA:", order["id"])
elif signal == "SELL" and has_position():
order = exchange.create_order(SYMBOL, "market", "sell", POSITION_SIZE)
print("BAN:", order["id"])
except Exception as e:
print("LOI:", e)
time.sleep(60)
Lưu ý: `sandboxMode: True` chưa đủ — bạn phải tạo API key trên Binance Testnet và dùng đúng endpoint testnet. Với mục đích học, đây là cách an toàn nhất.
🔁 Vòng Lặp và Xử Lý Lỗi — Phần “Sống Còn”
Bot chạy 24/7 nên lỗi là chuyện bình thường: mất mạng, rate limit, sàn bảo trì. Code phải xử lý lỗi và tiếp tục chạy chứ không chết giữa chừng:
- Bọc toàn bộ vòng lặp trong
try/except. - Bắt các lỗi riêng:
ccxt.NetworkError,ccxt.RateLimitExceeded,ccxt.InsufficientFunds. - Khi bị rate limit → ngủ lâu hơn thay vì spam request.
- Ghi log ra file để xem lại khi bot lỗi.
# [XỬ LÝ LỖI - PYTHON]
import ccxt, time
def safe_fetch(exchange, symbol):
for attempt in range(3):
try:
return exchange.fetch_ticker(symbol)
except ccxt.NetworkError as e:
print("NetworkError, thu lai:", e)
time.sleep(5 * (attempt + 1))
except ccxt.RateLimitExceeded:
print("Rate limit, nghi 30s")
time.sleep(30)
raise RuntimeError("Khong the lay du lieu")
# Dung:
t = safe_fetch(exchange, "BTC/USDT")
print("BTC:", t["last"])
📉 Quản Lý Vị Thế — Không Mua Bán “Loạn”
Bot mới hay mắc lỗi mua liên tục mỗi khi tín hiệu BUY vì cứ 60 giây lại kiểm tra và thấy tín hiệu còn BUY. Cách xử lý:
- Chỉ mua khi chưa có vị thế mở (kiểm tra balance hoặc lệnh mở).
- Chỉ bán khi đang có vị thế.
- Dùng biến trạng thái trong bot:
position_open. - Với bot nâng cao, dùng
fetch_positionshoặc lưu trạng thái vào DB.
# [TRẠNG THÁI VỊ THẾ - PYTHON]
position_open = False # trang thai noi bo
while True:
signal = get_signal(SYMBOL)
if signal == "BUY" and not position_open:
exchange.create_order(SYMBOL, "market", "buy", POSITION_SIZE)
position_open = True
print("Da mo vi the BUY")
elif signal == "SELL" and position_open:
exchange.create_order(SYMBOL, "market", "sell", POSITION_SIZE)
position_open = False
print("Da dong vi the")
time.sleep(60)
🛡️ Risk Management Trong Bot CCXT
Một bot không có risk management là một “bom nổ chậm”. Trước khi đặt lệnh, hãy kiểm tra:
| Quy tắc | Mô tả | Cách làm |
|---|---|---|
| Position size | Rủi ro mỗi lệnh cố định | Tính theo % tài khoản |
| Stop loss | Giới hạn lỗ mỗi lệnh | Lệnh stop-limit hoặc kiểm tra giá |
| Max drawdown | Dừng bot khi lỗ lớn | Theo dõi equity, dừng nếu vượt ngưỡng |
| Daily loss limit | Giới hạn lỗ mỗi ngày | Reset biến mỗi ngày |
# [STOP LOSS ĐƠN GIẢN - PYTHON]
# Theo doi gia va dong lenh neu lo qua muc cho phep
buy_price = 50000
stop_distance = 0.02 # 2% -> cat lo
while position_open:
ticker = exchange.fetch_ticker(SYMBOL)
price = ticker["last"]
loss_pct = (buy_price - price) / buy_price
if loss_pct > stop_distance:
exchange.create_order(SYMBOL, "market", "sell", POSITION_SIZE)
position_open = False
print("Cat lo tai:", price)
break
time.sleep(10)
⚙️ Bot Chạy 24/7 — VPS, Systemd, Supervisor
Máy tính cá nhân tắt là bot ngừng. Để bot chạy liên tục bạn cần một VPS Linux và công cụ giữ tiến trình sống:
# [CHẠY BOT TRÊN VPS - BASH]
# Tren VPS Ubuntu
pip install ccxt python-dotenv
# Tao file .env chua API key (khong commit git)
nano .env
# Chay thu
python bot.py
# De bot tu khoi dong lai neu chet -> dung supervisor
sudo apt install supervisor
# Tao file /etc/supervisor/conf.d/bot.conf:
# [program:bot]
# command=python /home/user/bot/bot.py
# autostart=true
# autorestart=true
sudo supervisorctl update
Với MT5 (Windows) bạn dùng VPS Windows. Với crypto CCXT, VPS Linux rẻ và ổn định hơn.
📊 Đo Hiệu Quả Bot — Equity, PnL, Win Rate
Sau khi bot chạy một thời gian, bạn cần báo cáo để biết nó có đáng tin không:
- Equity curve — tổng tài sản theo thời gian.
- PnL — lời/lỗ ròng sau phí.
- Win rate — % lệnh thắng.
- Profit factor — tổng lời / tổng lỗ.
- Max drawdown — mức tụt sâu nhất từ đỉnh.
# [TÍNH PNL - PYTHON]
trades = [
{"side": "buy", "price": 50000, "qty": 0.001},
{"side": "sell", "price": 51000, "qty": 0.001},
]
def compute_pnl(trades):
pnl = 0.0
for t in trades:
pnl += (t["price"] if t["side"] == "sell" else -t["price"]) * t["qty"]
return pnl
print("PnL (USD):", round(compute_pnl(trades), 2)) # 1.0 USD truoc phi
🔐 Bảo Mật Khi Bot Chạy Thật
Khi chuyển sang mainnet, bảo mật là ưu tiên số một:
- API key không bao giờ có quyền withdraw.
- IP whitelist — chỉ VPS của bạn được gọi.
- Key nằm trong
.env, không commit Git. - Rotate key định kỳ, thu hồi khi không dùng.
- Dùng tài khoản riêng cho bot, không dùng tài khoản chính.
🏁 Lộ Trình Từ A-Z Cho Người Mới
- Học Python cơ bản và Pandas.
- Cài CCXT, kết nối testnet Binance, đọc giá, lấy nến.
- Viết tín hiệu MA/RSI trên dữ liệu testnet.
- Viết vòng lặp bot đơn giản trên testnet (không tiền thật).
- Thêm risk management, log, alert Telegram.
- Triển khai lên VPS chạy thử 2–4 tuần.
- Forward test ổn rồi mới cân nhắc mainnet với vốn nhỏ.
Khóa thực chiến: Xây dựng IB bằng Bot Auto Trading.
❓ FAQ
CCXT có hỗ trợ Binance Futures không?
Có — dùng defaultType: "future" hoặc swap, nhưng futures rủi ro cao hơn nhiều, chỉ dùng testnet khi học.
Lệnh market hay limit tốt hơn cho bot?
Market vào lệnh nhanh (chấp nhận slippage); limit kiểm soát giá nhưng có thể không khớp. Bot thường dùng market để đảm bảo vào được.
Testnet và mainnet khác gì?
Testnet dùng tiền ảo, không mất tiền thật, nhưng độ trễ/thanh khoản khác thật. Luôn test kỹ testnet trước.
CCXT học ở đâu cho người Việt?
Tại Hướng Nghiệp Dữ Liệu có khóa Python + bot thực chiến, hướng dẫn bằng tiếng Việt.
Bot Auto Trading · HNDL
🧠 Phân Tích Nến OHLCV Sâu Hơn — Nền Tảng Signal
Phần đầu đã lấy nến OHLCV. Giờ ta dùng nó để tính chỉ báo và sinh tín hiệu thực sự. Mỗi nến gồm [timestamp, open, high, low, close, volume] — đủ để tính MA, RSI, ATR:
# [TÍNH MA VÀ RSI TỪ OHLCV - PYTHON]
import ccxt
import pandas as pd
exchange = ccxt.binance({"enableRateLimit": True})
ohlcv = exchange.fetch_ohlcv("BTC/USDT", "1h", limit=100)
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
df["ma20"] = df["close"].rolling(20).mean()
df["ma50"] = df["close"].rolling(50).mean()
def rsi(series, period=14):
delta = series.diff()
gain = delta.clip(lower=0).rolling(period).mean()
loss = -delta.clip(upper=0).rolling(period).mean()
rs = gain / loss
return 100 - (100 / (1 + rs))
df["rsi"] = rsi(df["close"])
print(df[["close", "ma20", "ma50", "rsi"]].tail())
# Quy tac: gia tren MA20 va RSI > 50 -> xu huong tang
📋 Quản Lý Lệnh — Xem Lệnh Mở, Hủy, Sửa
Bot không chỉ đặt lệnh mà còn phải quản lý lệnh: xem lệnh mở, hủy lệnh chờ, sửa giá. Các hàm quan trọng:
fetch_open_orders— lệnh chờ khớp (limit).cancel_order(id)— hủy lệnh.edit_order(id, price, amount)— sửa lệnh.fetch_my_trades— lịch sử khớp lệnh.
# [QUẢN LÝ LỆNH - PYTHON]
# Xem lệnh mở
open_orders = exchange.fetch_open_orders("BTC/USDT")
print("So lenh cho:", len(open_orders))
# Huy tat ca lenh cho (vi du khi tin hieu dao chieu)
for o in open_orders:
exchange.cancel_order(o["id"], "BTC/USDT")
print("Da huy:", o["id"])
# Xem lich su khop lenh
trades = exchange.fetch_my_trades("BTC/USDT", limit=5)
for t in trades:
print(t["datetime"], t["side"], t["price"], t["amount"])
🛡️ Bảo Vệ Vốn — Stop Loss Và Take Profit
Một lệnh không có stop loss là một quả bom. Trong CCXT, stop loss thường dùng stop-limit hoặc kiểm tra giá trong vòng lặp:
# [STOP LOSS + TAKE PROFIT - PYTHON]
entry = 50000.0
stop_pct = 0.02 # cat lo 2%
tp_pct = 0.04 # chot loi 4%
def check_exit(current_price):
if current_price <= entry * (1 - stop_pct):
return "STOP_LOSS"
if current_price >= entry * (1 + tp_pct):
return "TAKE_PROFIT"
return "HOLD"
# Trong vong lap bot
price = exchange.fetch_ticker("BTC/USDT")["last"]
action = check_exit(price)
if action != "HOLD":
exchange.create_order("BTC/USDT", "market", "sell", POSITION_SIZE)
print(action, "tai", price)
🔁 Vòng Lặp Bot Hoàn Chỉnh + Telegram
Gộp tất cả lại thành một bot hoàn chỉnh với cảnh báo Telegram:
# [BOT HOÀN CHỈNH - PYTHON]
import ccxt, time, os, requests
from dotenv import load_dotenv
load_dotenv()
exchange = ccxt.binance({
"apiKey": os.getenv("BINANCE_API_KEY"),
"secret": os.getenv("BINANCE_SECRET"),
"enableRateLimit": True,
"options": {"defaultType": "spot", "sandboxMode": True},
})
def alert(msg):
requests.post(f"https://api.telegram.org/bot{os.getenv('TG_TOKEN')}/sendMessage",
json={"chat_id": os.getenv("TG_CHAT"), "text": msg})
position = False
SYMBOL = "BTC/USDT"
while True:
try:
ohlcv = exchange.fetch_ohlcv(SYMBOL, "15m", limit=50)
closes = [c[4] for c in ohlcv]
ma_f = sum(closes[-5:]) / 5
ma_s = sum(closes[-20:]) / 20
sig = "BUY" if ma_f > ma_s else "SELL"
if sig == "BUY" and not position:
exchange.create_order(SYMBOL, "market", "buy", 0.001)
position = True
alert("🟢 MO BUY BTC")
elif sig == "SELL" and position:
exchange.create_order(SYMBOL, "market", "sell", 0.001)
position = False
alert("🔴 DONG VI THE")
except Exception as e:
alert("⚠️ LOI BOT: " + str(e))
time.sleep(60)
⚡ Hiệu Suất Và Độ Trễ — Khi Nào Cần WebSocket
Bot chạy fetch_ohlcv mỗi phút sẽ chậm hơn bot dùng WebSocket nhận dữ liệu liên tục. Với chiến lược dài hạn (swing), polling 1 phút đủ. Với scalping, bạn cần:
- WebSocket — nhận tick realtime, độ trễ thấp.
- VPS gần sàn — đặt VPS ở vùng có ping thấp đến Binance.
- Giảm bước xử lý — tối ưu code, tránh tính nặng trong vòng lặp.
# [VÍ DỤ WEBSOCKET - PYTHON]
# Dung thu vien 'websocket-client' de nhan tick
# ws = websocket.WebSocket()
# ws.connect("wss://stream.binance.com:9443/ws/btcusdt@trade")
# Khi nhan duoc tin nhan -> xu ly ngay, khong can poll
📊 Báo Cáo Và Logging — Biết Bot Đang Làm Gì
Bot chạy 24/7 phải ghi log mọi hành động để bạn tra cứu khi cần:
# [LOGGING - PYTHON]
import logging
logging.basicConfig(
filename="bot.log",
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s",
)
logging.info("Bot khoi dong")
logging.info("Mo lenh BUY 0.001 BTC @ 50000")
logging.warning("Rate limit - nghi 30s")
logging.error("Loi ket noi: timeout")
Khi bot lỗi bất ngờ, log chính là “hộp đen” giúp bạn tìm nguyên nhân.
🔄 Chiến Lược Nâng Cao — DCA, Grid, Arbitrage
Sau khi nắm vững bot cơ bản, bạn có thể mở rộng sang các chiến lược khác:
- DCA (Dollar Cost Averaging) — mua định kỳ, giảm giá mua trung bình.
- Grid trading — đặt lệnh mua/bán theo lưới giá quanh vùng sideway.
- Arbitrage — chênh lệch giá giữa các sàn.
- Mean reversion — giá lệch khỏi trung bình thì quay về.
# [GRID ĐƠN GIẢN - MÔ TẢ]
# Chon vung gia: min=48000, max=52000
# Chia 10 bac, moi bac cach 400
# Mua 1 luong nho o moi bac giam
# Ban o moi bac tang
# Gia dao dong trong vung -> thu loi deu
🚧 Lỗi Thường Gặp Khi Làm Bot CCXT
| Lỗi | Nguyên nhân | Cách xử lý |
|---|---|---|
| Rate limit | Gọi API quá nhanh | Bật enableRateLimit, thêm sleep |
| Insufficient funds | Không đủ balance | Kiểm tra balance trước lệnh |
| Invalid symbol | Sai format | Dùng “BTC/USDT” chuẩn CCXT |
| Order not found | Sai id / hết hạn | Bắt lỗi và thử lại |
| Network timeout | Mất mạng | Retry với backoff |
🏁 Tổng Kết — Từ A-Z Đến Bot Chạy Thật
- Cài CCXT + kết nối testnet Binance.
- Đọc giá, lấy nến OHLCV, tính MA/RSI.
- Viết vòng lặp bot: signal → order → quản lý vị thế.
- Thêm stop loss, take profit, alert Telegram, log.
- Triển khai VPS, theo dõi, forward test.
- Nâng cấp chiến lược (DCA, grid…) khi đã vững.
Khóa thực chiến hướng dẫn trọn quy trình: Xây dựng IB bằng Bot Auto Trading · Khóa học bot trading Python.
Bot Auto Trading · HNDL
🔐 Bảo Mật Nâng Cao Khi Chạy Bot Mainnet
Phần đầu đã nêu bảo mật cơ bản. Khi chuyển sang tiền thật, bảo mật là yếu tố không thể thỏa hiệp. Dưới đây là checklist đầy đủ:
- API key riêng cho bot — không dùng key của ví chính, tài khoản chính.
- IP whitelist — chỉ IP VPS của bạn được gọi API.
- Tắt withdraw — key chỉ có quyền giao dịch, không rút tiền.
- Không commit key — dùng .env + .gitignore.
- Rotate key định kỳ — đổi key mỗi vài tháng.
- Monitor lạ — theo dõi log xem có request từ IP khác không.
# [.GITIGNORE - BASH]
# Noi dung file .gitignore
.env
*.log
__pycache__/
venv/
# Dam bao khong commit key ra ngoai
🧠 Tối Ưu Chiến Lược — Backtest Nâng Cao Với CCXT
Lấy dữ liệu lịch sử từ CCXT rồi backtest vectorized nhanh với Pandas:
# [BACKTEST VECTORIZED - PYTHON]
import ccxt
import pandas as pd
exchange = ccxt.binance({"enableRateLimit": True})
def fetch_historical(symbol, timeframe, limit=500):
ohlcv = exchange.fetch_ohlcv(symbol, timeframe, limit=limit)
return pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
df = fetch_historical("BTC/USDT", "1h", 500)
df["ma_f"] = df["close"].rolling(10).mean()
df["ma_s"] = df["close"].rolling(30).mean()
df["signal"] = (df["ma_f"] > df["ma_s"]).astype(int)
df["pos"] = df["signal"].diff().fillna(0)
df["ret"] = df["close"].pct_change().fillna(0)
df["strat"] = df["pos"].shift(1).fillna(0) * df["ret"]
df["equity"] = 10000 * (1 + df["strat"]).cumprod()
print("Equity:", round(df["equity"].iloc[-1], 2))
print("DD%:", round((df["equity"] / df["equity"].cummax() - 1).min() * 100, 2))
📉 Quản Lý Rủi Ro Danh Mục Crypto
Crypto biến động mạnh; quản lý rủi ro phải nghiêm ngặt hơn:
- Rủi ro mỗi lệnh 0.5–1% — không quá 1% với crypto.
- Diversify — không đặt hết vào một coin.
- Tránh leverage cao — futures 100x là đường đến cháy tài khoản.
- Stablecoin buffer — giữ một phần USDT, không all-in.
- Max drawdown thấp — dừng bot sớm, ví dụ 10%.
# [QUẢN LÝ RỦI RO CRYPTO - PYTHON]
MAX_DD = 0.10
portfolio = {"BTC": 6000, "ETH": 3000, "USDT": 1000}
total = sum(portfolio.values())
def allocation(portfolio, coin):
return portfolio[coin] / total
print("BTC ratio:", round(allocation(portfolio, "BTC"), 2))
# Kiem tra: mot coin khong nen vuot 50% danh muc
🔁 Chiến Lược Nâng Cao — Mean Reversion Và Momentum
Hai họ chiến lược phổ biến với crypto:
| Họ chiến lược | Ý tưởng | Khi nào dùng |
|---|---|---|
| Mean reversion | Giá lệch khỏi trung bình sẽ quay về | Sideway, range-bound |
| Momentum / trend | Giá đang đi theo xu hướng sẽ tiếp tục | Xu hướng rõ ràng |
# [MEAN REVERSION - PYTHON]
# Dung z-score de do muc lech khoi trung binh
def zscore(series, window=20):
mean = series.rolling(window).mean()
std = series.rolling(window).std()
return (series - mean) / std
df["z"] = zscore(df["close"])
# Neu z gia qua thap, co kha nang hoi ve -> BUY
# Neu z > 2 -> gia qua cao -> SELL
print(df[["close", "z"]].tail())
💾 Lưu Trữ Và Phân Tích Dữ Liệu Giao Dịch
Bot sinh ra lượng dữ liệu lệnh; lưu vào SQLite để phân tích:
# [LƯU LỆNH SQLITE - PYTHON]
import sqlite3
conn = sqlite3.connect("crypto_bot.db")
conn.execute(
"CREATE TABLE IF NOT EXISTS orders ("
"id TEXT PRIMARY KEY, symbol TEXT, side TEXT, "
"price REAL, amount REAL, ts TEXT)")
def save_order(order, symbol):
conn.execute(
"INSERT OR IGNORE INTO orders VALUES (?,?,?,?,?,?)",
(order["id"], symbol, order["side"],
order["price"], order["amount"], order["datetime"]))
conn.commit()
# Sau do truy van: tong PnL, win rate, so lenh theo symbol
rows = conn.execute(
"SELECT side, COUNT(*), AVG(price) FROM orders "
"WHERE symbol='BTC/USDT' GROUP BY side").fetchall()
print(rows)
📊 Báo Cáo Hiệu Suất Bot Crypto
Định kỳ (tuần/tháng) tổng kết hiệu suất để quyết định tiếp tục hay dừng:
- Net PnL — sau phí và slippage.
- Profit factor — tổng lời / tổng lỗ.
- Max drawdown — mức rủi ro thực tế.
- Win rate — phân bố thắng thua.
- Sharpe — lợi nhuận điều chỉnh rủi ro.
# [TÍNH PROFIT FACTOR - PYTHON]
def profit_factor(trades_pnl):
wins = sum(p for p in trades_pnl if p > 0)
losses = abs(sum(p for p in trades_pnl if p < 0))
return round(wins / losses, 2) if losses else 0
print(profit_factor([50, -20, 30, -10, 80, -15]))
🚧 Giám Sát Bot — Alert Khi Có Sự Cố
Bot chạy 24/7 nhưng bạn không thể. Hệ thống giám sát sẽ thay bạn canh:
- Alert lệnh — mỗi lệnh mở/đóng gửi Telegram.
- Alert lỗi — rate limit, network, lệnh fail.
- Alert rủi ro — drawdown vượt ngưỡng → dừng bot.
- Heartbeat — bot “còn sống” mỗi X phút; im lặng = có vấn đề.
# [HEARTBEAT - PYTHON]
import requests, time
def heartbeat():
while True:
requests.post("https://api.telegram.org/botTOKEN/sendMessage",
json={"chat_id": "CHAT",
"text": "✅ Bot OK"})
time.sleep(600) # moi 10 phut
import threading
threading.Thread(target=heartbeat, daemon=True).start()
🏁 Lộ Trình Trọn Gói Bot CCXT Binance
- Kết nối testnet, đọc giá, lấy nến.
- Viết signal MA/RSI/Bollinger đơn giản.
- Xây vòng lặp bot + quản lý vị thế.
- Thêm stop loss, take profit, risk manager.
- Lưu log + lệnh vào DB, alert Telegram.
- Backtest kỹ, forward test, rồi live nhỏ.
- Giám sát, báo cáo định kỳ, tối ưu dần.
Thực hành trọn quy trình trong khóa: Xây dựng IB bằng Bot Auto Trading · Khóa học bot trading Python.
Bot Auto Trading · HNDL
Đặng Trí Thanh
Giám đốc Công nghệ · DNT Digital · Giảng viên HNDL Hướng Nghiệp Dữ LiệuĐặng Trí Thanh — Founder & CTO · Hướng Nghiệp Dữ Liệu - DNT Digital. Chuyên đào tạo và triển khai thực chiến Python, MT5 và hệ thống bot auto trading / IB cho học viên và doanh nghiệp.