Bài viết gần đây
-
Quản lý CRM toàn diện: Từ lead đến học viên trung thành
Tháng 8 16, 2026 -
Auto Trading MQL5: Xây Dựng Bot Giao Dịch Tự Động Trên MetaTrader 5
Tháng 8 15, 2026
| 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
- Lọc xu hướng: Chỉ scalp cùng hướng xu hướng lớn (EMA 200).
- Lọc thanh khoản: Tránh giờ tin lớn, giờ spread giãn.
- 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
- Backtest trên dữ liệu lịch sử, tối ưu tham số.
- Forward test trên tài khoản demo 2–4 tuần.
- Chạy live với lot nhỏ, giám sát chặt.
- 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.
Weekly Digest — Nhận Bản Tin Hàng Tuần
Nhận các bài viết phân tích kỹ thuật chuyên sâu, thuật toán giao dịch tự động (Trading Bot) và các giải pháp công nghệ mới nhất từ Hướng Nghiệp Dữ Liệu.
Đặng Trí Thanh
Giám đốc Công nghệ · DNT Digital · Giảng viên HNDLĐặ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.