Làm Sao Để Code Bot Auto Trading? Hướng Dẫn Từ A–Z [2026]
2026-07-04 — QuantTrade
Làm Sao Để Code Bot Auto Trading? Hướng Dẫn Từ A–Z [2026]
Bạn muốn tự viết một con bot tự động giao dịch nhưng không biết bắt đầu từ đâu? Hay bạn đã biết một chút Python nhưng chưa biết ghép nó vào hệ thống trading thực tế?
Bài này trả lời câu hỏi đó hoàn toàn — không phải lý thuyết suông, mà có code chạy được, kiến trúc thực tế, và lộ trình rõ ràng từ bước 0.
Bot Auto Trading Là Gì?
Bot auto trading (hay trading bot) là chương trình tự động thực hiện lệnh mua/bán trên thị trường tài chính theo bộ quy tắc được lập trình sẵn — không cần bạn ngồi nhìn màn hình.
Bot không cảm xúc, không mệt mỏi, chạy 24/7. Đó là lý do các quỹ đầu tư, trader chuyên nghiệp, và ngày càng nhiều trader cá nhân dùng bot.
Bot làm được gì:
- Phát hiện tín hiệu theo chiến lược (MA, RSI, Bollinger Bands, v.v.)
- Đặt lệnh tự động với stop loss và take profit
- Quản lý position size theo % rủi ro
- Chạy 24/7 kể cả khi bạn ngủ
Bot KHÔNG làm được:
- Tự sinh ra tiền từ không khí — chiến lược phải có edge thật
- Đảm bảo lợi nhuận — thị trường luôn có rủi ro
- Thay thế việc hiểu thị trường
Cần Gì Để Bắt Đầu Code Bot?
| Yếu tố | Yêu cầu tối thiểu |
|---|---|
| Ngôn ngữ | Python (cho broker API) hoặc MQL5 (cho MT4/MT5) |
| Kiến thức lập trình | Python cơ bản: biến, vòng lặp, hàm, if/else |
| Nền tảng giao dịch | MT5, Binance, Exness, v.v. |
| Chiến lược | Ít nhất 1 chiến lược có quy tắc rõ ràng (không phải "cảm giác") |
| Backtesting | Kiểm tra chiến lược trên dữ liệu lịch sử trước khi chạy thật |
Không cần giỏi toán hay có bằng IT. Cần tư duy logic và kiên nhẫn debug.
Kiến Trúc Của Một Bot Auto Trading
Mọi con bot — dù đơn giản hay phức tạp — đều gồm 4 thành phần:
┌─────────────────────────────────────────────┐
│ BOT AUTO TRADING │
│ │
│ [1. Data] → [2. Signal] → [3. Order] │
│ ↓ │
│ [4. Risk Management] │
└─────────────────────────────────────────────┘
1. Data Layer — Lấy dữ liệu giá (OHLCV)
- Nguồn: MT5 API, Binance API, Yahoo Finance, SSI, DNSE
- Loại: tick data, M1, M5, H1, D1
2. Signal Layer — Tính toán tín hiệu
- Ví dụ: MA(20) cắt MA(50) từ dưới lên → BUY signal
- Dùng thư viện: pandas, ta-lib, pandas_ta
3. Order Layer — Đặt/đóng lệnh
- Kết nối broker API: MT5, ccxt (Binance), REST API
- Xử lý: market order, limit order, stop loss, take profit
4. Risk Management — Bảo vệ tài khoản
- Position sizing: tối đa 1-2% tài khoản/lệnh
- Max drawdown: dừng bot khi lỗ quá ngưỡng
- Trailing stop, break-even
Cách Code Bot Bằng Python (Ví Dụ Thực Tế)
Dưới đây là bot MA crossover đơn giản chạy trên MT5 với Python.
Bước 1 — Cài đặt thư viện
pip install MetaTrader5 pandas pandas_ta
Bước 2 — Kết nối MT5
import MetaTrader5 as mt5
import pandas as pd
import pandas_ta as ta
from datetime import datetime
import time
# Kết nối MT5
if not mt5.initialize():
print("Lỗi kết nối MT5:", mt5.last_error())
quit()
print("MT5 version:", mt5.version())
Bước 3 — Lấy dữ liệu giá
def get_data(symbol, timeframe, n_bars=200):
"""Lấy n_bars nến gần nhất."""
rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, n_bars)
df = pd.DataFrame(rates)
df['time'] = pd.to_datetime(df['time'], unit='s')
df.set_index('time', inplace=True)
return df
# Ví dụ: EURUSD khung H1, 200 nến
df = get_data("EURUSD", mt5.TIMEFRAME_H1, 200)
Bước 4 — Tính tín hiệu (MA Crossover)
def get_signal(df, fast=20, slow=50):
"""
Trả về: 'buy', 'sell', hoặc None
Logic: MA nhanh cắt MA chậm
"""
df['ma_fast'] = ta.sma(df['close'], length=fast)
df['ma_slow'] = ta.sma(df['close'], length=slow)
# Lấy 2 nến gần nhất (đã đóng)
prev = df.iloc[-2]
curr = df.iloc[-1]
# MA nhanh cắt lên → BUY
if prev['ma_fast'] < prev['ma_slow'] and curr['ma_fast'] > curr['ma_slow']:
return 'buy'
# MA nhanh cắt xuống → SELL
elif prev['ma_fast'] > prev['ma_slow'] and curr['ma_fast'] < curr['ma_slow']:
return 'sell'
return None
Bước 5 — Đặt lệnh với quản lý rủi ro
def calculate_lot(symbol, risk_pct=0.01, sl_pips=20):
"""
Tính lot size theo % rủi ro tài khoản.
risk_pct=0.01 = rủi ro 1% tài khoản mỗi lệnh
"""
account = mt5.account_info()
balance = account.balance
risk_amount = balance * risk_pct
symbol_info = mt5.symbol_info(symbol)
pip_value = symbol_info.trade_tick_value
lot = risk_amount / (sl_pips * pip_value)
# Làm tròn theo bước lot của broker
lot = round(lot / symbol_info.volume_step) * symbol_info.volume_step
return max(lot, symbol_info.volume_min)
def place_order(symbol, order_type, lot, sl_pips=20, tp_pips=40):
"""Đặt lệnh market với SL/TP tự động."""
tick = mt5.symbol_info_tick(symbol)
point = mt5.symbol_info(symbol).point
if order_type == 'buy':
price = tick.ask
sl = price - sl_pips * 10 * point
tp = price + tp_pips * 10 * point
order_dir = mt5.ORDER_TYPE_BUY
else:
price = tick.bid
sl = price + sl_pips * 10 * point
tp = price - tp_pips * 10 * point
order_dir = mt5.ORDER_TYPE_SELL
request = {
"action": mt5.TRADE_ACTION_DEAL,
"symbol": symbol,
"volume": lot,
"type": order_dir,
"price": price,
"sl": sl,
"tp": tp,
"deviation": 10,
"magic": 12345,
"comment": "QuantTrade Bot",
"type_time": mt5.ORDER_TIME_GTC,
"type_filling": mt5.ORDER_FILLING_IOC,
}
result = mt5.order_send(request)
if result.retcode != mt5.TRADE_RETCODE_DONE:
print(f"Lỗi đặt lệnh: {result.retcode} - {result.comment}")
else:
print(f"Lệnh {order_type.upper()} đặt thành công: {lot} lots @ {price}")
return result
Bước 6 — Vòng lặp chính (main loop)
SYMBOL = "EURUSD"
TIMEFRAME = mt5.TIMEFRAME_H1
RISK_PCT = 0.01 # 1% tài khoản/lệnh
SL_PIPS = 20
TP_PIPS = 40
print("Bot đang chạy... Ctrl+C để dừng")
while True:
df = get_data(SYMBOL, TIMEFRAME, 200)
signal = get_signal(df)
if signal:
# Kiểm tra không có lệnh đang mở
positions = mt5.positions_get(symbol=SYMBOL)
if len(positions) == 0:
lot = calculate_lot(SYMBOL, RISK_PCT, SL_PIPS)
place_order(SYMBOL, signal, lot, SL_PIPS, TP_PIPS)
# Chờ đến nến tiếp theo (H1 = 3600 giây)
time.sleep(60) # check mỗi 60 giây
mt5.shutdown()
Bot này hoàn chỉnh, chạy được thật. Khoảng 80 dòng code, đủ các thành phần cơ bản.
Cách Code Bot Bằng MQL5 (EA cho MT5)
Nếu bạn dùng MT5 và không muốn chạy Python riêng, MQL5 (Expert Advisor) là lựa chọn native.
// MA Crossover EA — MQL5
input int FastMA = 20;
input int SlowMA = 50;
input double RiskPct = 0.01; // 1% tài khoản
input int SL_Pips = 20;
input int TP_Pips = 40;
input int MagicNumber = 12345;
#include <Trade\Trade.mqh>
CTrade trade;
int fastHandle, slowHandle;
int OnInit() {
fastHandle = iMA(_Symbol, PERIOD_H1, FastMA, 0, MODE_SMA, PRICE_CLOSE);
slowHandle = iMA(_Symbol, PERIOD_H1, SlowMA, 0, MODE_SMA, PRICE_CLOSE);
trade.SetExpertMagicNumber(MagicNumber);
return INIT_SUCCEEDED;
}
void OnTick() {
// Chỉ xử lý khi nến H1 mới mở
static datetime lastBar = 0;
datetime currentBar = iTime(_Symbol, PERIOD_H1, 0);
if (currentBar == lastBar) return;
lastBar = currentBar;
// Lấy giá trị MA
double fast[], slow[];
ArraySetAsSeries(fast, true);
ArraySetAsSeries(slow, true);
CopyBuffer(fastHandle, 0, 0, 3, fast);
CopyBuffer(slowHandle, 0, 0, 3, slow);
// Tín hiệu: nến [2] = trước đó, nến [1] = vừa đóng
bool buySignal = fast[2] < slow[2] && fast[1] > slow[1];
bool sellSignal = fast[2] > slow[2] && fast[1] < slow[1];
// Tính lot theo rủi ro
double balance = AccountInfoDouble(ACCOUNT_BALANCE);
double riskAmt = balance * RiskPct;
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double lot = NormalizeDouble(riskAmt / (SL_Pips * 10 * tickValue), 2);
lot = MathMax(lot, SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN));
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
if (buySignal && PositionsTotal() == 0) {
double entry = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double sl = entry - SL_Pips * 10 * point;
double tp = entry + TP_Pips * 10 * point;
trade.Buy(lot, _Symbol, entry, sl, tp, "QuantTrade EA");
}
if (sellSignal && PositionsTotal() == 0) {
double entry = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double sl = entry + SL_Pips * 10 * point;
double tp = entry - TP_Pips * 10 * point;
trade.Sell(lot, _Symbol, entry, sl, tp, "QuantTrade EA");
}
}
Lưu file .mq5, compile trong MetaEditor, kéo EA vào chart là chạy.
Backtesting — Kiểm Tra Trước Khi Chạy Thật
Không bao giờ chạy bot thật mà chưa backtest. Đây là bước bắt buộc.
Backtest Python với backtesting.py
from backtesting import Backtest, Strategy
from backtesting.lib import crossover
import pandas_ta as ta
class MACrossover(Strategy):
fast = 20
slow = 50
def init(self):
close = self.data.Close
self.ma_fast = self.I(ta.sma, close, self.fast)
self.ma_slow = self.I(ta.sma, close, self.slow)
def next(self):
if crossover(self.ma_fast, self.ma_slow):
self.buy(sl=self.data.Close[-1] * 0.99,
tp=self.data.Close[-1] * 1.02)
elif crossover(self.ma_slow, self.ma_fast):
self.position.close()
# Chạy backtest
bt = Backtest(df, MACrossover, cash=10_000, commission=0.001)
stats = bt.run()
print(stats)
bt.plot()
Các chỉ số cần xem:
- Win Rate: > 45% là chấp nhận được nếu Risk:Reward tốt
- Sharpe Ratio: > 1.0 là tốt
- Max Drawdown: < 20% là an toàn
- Profit Factor: > 1.3
Các Lỗi Phổ Biến Khi Code Bot Lần Đầu
| Lỗi | Nguyên nhân | Cách fix |
|---|---|---|
| Bot lệnh sai chiều | Nhầm ask/bid khi đặt buy/sell | Buy dùng ask, Sell dùng bid |
| Lot quá lớn | Không tính risk, gán cứng lot | Dùng hàm calculate_lot() |
| Đặt nhiều lệnh liên tục | Không check position đang mở | mt5.positions_get() trước khi đặt |
| Bot không dừng đúng giờ | Không xử lý market closed | Kiểm tra session trước khi trade |
| Backtest đẹp nhưng live lỗ | Overfitting hoặc look-ahead bias | Dùng iloc[-2] thay vì iloc[-1] |
| Lookahead bias | Dùng nến hiện tại chưa đóng | Luôn dùng nến đã đóng (index -2) |
Lộ Trình Học Code Bot Từ 0
Tuần 1–2: Python cơ bản (biến, vòng lặp, hàm, list, dict)
Tuần 3–4: Pandas + lấy data từ MT5 API
Tuần 5–6: Tính indicator (MA, RSI, Bollinger) bằng pandas_ta
Tuần 7–8: Viết signal + đặt lệnh đơn giản (không risk management)
Tuần 9–10: Thêm risk management (lot sizing, SL/TP tự động)
Tuần 11–12: Backtest với backtesting.py
Tuần 13–16: Chạy demo 1 tháng, theo dõi kết quả
Tháng 5+: Live với vốn nhỏ, cải thiện dần
Python vs MQL5 — Nên Dùng Cái Nào?
| Tiêu chí | Python | MQL5 |
|---|---|---|
| Dễ học | ✅ Dễ hơn | ❌ Cú pháp phức tạp |
| Thư viện AI/ML | ✅ Rất phong phú | ❌ Hạn chế |
| Tốc độ thực thi | ❌ Chậm hơn | ✅ Nhanh hơn |
| Tích hợp MT5 | ✅ Qua API | ✅ Native |
| Cần server riêng | ✅ Có thể cần VPS | ❌ Chạy trong MT5 |
| Backtest | ✅ backtesting.py, vectorbt | ✅ Strategy Tester của MT5 |
Khuyến nghị: Bắt đầu bằng Python để học nhanh. Khi cần tốc độ hoặc dùng MT5 chuyên sâu, học thêm MQL5.
FAQ
Cần bao nhiêu vốn để chạy bot? Bot không yêu cầu vốn tối thiểu, nhưng để risk management có ý nghĩa, nên có ít nhất 500–1000 USD khi chạy live. Demo thì $0.
Bot có đảm bảo lời không? Không. Bot tự động hóa chiến lược — nếu chiến lược không có edge, bot cũng không cứu được. Backtest kỹ trước.
Cần VPS không? Nếu dùng Python và muốn bot chạy 24/7, cần VPS (khoảng $5–10/tháng). MQL5 EA chỉ cần để MT5 mở trên máy hoặc VPS.
Mất bao lâu để viết bot đầu tiên? Với người đã biết Python cơ bản: 2–4 tuần để có bot đơn giản chạy được. Bot có quản lý rủi ro đầy đủ: 4–8 tuần.
Có thể code bot cho cổ phiếu VN không? Có, thông qua API của SSI, DNSE, hoặc TCBS. Logic giống hệt, chỉ khác phần kết nối API.
Bước Tiếp Theo
Bạn đã có nền tảng để bắt đầu. Các bước tiếp theo:
- Cài MT5 + Python → kết nối thử, lấy được data là thành công bước đầu
- Code bot đơn giản → dùng code Python ở trên làm template
- Backtest ít nhất 1–2 năm dữ liệu → xem Sharpe, Drawdown
- Chạy demo 1 tháng → so sánh live vs backtest
- Live với vốn nhỏ → học từ thực tế
Nếu bạn muốn đi nhanh hơn và có hệ thống bài bản, xem thêm: