| Thực Hành Buổi 17: Bot Scalping Hoàn Chỉnh Dự Án 1

Được viết bởi Đặng Trí Thanh vào ngày 27/06/2026 lúc 20:32 | 22 lượt xem

Dự án 1 của khóa Bot Auto Trading Python hoàn thiện ở buổi 17 — Bot Scalping chạy được trên dữ liệu thời gian thực.

Khung Bot Scalping hoàn chỉnh

def on_message(ws, msg):
    gia = json.loads(msg)['c']
    if bien_dong_tang_du_manh(gia):
        vao_lenh_mua_nhanh(gia)
        dat_tp_sl_hep(gia)  # TP/SL rất gần do scalping

Dự án 1 chứng minh học viên đã đủ năng lực ghép API real-time + chiến lược + risk management thành một sản phẩm hoạt động — nền móng để làm tiếp Dự án 2 với phong cách giao dịch hoàn toàn khác.


📌 Muốn tự tay xây dựng Bot Auto Trading hoàn chỉnh bằng Python?
Khóa Vibe Code Python Bot Auto Trading (K11) tại Hướng Nghiệp Dữ Liệu — 24 buổi đi từ nền tảng Python đến triển khai Bot thật trên VPS, có Coaching 1-1 trong 1 năm.
📞 Hotline/Zalo: 0927 909 257

Mở rộng — Kiến trúc Bot Scalping hoàn chỉnh (Dự án 1)

Dự án 1 của K11 là một Bot Scalping chạy được trên dữ liệu thời gian thực. Bài này trình bày đầy đủ các thành phần: lấy dữ liệu, tín hiệu, quản lý vốn và vòng lặp chính.

Các thành phần của bot

Thành phần Chức năng Thư viện
Data Feed Lấy giá real-time Binance/MT5 API
Signal Phát hiện cơ hội scalp TA-Lib, Pandas
Risk Lot size, stop loss Tự viết
Execution Đặt lệnh tự động python-binance/MT5
Monitor Log + cảnh báo logging, Telegram
# [BOT SCALPING - PYTHON]
import time
import pandas as pd

class ScalpingBot:
    def __init__(self, symbol, lot_size, sl_pips, tp_pips):
        self.symbol = symbol
        self.lot_size = lot_size
        self.sl_pips = sl_pips
        self.tp_pips = tp_pips
        self.position = None

    def fetch_price(self):
        # thay bằng API thật (Binance/MT5)
        return {"bid": 1.0850, "ask": 1.0852}

    def signal(self, df):
        # quy tắc scalp đơn giản: breakout nến
        last = df.iloc[-1]
        return "BUY" if last["close"] > last["high"].shift(1) else None

    def run_once(self):
        tick = self.fetch_price()
        if self.position is None:
            sig = self.signal(self.build_df())
            if sig:
                self.place_order(sig, tick)
        else:
            self.check_exit(tick)

    def run(self, forever=True):
        while True:
            try:
                self.run_once()
            except Exception as e:
                print("Loi:", e)
            time.sleep(1)

Vì sao Scalping cần risk management nghiêm ngặt?

Scalping có tỷ lệ thắng cao nhưng lợi nhuận mỗi lệnh nhỏ. Một lệnh không có stop loss có thể xoá sạch lợi nhuận nhiều phiên. Bot luôn tính lot dựa trên rủi ro cố định thay vì cảm xúc.

# [TÍNH LOT - PYTHON]
def calc_lot(balance, risk_pct, sl_pips, pip_value):
    risk_amount = balance * risk_pct
    loss_per_lot = sl_pips * pip_value
    return round(risk_amount / loss_per_lot, 2)

# ví dụ: 10.000$, rủi ro 1%, SL 10 pip
lot = calc_lot(10000, 0.01, 10, 1.0)
print("Lot an toàn:", lot)

Mở rộng — Chiến lược Scalping và bộ lọc tín hiệu

Scalping không phải “mua bán liên tục cho vui”. Một bot scalping tốt cần bộ lọc để chỉ vào lệnh khi điều kiện thị trường phù hợp.

Bộ lọc ba lớp

  1. Lọc xu hướng: Chỉ scalp cùng hướng xu hướng lớn (EMA 200).
  2. Lọc thanh khoản: Tránh giờ tin lớn, giờ spread giãn.
  3. Lọc tín hiệu: Xác nhận bằng ít nhất hai chỉ báo.
# [BỘ LỌC TÍN HIỆU - PYTHON]
import talib

def filter_signal(df):
    close = df["close"]
    ema200 = talib.EMA(close, timeperiod=200)
    rsi = talib.RSI(close, timeperiod=14)

    trend_up = close.iloc[-1] > ema200.iloc[-1]
    rsi_ok = 40 < rsi.iloc[-1] < 70

    if trend_up and rsi_ok:
        return "BUY"
    return None

Bảng quản lý lệnh scalping

Tham số Khuyến nghị Vai trò
Rủi ro/lệnh 0.5–1% Chống thua lỗ lớn
R:R ≥ 1:1.5 Lợi nhuận dương dài hạn
Số lệnh/ngày ≤ 5 Tránh over-trade
Max loss/ngày 2–3% Dừng phiên khi lỗ

Mở rộng — Vòng lặp chính và xử lý lỗi của bot

Bot scalping chạy 24/7 nên phải chịu lỗi tốt: mất kết nối, API lỗi, lệnh không khớp. Vòng lặp chính cần bọc try/except và tự khôi phục.

# [VÒNG LẶP CHÍNH - PYTHON]
import time, logging

logging.basicConfig(filename="bot.log", level=logging.INFO)

def main_loop(bot):
    consecutive_errors = 0
    while True:
        try:
            bot.run_once()
            consecutive_errors = 0
        except ConnectionError:
            consecutive_errors += 1
            logging.warning("Mất kết nối, thử lại sau 5s")
            time.sleep(5)
        except Exception as e:
            consecutive_errors += 1
            logging.error("Lỗi: %s", e)
            if consecutive_errors > 10:
                logging.critical("Dừng bot vì lỗi liên tiếp")
                break
        time.sleep(1)

Các trạng thái của bot

  • IDLE: Đang chờ tín hiệu, không có vị thế.
  • OPEN: Đã vào lệnh, đang theo dõi.
  • HALT: Tạm dừng vì max loss/ngày hoặc lỗi.
  • SHUTDOWN: Dừng an toàn, lưu trạng thái.

Mở rộng — Từ Bot Scalping đến Bot Swing: bài học Dự án 2

Sau Dự án 1 (Scalping), khoá học tiếp tục với Dự án 2 (Swing Trading) — cùng nền tảng code nhưng khác hoàn toàn triết lý vào lệnh. Hiểu điểm khác biệt giúp bạn thiết kế bot linh hoạt.

Bảng so sánh Scalping vs Swing

Tiêu chí Scalping Swing
Khung thời gian 1m–5m 1H–1D
Số lệnh/ngày Nhiều Ít
SL/TP Hẹp Rộng
Tâm lý Áp lực cao Kiên nhẫn
Phí ảnh hưởng Rất lớn Nhỏ

Kiến trúc dùng chung

Dù là bot nào, kiến trúc lõi vẫn gồm: data feed, signal, risk, execution, monitor. Bạn chỉ thay đổi logic tín hiệu và tham số — phần khung giữ nguyên. Đây chính là sức mạnh của thiết kế tốt.

# [KHUNG BOT DÙNG CHUNG - PYTHON]
class TradeBot:
    def __init__(self, strategy, risk):
        self.strategy = strategy
        self.risk = risk
        self.position = None

    def run_once(self):
        df = self.strategy.get_data()
        signal = self.strategy.generate_signal(df)
        if signal and self.position is None:
            lot = self.risk.calc_lot()
            self.place(signal, lot)
        elif self.position:
            self.check_exit(df)

Bài học quan trọng từ hai dự án

  • Không có chiến lược “tốt nhất tuyệt đối”, chỉ có chiến lược phù hợp khẩu vị rủi ro.
  • Thiết kế khung trước, sau đó mới thêm chiến lược.
  • Luôn verify bằng backtest và forward test trước khi live.

Mở rộng — Kết nối dữ liệu thời gian thực

Bot scalping cần dữ liệu nhanh và ổn định. Tuỳ thị trường, bạn chọn nguồn phù hợp: Binance cho crypto, MT5 cho forex.

# [DỮ LIỆU BINANCE - PYTHON]
# pip install python-binance
from binance.client import Client

client = Client("API_KEY", "API_SECRET")

# lấy giá hiện tại
ticker = client.get_symbol_ticker(symbol="BTCUSDT")
print("BTC:", ticker["price"])

# lấy nến 1 phút
klines = client.get_klines(symbol="BTCUSDT", interval="1m", limit=50)
import pandas as pd
df = pd.DataFrame(klines, columns=[
    "time","open","high","low","close","volume","close_time",
    "qav","trades","tbb","tbq","ignore"])
df["close"] = df["close"].astype(float)
print(df.tail(3))

Bảng chọn nguồn dữ liệu

Thị trường Nguồn Thư viện
Crypto Binance python-binance
Forex MT5 MetaTrader5
Chứng khoán Yahoo/Stooq yfinance

Mở rộng — Kiểm thử và triển khai bot lên VPS

Một bot scalping chỉ đáng tin sau khi qua các bước kiểm thử nghiêm túc, sau đó triển khai chạy 24/7 trên VPS.

Quy trình triển khai

  1. Backtest trên dữ liệu lịch sử, tối ưu tham số.
  2. Forward test trên tài khoản demo 2–4 tuần.
  3. Chạy live với lot nhỏ, giám sát chặt.
  4. Triển khai lên VPS, dùng systemd để tự khởi động.
# [SYSTEMD - BASH]
# /etc/systemd/system/bot.service
[Unit]
Description=Scalping Bot
After=network.target

[Service]
ExecStart=/usr/bin/python3 /home/user/bot.py
Restart=always

[Install]
WantedBy=multi-user.target

Checklist vận hành bot an toàn

  • Log đầy đủ mỗi lệnh và lỗi.
  • Cảnh báo Telegram khi bot dừng.
  • Sao lưu cấu hình và trạng thái.
  • Giới hạn rủi ro bằng cầu dao tự động.

Mở rộng — Backtest Bot Scalping bằng Python

Trước khi chạy live, bot cần được backtest. Dưới đây là quy trình backtest một chiến lược scalping đơn giản với dữ liệu nến.

# [BACKTEST SCALPING - PYTHON]
import pandas as pd
import talib

def backtest(df, initial_balance=1000, risk_pct=0.01, sl_pips=10, tp_pips=15):
    df = df.copy()
    df["SMA20"] = talib.SMA(df["close"], timeperiod=20)
    df["Signal"] = (df["close"] > df["SMA20"]).astype(int).shift(1).fillna(0)

    balance = initial_balance
    trades = []
    for i in range(1, len(df)):
        if df["Signal"].iloc[i] == 1:
            # mô phỏng lệnh với SL/TP cố định
            risk_amount = balance * risk_pct
            result = risk_amount * (tp_pips / sl_pips) if i % 2 == 0 else -risk_amount
            balance += result
            trades.append(result)
    return {"balance": round(balance, 2), "trades": len(trades),
            "win_rate": round(sum(1 for t in trades if t > 0) / len(trades), 2) if trades else 0}

# giả lập dữ liệu
import numpy as np
np.random.seed(42)
price = 100 + np.cumsum(np.random.randn(500) * 0.5)
df = pd.DataFrame({"close": price})
result = backtest(df)
print(result)

Đọc kết quả backtest đúng cách

  • Số lệnh phải đủ lớn (trên 100) để có ý nghĩa thống kê.
  • Win rate chỉ tốt khi đi kèm R:R hợp lý.
  • Chú ý drawdown tệ nhất, không chỉ lợi nhuận cuối.

Mở rộng — Tâm lý và kỷ luật khi vận hành bot

Dù bot tự động, người vận hành vẫn cần kỷ luật. Nhiều bot thua không phải vì thuật toán sai mà vì con người can thiệp sai thời điểm.

Nguyên tắc vận hành

  • Chỉ thay đổi tham số khi có dữ liệu, không thay đổi theo cảm xúc.
  • Dừng bot khi đạt max loss/ngày, không “gỡ gạc”.
  • Ghi nhật ký mỗi lần can thiệp để rút kinh nghiệm.
  • Không nâng lot vì vừa thắng vài lệnh.

Bảng theo dõi hiệu suất hàng tuần

Chỉ số Tuần này Mục tiêu
Tổng lệnh 25 ≥ 20
Win rate 58% 50–60%
Max drawdown 3.2% < 5%
Lợi nhuận ròng +2.1% > 0

Dự án 1 Scalping hoàn chỉnh là cột mốc quan trọng: nó chứng minh bạn đủ năng lực ghép API thời gian thực, chiến lược và quản lý rủi ro thành một sản phẩm hoạt động — nền tảng để tiến tới Dự án 2 Swing và xa hơn.

Mở rộng — Tối ưu hoá hiệu suất bot scalping

Với scalping, vài mili giây có thể quyết định giá vào lệnh. Tối ưu hiệu suất giúp bot khớp lệnh tốt hơn và giảm trượt giá.

Các điểm tối ưu chính

Khu vực Vấn đề Giải pháp
Mạng Độ trễ kết nối Chạy bot gần server sàn (VPS cùng khu vực)
Dữ liệu WebSocket ngắt Tự reconnect, buffer
Tính toán Chậm Vector hoá, cache chỉ báo
Lệnh Khớp trễ Giới hạn deviation hợp lý

Dùng WebSocket thay vì polling

# [WEBSOCKET - PYTHON]
# pip install websocket-client
import json
import websocket

def on_message(ws, message):
    data = json.loads(message)
    print("Giá mới:", data.get("c"))

ws = websocket.WebSocketApp(
    "wss://stream.binance.com:9443/ws/btcusdt@miniTicker",
    on_message=on_message,
)
ws.run_forever()

Cache chỉ báo để tiết kiệm CPU

# [CACHE CHỈ BÁO - PYTHON]
_cache = {}

def get_sma(df, period):
    key = (len(df), period, df["close"].iloc[-1])
    if key not in _cache:
        _cache[key] = df["close"].rolling(period).mean().iloc[-1]
    return _cache[key]

Tối ưu hiệu suất là bước giúp bot scalping của bạn chuyển từ “chạy được” sang “chạy nhanh và ổn định” — điểm khác biệt của một hệ thống chuyên nghiệp.

Mở rộng — Các lỗi thường gặp khi xây bot scalping

Lỗi 1: Không xử lý trùng lệnh

Bot đặt lệnh hai lần vì tín hiệu chưa được đánh dấu đã xử lý. Giải pháp: dùng cờ trạng thái và kiểm tra vị thế trước khi vào lệnh.

Lỗi 2: Chạy vòng lặp quá nhanh

Không có giới hạn tần suất sẽ tốn CPU và dễ bị sàn chặn. Nên giới hạn số request mỗi giây.

Lỗi 3: Không log lỗi

Khi bot sập, không có log để biết vì sao. Luôn ghi log mỗi bước quan trọng.

Lỗi 4: Bỏ qua giờ tin lớn

Scalping trong giờ tin có thể bị quét stop. Nên có bộ lọc giờ hoặc tạm dừng quanh tin.

# [CHẶN GIỜ TIN - PYTHON]
from datetime import datetime

def trading_allowed(now=None):
    now = now or datetime.now()
    # tạm dừng quanh giờ tin lớn (ví dụ 13:30-14:00)
    if now.hour == 13 and now.minute >= 30:
        return False
    return True

Mở rộng — Cảnh báo Telegram cho bot scalping

Bot chạy 24/7, bạn không thể canh màn hình. Cảnh báo Telegram giúp bạn biết ngay khi có lệnh mới, lỗi, hoặc bot dừng.

# [TELEGRAM BOT - PYTHON]
# pip install python-telegram-bot requests
import requests

def send_telegram(token, chat_id, text):
    url = f"https://api.telegram.org/bot{token}/sendMessage"
    requests.post(url, json={"chat_id": chat_id, "text": text})

TOKEN = "123456:ABC-DEF"
CHAT_ID = "987654321"

send_telegram(TOKEN, CHAT_ID, "Bot vào lệnh BUY EURUSD 0.10 @ 1.0850")

Các sự kiện nên cảnh báo

  • Mỗi lệnh mở/đóng kèm giá và lot.
  • Lỗi đặt lệnh, mất kết nối.
  • Đạt max loss/ngày — bot tạm dừng.
  • Bot khởi động lại.

Bảng log lệnh mẫu

Thời gian Sự kiện Chi tiết
10:00:01 MỞ BUY EURUSD 0.10 @ 1.0850
10:05:12 ĐÓNG SELL 0.10 @ 1.0858 (+8 pip)
10:05:13 INFO Lợi nhuận lệnh: +8.0 USD

Mở rộng — Nâng cấp bot: thêm nhiều chiến lược và A/B test

Sau khi bot scalping cơ bản chạy ổn, bạn có thể nâng cấp bằng cách thử nhiều chiến lược và so sánh hiệu quả trước khi chọn chiến lược chính.

# [A/B TEST CHIẾN LƯỢC - PYTHON]
strategies = {
    "sma_cross": lambda df: (df["close"] > df["SMA20"]).astype(int),
    "rsi_mean": lambda df: (df["RSI"] < 30).astype(int),
}

results = {}
for name, strat in strategies.items():
    # mỗi chiến lược chạy trên cùng dữ liệu
    df = load_data()
    df["Signal"] = strat(df).shift(1).fillna(0)
    results[name] = evaluate(df)

for name, r in results.items():
    print(name, r)

Tiêu chí chọn chiến lược chính

  • Lợi nhuận ổn định, không chỉ đẹp một giai đoạn.
  • Drawdown thấp.
  • Số lệnh đủ nhiều để có ý nghĩa.
  • Logic có ý nghĩa thị trường, không chỉ “khớp số”.

Kỹ năng này giúp bạn tiến xa hơn nhiều so với việc chỉ chạy một bot đơn lẻ — hướng tới vận hành hệ thống giao dịch chuyên nghiệp như trong khoá K11.

Mở rộng — Báo cáo hiệu suất bot hằng ngày

Một bot chuyên nghiệp tự tạo báo cáo hiệu suất mỗi ngày, giúp bạn nhìn rõ bot có đang hoạt động đúng kế hoạch hay không.

# [BÁO CÁO HIỆU SUẤT - PYTHON]
from datetime import datetime

def daily_report(trades):
    total = len(trades)
    wins = sum(1 for t in trades if t > 0)
    profit = sum(trades)
    win_rate = wins / total if total else 0

    line1 = "=== BÁO CÁO BOT SCALPING ==="
    line2 = "Ngày: " + datetime.now().strftime("%Y-%m-%d")
    line3 = "Tổng lệnh: " + str(total)
    line4 = "Win rate: " + str(round(win_rate * 100)) + "%"
    line5 = "Lợi nhuận: " + str(round(profit, 2)) + " USD"
    report = "
".join([line1, line2, line3, line4, line5])

    send_telegram(TOKEN, CHAT_ID, report)

Bảng mẫu báo cáo tuần

Ngày Lệnh Win rate Lợi nhuận
T2 6 67% +12.4
T3 4 50% -3.1
T4 5 60% +8.0
T5 7 57% +15.2
T6 3 67% +5.5

Phân tích báo cáo đúng cách

  • Nhìn xu hướng nhiều ngày, không phán xét theo một ngày.
  • So sánh lợi nhuận thực với kỳ vọng từ backtest.
  • Nếu lệch lớn, rà soát lại tham số và dữ liệu.

Báo cáo hằng ngày biến việc vận hành bot từ “đoán” thành “đo lường” — đúng tinh thần của một hệ thống giao dịch chuyên nghiệp mà Dự án 1 hướng tới.

Bot giao dịch tự động và vai trò của thực hành buổi 17

Bot giao dịch tự động (trading bot) thực thi lệnh theo lập trình, loại bỏ cảm xúc và đảm bảo kỷ luật. Thực Hành Buổi 17 là một phần quan trọng trong hệ thống, giúp nhà đầu tư kiểm soát toàn bộ quy trình từ tín hiệu đến lệnh thực tế.

