Bài viết gần đây
| Thuật Toán 5: Cơ Chế Khóa Tầng & Vùng Đệm Khoảng Lùi An Toàn (Reopen Buffer)
Được viết bởi Đặng Trí Thanh vào ngày 01/06/2026 lúc 10:54 | 47 lượt xem
Churning — Kẻ Thù Im Lặng Phá Hủy Tài Khoản Lưới
Hãy tưởng tượng bot Nhị Quái V6 Pro vừa hoàn thành một thao tác Gặt X hoàn hảo: chốt lời tầng Buy số 5 tại đúng mức +X pips. Tài khoản cộng thêm một khoản lãi nhỏ, margin được giải phóng. Mọi thứ diễn ra đúng kế hoạch.
Nhưng thị trường ngay lập tức chơi xấu: giá quay đầu nhỏ và dao động ngay tại ranh giới tầng vừa đóng, lên xuống lên xuống trong một biên độ vài pips. Nếu không có cơ chế bảo vệ, bot sẽ:
- Phát hiện giá vượt xuống mức tầng 5 → mở Buy lại
- Giá vừa nhúc nhích lên → đạt +X → Gặt X → đóng lại
- Giá lại xuống → mở Buy lại lần nữa
- Lặp lại vô hạn trong vài phút…
Kết quả: mỗi lần mở/đóng, sàn thu spread + commission. 100 lần mở đóng tại một tầng = 100 lần nộp phí cho sàn. Tài khoản bị bào mòn từ từ bởi chi phí giao dịch dù trên màn hình có vẻ bot đang “hoạt động bình thường” — đây gọi là hiện tượng Churning (rác lệnh).
Thuật toán Khóa Tầng & Vùng Đệm Khoảng Lùi An Toàn (Reopen Buffer) trong Nhị Quái V6 Pro được thiết kế chính xác để ngăn chặn kịch bản này.
1. Toán Học Hysteresis: Nguyên Lý Kiểm Soát Vùng Đệm
1.1. Vấn Đề Với Trigger Đơn Điểm
Trong kỹ thuật điều khiển tự động, khi một hệ thống chỉ có một ngưỡng kích hoạt duy nhất (ON/OFF threshold), nó sẽ rung động liên tục khi tín hiệu dao động gần ngưỡng đó. Ví dụ: thermostat bật/tắt liên tục khi nhiệt độ phòng dao động ngay quanh 25°C.
Giải pháp kinh điển là Hysteresis: thiết lập hai ngưỡng riêng biệt — ngưỡng BẬT và ngưỡng TẮT — tạo ra một vùng đệm trung lập giữa hai trạng thái.
1.2. Áp Dụng Hysteresis Vào Lưới Giao Dịch
Trong Nhị Quái V6 Pro, logic Hysteresis được áp dụng cho việc mở khóa tầng như sau:
- Trạng thái LOCKED (khóa): Kích hoạt ngay khi tầng chốt lời (Gặt X hoặc Trailing Plow)
- Vùng đệm trung lập: Tầng ở trạng thái “nghỉ ngơi bắt buộc”, không nhận lệnh mới
- Trạng thái UNLOCKED (mở khóa): Chỉ kích hoạt khi giá lùi ra xa khỏi tầng ≥ ReopenBuffer
Công thức tính khoảng đệm an toàn:
// Khoảng lùi tối thiểu cần thiết để mở khóa tầng
ReopenMin = (InpReopenBuffer / 100.0) × GridStep
// Điều kiện mở khóa (cho Buy grid):
|CurrentPrice - StepPrice| > ReopenMin
1.3. Chọn Giá Trị ReopenBuffer Thực Chiến
| Buffer % | Ưu điểm | Nhược điểm | Phù hợp |
|---|---|---|---|
| 20-30% | Mở khóa nhanh, ít bỏ lỡ | Vẫn có thể bị churning nhẹ | Thị trường xu hướng mạnh |
| 40-60% | Cân bằng, hiệu quả tốt | Mức trung bình | Đa số tình huống |
| 70-100% | Chống churning tối đa | Có thể bỏ lỡ cơ hội vào lệnh | Thị trường sideway nhiều |
2. Kiến Trúc Hai Lớp Khóa: X_CLOSED và PLOW_CLOSED
2.1. Tại Sao Cần Hai Loại Cờ Khóa?
Nhị Quái V6 Pro phân biệt hai nguồn gốc đóng lệnh khác nhau và xử lý hậu kỳ khác nhau:
- _X_CLOSED_: Tầng đóng do Gặt X (chốt lời tại mức cố định +X). Tầng này có thể mở khóa tương đối sớm vì giá đã bounce một lần rõ ràng.
- _PLOW_CLOSED_: Tầng đóng do Trailing Plowing (giá chạy xa, cày nhiều mốc). Tầng này cần vùng đệm lớn hơn vì thường xảy ra trong xu hướng mạnh và giá có thể tiếp tục chạy xa trước khi pullback.
// Cấu trúc tên Global Variable cho cờ khóa
string GV_X_CLOSED = prefix + "_" + step_str + "_X_CLOSED";
string GV_PLOW_CLOSED = prefix + "_" + step_str + "_PLOW_CLOSED";
// Khi Gặt X thành công:
GlobalVariableSet(GV_X_CLOSED, TimeCurrent());
// Khi Trailing Plow đóng:
GlobalVariableSet(GV_PLOW_CLOSED, TimeCurrent());
2.2. Lưu Timestamp Thay Vì Boolean Flag
Thay vì lưu true/false đơn giản, Nhị Quái lưu TimeCurrent() (timestamp Unix khi khóa được đặt). Lý do:
- Debug dễ hơn: Biết chính xác tầng bị khóa lúc mấy giờ
- Timeout tự động: Có thể thiết lập cơ chế mở khóa tự động sau N giờ nếu cần
- Audit trail: Trace lại lịch sử hoạt động của từng tầng
3. Mã Nguồn MQL5 Đầy Đủ Thực Chiến
3.1. Hàm IsSafeToReopen() — Kiểm Tra Vùng Đệm
//+------------------------------------------------------------------+
//| Kiểm tra xem tầng giá đã đủ xa để mở khóa chưa |
//| step_price: giá danh nghĩa của tầng cần kiểm tra |
//| price_ref : giá tham chiếu hiện tại (bid hoặc ask) |
//| step_size : khoảng cách một bước lưới (tính bằng giá, không pips)|
//| buffer_pct: % khoảng lùi tối thiểu so với step_size |
//+------------------------------------------------------------------+
bool IsSafeToReopen(double step_price, double price_ref,
double step_size, double buffer_pct) {
if(step_size <= 0 || buffer_pct buffer_dist);
}
3.2. Hàm CheckAndReopenLayer() — Xử Lý Mở Khóa
//+------------------------------------------------------------------+
//| Kiểm tra và mở khóa tầng nếu điều kiện vùng đệm đã thỏa mãn |
//+------------------------------------------------------------------+
void CheckAndReopenLayer(int magic, int step, double step_price,
double price_ref, double step_size) {
string prefix = GetGVPrefix(magic);
string step_str = IntegerToString(step);
string gv_x = prefix + "_" + step_str + "_X_CLOSED";
string gv_plow = prefix + "_" + step_str + "_PLOW_CLOSED";
bool is_x_locked = GlobalVariableCheck(gv_x);
bool is_plow_locked = GlobalVariableCheck(gv_plow);
// Không có cờ khóa nào → không cần làm gì
if(!is_x_locked && !is_plow_locked) return;
// Kiểm tra điều kiện vùng đệm
double buffer_pct = InpReopenBuffer; // Từ input parameters
bool safe = IsSafeToReopen(step_price, price_ref, step_size, buffer_pct);
if(safe) {
// Xóa cờ khóa để giải phóng tầng
if(is_x_locked) {
GlobalVariableDel(gv_x);
PrintFormat("🔓 [REOPEN] Tầng %d (magic=%d) mở khóa X_CLOSED. "
"Khoảng lùi: %.1f pips",
step, magic,
MathAbs(price_ref - step_price) / _Point);
}
if(is_plow_locked) {
GlobalVariableDel(gv_plow);
PrintFormat("🔓 [REOPEN] Tầng %d (magic=%d) mở khóa PLOW_CLOSED.",
step, magic);
}
}
}
3.3. Tích Hợp Vào Vòng Lặp Quét Chính
//+------------------------------------------------------------------+
//| Quét toàn bộ tầng và cập nhật trạng thái khóa |
//+------------------------------------------------------------------+
void ProcessAllLayerLocks(int magic, ENUM_POSITION_TYPE pos_type) {
double p0 = GlobalVariableGet(GetGVPrefix(magic) + "_P0");
double step_size = (magic == InpBuyMagic) ? InpBuyStep : InpSellStep;
int max_layers = (magic == InpBuyMagic) ? InpBuyMaxLayer : InpSellMaxLayer;
double price_ref = (pos_type == POSITION_TYPE_BUY) ?
SymbolInfoDouble(_Symbol, SYMBOL_BID) :
SymbolInfoDouble(_Symbol, SYMBOL_ASK);
// Quét từ tầng âm đến tầng dương
for(int s = -max_layers; s <= max_layers; s++) {
if(s == 0) continue; // Tầng 0 không áp dụng khóa
double step_price = p0 + s * step_size;
CheckAndReopenLayer(magic, s, step_price, price_ref, step_size);
}
}
4. Sơ Đồ Luồng Khóa — Vùng Đệm — Mở Khóa
Chu Kỳ Khóa — Vùng Đệm — Mở Khóa Tầng Lưới
Tầng s: READY → Mở lệnh
Chốt lời: Gặt X / Plow
🔒 LOCKED — Cờ GV đặt = TimeCurrent()
Vùng Đệm: giá chưa lùi đủ buffer_dist
|price – step| > ReopenMin?
🔓 UNLOCKED — Sẵn sàng chu kỳ mới
NO → chờ tiếp
YES
5. Tương Tác Với FSM Chống Trùng Lệnh (Bài 4)
Reopen Buffer và FSM (Bài 4) cùng bảo vệ một mục tiêu nhưng ở hai tầng khác nhau:
| Cơ chế | Bảo vệ khỏi | Thời điểm hoạt động |
|---|---|---|
| FSM (Bài 4) | Trùng lệnh trong khi chờ server xác nhận | Ngay khi gửi OrderSend |
| Reopen Buffer | Churning sau khi tầng đã đóng | Sau khi lệnh đóng thành công |
// Logic kiểm tra kết hợp trước khi mở lệnh:
bool CanOpenLayerBuy(int magic, int step, double step_price) {
// Kiểm tra 1: FSM không bận
if(GetFSMState(magic, step, POSITION_TYPE_BUY) == STEP_BUSY)
return false;
// Kiểm tra 2: Reopen Buffer đã đủ khoảng lùi
double step_size = InpBuyStep;
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
string gv_x = GetGVPrefix(magic) + "_" + IntegerToString(step) + "_X_CLOSED";
string gv_plow = GetGVPrefix(magic) + "_" + IntegerToString(step) + "_PLOW_CLOSED";
if(GlobalVariableCheck(gv_x) || GlobalVariableCheck(gv_plow)) {
if(!IsSafeToReopen(step_price, ask, step_size, InpReopenBuffer))
return false;
}
// Kiểm tra 3: Chưa có lệnh Buy đang mở tại tầng này
if(HasOpenPositionAtLayer(magic, step, POSITION_TYPE_BUY))
return false;
return true;
}
6. Debugging Và Monitoring Vùng Đệm
// Hàm hiển thị trạng thái tất cả tầng trên Dashboard
void ShowLayerStatus(int magic, ENUM_POSITION_TYPE pos_type) {
double p0 = GlobalVariableGet(GetGVPrefix(magic) + "_P0");
double step_size = (magic == InpBuyMagic) ? InpBuyStep : InpSellStep;
double price_ref = SymbolInfoDouble(_Symbol,
pos_type == POSITION_TYPE_BUY ? SYMBOL_BID : SYMBOL_ASK);
int max_s = (magic == InpBuyMagic) ? InpBuyMaxLayer : InpSellMaxLayer;
string type_str = (magic == InpBuyMagic) ? "BUY" : "SELL";
Comment("=== LAYER STATUS [" + type_str + "] ===n");
for(int s = max_s; s >= -max_s; s--) {
if(s == 0) continue;
string prefix = GetGVPrefix(magic);
string step_str = IntegerToString(s);
bool x_locked = GlobalVariableCheck(prefix+"_"+step_str+"_X_CLOSED");
bool p_locked = GlobalVariableCheck(prefix+"_"+step_str+"_PLOW_CLOSED");
double step_p = p0 + s * step_size;
double dist = MathAbs(price_ref - step_p) / _Point;
double need = (InpReopenBuffer/100.0) * step_size / _Point;
string status = "FREE";
if(x_locked) status = "X_LOCK (dist=" + DoubleToString(dist,0) + " need>" + DoubleToString(need,0) + ")";
if(p_locked) status = "PLOW_LOCK";
Print("[s=" + step_str + "] " + status);
}
}
7. Tuning Reopen Buffer Theo Điều Kiện Thị Trường
7.1. Phân Tích ATR Để Chọn Buffer Phù Hợp
// Tính ATR 14 kỳ và so sánh với bước lưới để gợi ý buffer
double ATR14 = iATR(_Symbol, _Period, 14);
double ratio = ATR14 / InpBuyStep;
double recommended_buffer;
if(ratio < 0.3) {
recommended_buffer = 30.0; // Thị trường ít biến động → buffer nhỏ
} else if(ratio < 0.7) {
recommended_buffer = 50.0; // Biến động trung bình
} else {
recommended_buffer = 70.0; // Biến động cao → buffer lớn
}
PrintFormat("ATR14=%.1f pips, Step=%.1f pips, Ratio=%.2f → Gợi ý ReopenBuffer=%.0f%%",
ATR14/_Point, InpBuyStep/_Point, ratio, recommended_buffer);
7.2. Adaptive Buffer (Nâng Cao)
// Buffer tự động điều chỉnh theo spread hiện tại
double GetAdaptiveBuffer(double base_buffer_pct) {
double spread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD) * _Point;
double step_size = InpBuyStep;
// Tối thiểu buffer = 3× spread để đảm bảo không bị churning
double min_buffer_pct = (spread * 3 / step_size) * 100;
return MathMax(base_buffer_pct, min_buffer_pct);
}
8. Kết Luận: Lá Chắn Tài Chính Thiết Yếu
Thuật toán Reopen Buffer là lá chắn tài chính thiết yếu nhưng thường bị đánh giá thấp. Trong khi các thuật toán như Gặt X và Trailing Plowing mang lại lợi nhuận, Reopen Buffer bảo vệ lợi nhuận đó không bị bào mòn bởi chi phí giao dịch lặp lại tại cùng một tầng giá.
Nguyên tắc quan trọng nhất cần ghi nhớ:
- Luôn lưu cờ khóa vào Global Variable — không phải biến tạm trong RAM
- Timestamp thay vì boolean — linh hoạt hơn cho debugging và timeout logic
- Hai loại cờ riêng biệt (X_CLOSED, PLOW_CLOSED) — xử lý khác nhau nếu cần
- Kết hợp với FSM (Bài 4) — hai tầng bảo vệ bổ sung nhau
Trong bài tiếp theo (Bài 6 — FSM Chống Trùng Lệnh), chúng ta sẽ đi sâu vào cơ chế ngăn ngừa bot mở nhiều lệnh cùng lúc tại cùng một tầng trong những nano-giây thị trường biến động cực mạnh.
🎓 Học Xây Bot Nhị Quái V6 Pro Với Kiến Trúc Chuyên Nghiệp
Khóa học Lập trình MT5 Nâng cao — Hedging & Tự động hóa dạy đầy đủ 9 thuật toán cốt lõi từ chuẩn hóa đến Equity Lockdown, vận hành thực chiến trên VPS.
Bot giao dịch tự động và vai trò của thuật toán 5 cơ
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. Thuật Toán 5 Cơ 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ề thuật toán 5 cơ: 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ề thuật toán 5 cơ
Bot thuật toán 5 cơ 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
Thuật Toán 5 Cơ 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.
Tổng kết và các bước hành động tiếp theo về thuật toán 5 cơ
Qua bài viết, chúng ta đã đi qua các khía cạnh quan trọng của thuật toán 5 cơ: khái niệm cốt lõi, cách triển khai, các lỗi cần tránh và những thực hành tốt nhất. Điều quan trọng là biến kiến thức thành hành động.
| Hành động | Chi tiết | Thời gian dự kiến |
|---|---|---|
| Ôn lại lý thuyết | Đọc lại các khái niệm chính | 30 phút |
| Làm bài tập nhỏ | Áp dụng vào một ví dụ cụ thể | 1-2 giờ |
| Xây dựng dự án nhỏ | Tạo sản phẩm tối giản | Vài ngày |
| Chia sẻ & phản hồi | Tham gia cộng đồng | Liên tục |
| Đánh giá định kỳ | Xem lại kết quả mỗi tuần | Định kỳ |
Hãy bắt đầu ngay hôm nay với một bước nhỏ. Đừng chờ đến khi có đủ điều kiện hoàn hảo, vì điều kiện hoàn hảo hiếm khi đến. Việc bắt đầu sớm và kiên trì chính là yếu tố quyết định sự thành công của bạn với chủ đề này.
Phân tích chuyên sâu về thuật toán 5 cơ
Để hiểu đầy đủ về thuật toán 5 cơ, chúng ta cần phân tích từ nhiều góc độ: bản chất, cách vận hành, điều kiện áp dụng và kết quả kỳ vọng. Mỗi góc độ giúp bạn có một bức tranh hoàn chỉnh hơn trước khi đưa ra quyết định.
Về bản chất, thuật toán 5 cơ không phải là một phép màu mà là kết quả của quá trình nghiên cứu, thử nghiệm và tối ưu liên tục. Người thành công thường bắt đầu từ những bước nhỏ, đo lường kết quả và điều chỉnh dần.
Điều kiện áp dụng cũng rất quan trọng. Một phương pháp hiệu quả với người này chưa chắc phù hợp với người khác, vì vậy bạn cần đối chiếu với hoàn cảnh cụ thể của mình: vốn, thời gian, kiến thức và khả năng chịu rủi ro.
| Góc độ | Câu hỏi cần trả lời | Ý nghĩa thực tế |
|---|---|---|
| Bản chất | Nó hoạt động dựa trên nguyên lý gì? | Hiểu cốt lõi để không áp dụng sai |
| Vận hành | Quy trình thực hiện ra sao? | Biết rõ từng bước để kiểm soát |
| Điều kiện | Khi nào nên / không nên dùng? | Tránh lạm dụng gây rủi ro |
| Kết quả | Kỳ vọng hợp lý là gì? | Đặt mục tiêu thực tế, đo lường được |
| Rủi ro | Điều gì có thể sai? | Có kế hoạch dự phòng |
Cách tư duy đúng khi nghiên cứu thuật toán 5 cơ
Hãy luôn đặt câu hỏi: dữ liệu này từ đâu, giả định nào đang được dùng, và nếu giả định sai thì kết quả thay đổi ra sao. Tư duy phản biện giúp bạn tránh những kết luận vội vàng và những quyết định thiếu cơ sở.
Ví dụ thực tế về thuật toán 5 cơ
Để minh họa rõ hơn, chúng ta xét một ví dụ thực tế áp dụng thuật toán 5 cơ. Giả sử bạn muốn triển khai nó vào công việc hằng ngày: bắt đầu từ việc xác định mục tiêu, thu thập dữ liệu cần thiết, rồi thực hiện từng bước.
Bước đầu tiên, hãy liệt kê các tài nguyên và công cụ bạn đang có. Bước thứ hai, xây dựng một phiên bản tối giản nhất có thể chạy được. Bước thứ ba, kiểm tra kết quả trên dữ liệu nhỏ trước khi mở rộng.
# ví dụ tối giản: chạy thử từng bước
def step_1():
print('Thu thập dữ liệu')
def step_2():
print('Xử lý và phân tích')
def step_3():
print('Đánh giá kết quả')
for f in (step_1, step_2, step_3):
f()
Kết quả ban đầu có thể chưa hoàn hảo, nhưng quan trọng là bạn có một vòng lặp làm → đo → học. Mỗi vòng lặp giúp bạn hiểu sâu hơn và cải thiện chất lượng.
Điều chỉnh sau khi thử nghiệm
Sau vòng lặp đầu tiên, hãy ghi lại những gì hoạt động tốt và những gì chưa. Dựa trên đó, điều chỉnh một tham số tại một thời điểm để dễ dàng xác định nguyên nhân của sự thay đổi.
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.