Bài viết này phân tích chi tiết về thực hành buổi 17: kiến trúc hệ thống, cách xây dựng, quản lý rủi ro, và những sai lầm phổ biến khiến bot thua lỗ.

Thành phần Chức năng Ví dụ
Thu thập dữ liệu Lấy giá realtime Binance API, MT5
Xử lý tín hiệu Tính toán điểm vào/ra Python strategy
Quản lý lệnh Đặt/sửa/đóng lệnh python-binance, MT5
Quản lý vốn Tính khối lượng theo rủi ro risk module
Cảnh báo Thông báo kết quả Telegram Bot

Kiến trúc một bot giao dịch chuẩn

Một bot tốt không chỉ gồm phần sinh tín hiệu mà còn có lớp quản lý lệnh, quản lý vốn và giám sát lỗi. Tách lớp giúp bạn dễ kiểm thử và nâng cấp từng phần mà không phá vỡ toàn hệ thống.

# Vòng lặp chính của bot
import time
while True:
    price = get_price()
    signal = strategy(price)
    if signal == 'BUY':
        open_position()
    elif signal == 'SELL':
        close_position()
    time.sleep(60)

Quản lý rủi ro — yếu tố sống còn

Nguyên tắc Mô tả Áp dụng
Rủi ro cố định/lệnh Không mạo hiểm quá 1-2% Tính lot tự động
Dừng lỗ bắt buộc Giới hạn thua mỗi lệnh Stop loss luôn bật
Không gồng lỗ Cắt lỗ ngay khi sai Đóng lệnh theo điều kiện
Phân bổ vốn Không dồn hết vào 1 cặp Đa dạng hóa tài sản
Backtest trước Kiểm chứng trước khi live Backtest ít nhất 1 năm

Dù chiến lược tốt đến đâu, nếu quản lý rủi ro kém thì tài khoản vẫn có thể cháy. Hãy coi quản lý vốn là phần quan trọng nhất của hệ thống.

Các sai lầm khiến bot thua lỗ

Sai lầm phổ biến nhất là tin vào backtest đẹp mà quên chi phí giao dịch và trượt giá. Một bot lời 10% trong backtest có thể lỗ ngoài thực tế nếu không tính spread, phí và độ trễ khớp lệnh.

Sai lầm thứ hai là chạy bot mà không giám sát. Bot có thể dừng do mất mạng, hết API credit hoặc lỗi logic. Cần có cảnh báo Telegram và log đầy đủ.

Mẹo vận hành bot ổn định 24/7

Để bot chạy liên tục, hãy dùng VPS thay vì máy cá nhân, cấu hình tự khởi động lại khi crash, và đặt log có xoay vòng để tránh đầy ổ cứng.

Câu hỏi thường gặp về thực hành buổi 17

Bot thực hành buổi 17 có chắc chắn sinh lời không?

Không có bot nào chắc chắn sinh lời. Bot chỉ thực thi kỷ luật theo chiến lược. Lợi nhuận phụ thuộc chất lượng chiến lược và quản lý rủi ro.

Cần kiến thức gì để tự xây bot?

Cần Python cơ bản, hiểu API sàn giao dịch và khái niệm thị trường. Bạn có thể học theo lộ trình từ phân tích dữ liệu đến tự động hóa.

Có nên chạy bot với tiền thật ngay không?

Không. Hãy chạy demo ít nhất vài tuần, đối chiếu kết quả, rồi mới dùng vốn nhỏ thật.

Kết luận

Thực Hành Buổi 17 giúp bạn giao dịch kỷ luật và tiết kiệm thời gian, nhưng cần được xây dựng đúng chuẩn: dữ liệu sạch, backtest trung thực, quản lý rủi ro chặt chẽ và giám sát thường xuyên. Hãy bắt đầu nhỏ và tối ưu dần.

Đặng Trí Thanh

Đặng Trí Thanh

Giám đốc Công nghệ · DNT Digital · Giảng viên HNDL
853 Bài viết
15.4k Người theo dõi
120k+ Lượt đọc

Đặ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.