Đọc log MT5 để tìm nguyên nhân: bảng tra 25 dòng log và cách dựng cảnh báo theo log
Hướng dẫn13/09/2026 · 17 phút đọc

Đọc log MT5 để tìm nguyên nhân: bảng tra 25 dòng log hay gặp và cách dựng cảnh báo theo log

Khi bot ngừng làm việc, câu hỏi duy nhất bạn cần trả lời là: nó ngừng ở đâu, và vì sao? Không có phỏng đoán nào trả lời được câu đó. Chỉ có log.

Vấn đề là phần lớn trader không đọc log, vì ba lý do rất dễ hiểu: log dài và khô khan; bạn không biết dòng nào quan trọng; và quan trọng nhất — log của chính bạn không nói được gì, vì EA chỉ in ra những dòng chung chung như OrderSend failed hoặc không in gì cả.

Bài này giải quyết cả ba. Phần đầu là cách phân biệt bốn loại log trong MT5 và mở đúng log cho đúng câu hỏi. Phần giữa là bảng tra 25 dòng log hay gặp — mỗi dòng kèm nghĩa, nguyên nhân thường gặp và việc cần làm. Phần sau là cách viết log cho EA (có ví dụ MQL5) và cách đặt cảnh báo tự động theo mẫu log, để bạn không phải ngồi đọc log bằng mắt nữa.


1. Vì sao log là nguồn thông tin duy nhất đáng tin

Trực giác của bạn khi bot ngừng chạy là đoán. "Chắc mạng có vấn đề." "Chắc sàn bảo trì." "Chắc EA bị lỗi gì đó." Những phỏng đoán này đều có thể đúng, nhưng chúng không cho bạn biết nên sửa gì — và bạn sẽ sửa sai thứ rồi gặp lại đúng sự cố đó một tuần sau.

Log khác ở ba điểm:

Log có mốc thời gian. Nó cho biết sự việc xảy ra lúc nào, và trình tự các sự kiện. Trình tự quan trọng: "mất kết nối rồi EA bị gỡ" khác hoàn toàn với "EA bị gỡ rồi mất kết nối" — sự việc thứ hai nghĩa là bạn có một lỗi độc lập cần tìm riêng.

Log có mã lỗi.130 và mã 134 là hai câu chuyện khác nhau, dẫn tới hai cách xử lý khác nhau. Không có mã, bạn chỉ có một từ "failed".

Log là bằng chứng, không phải ký ức. Một tháng sau bạn sẽ không nhớ đêm đó đã xảy ra chuyện gì. FILE log thì nhớ.

Có một điều cần nói thẳng để bạn không mất niềm tin ở bước này: log chỉ hữu ích nếu EA của bạn có viết log. Nếu EA không in gì, bạn không "đọc log" được — bạn đang đọc log của terminal, thứ chỉ biết về kết nối và đăng nhập, không biết gì về logic của bạn. Vì vậy mục 5 của bài này là phần quan trọng nhất: cách tự thêm log vào EA.

2. Bốn loại log trong MT5 — mỗi loại trả lời một câu hỏi khác

Đây là chỗ gây nhầm lẫn nhiều nhất. MT5 có nhiều tab log, và người mới thường mở sai tab rồi kết luận "log không có gì".

Bốn loại log và câu hỏi mà mỗi loại trả lời
Bốn loại log và câu hỏi mà mỗi loại trả lời

Journal (của terminal). Ghi các sự kiện của terminal: kết nối tới server, đăng nhập, nạp EA, thay đổi symbol, đồng bộ dữ liệu lịch sử, khởi động lại. Đây là log của chương trình, không phải của bạn. Dùng khi nghi ngờ tầng máy, mạng, hoặc phiên đăng nhập.

Experts (do EA của bạn viết). Chỉ chứa những dòng mà EA gọi Print() hoặc PrintFormat(). Nếu tab này trống, hoặc dừng ở một thời điểm cụ thể, đó là dấu hiệu trực tiếp về việc EA ngừng chạy. Đây là tab quan trọng nhất — và cũng là tab bị bỏ trống nhiều nhất.

Trade (giao dịch). Ghi lệnh đã gửi, khớp, hoặc bị từ chối, kèm mã lỗi. Khi câu hỏi là "vì sao bot không vào lệnh", đây là tab duy nhất trả lời được. Lưu ý: một số trường hợp từ chối không xuất hiện ở tab Experts vì EA chưa kịp in gì — lệnh bị sàn từ chối ngay ở tầng truyền tin.

Event Viewer của Windows. Không nằm trong MT5. Ghi reboot, cập nhật hệ thống, tiến trình bị kết thúc, và hoạt động của Task Scheduler. Đây là nơi duy nhất cho biết máy đã khởi động lại lúc 3 giờ sáng — thông tin mà MT5 không thể biết, vì nó chưa chạy.

Thứ tự đọc thực tế: Trade → Experts → Journal → Event Viewer. Từ cụ thể tới tổng quát, từ trong EA ra tới hệ điều hành.

3. Quy trình 5 bước đọc log để tìm nguyên nhân

Quy trình 5 bước đọc log để tìm nguyên nhân
Quy trình 5 bước đọc log để tìm nguyên nhân

Bước 1 — Xác định mốc thời gian. Tìm thời điểm bot ngừng làm việc. Cách nhanh nhất: nhìn nến cuối cùng đã cập nhật trên chart, hoặc đọc dòng heartbeat cuối cùng trong file log của EA. Mọi thứ trước mốc này là bình thường, mọi thứ sau là hệ quả.

Bước 2 — Mở tab Trade. Lệnh cuối cùng đã gửi là khi nào? Có bị từ chối không? Nếu có, mã lỗi là gì? Nếu không có lệnh nào bị từ chối và cũng không có lệnh nào được gửi, nguyên nhân nằm ở tầng logic (EA không tạo tín hiệu), không phải ở tầng giao dịch.

Bước 3 — Mở tab Experts. Dòng cuối cùng của EA là gì, và lúc nào? Nếu dòng cuối là một dòng lỗi, bạn đã có câu trả lời. Nếu tab trống hoàn toàn, EA chưa từng chạy hoặc không có log. Nếu tab dừng đột ngột giữa một chuỗi bình thường, EA bị gỡ hoặc terminal bị kill.

Bước 4 — Mở tab Journal. Tìm các mẫu: no connection, invalid account, trading has been disabled, expert removed, terminal started. Mỗi mẫu tương ứng một nguyên nhân cụ thể trong bảng tra ở mục 4.

Bước 5 — Mở Event Viewer. Tìm mã 41, 6008, 1074 (khởi động lại) và thông tin Task Scheduler. Nếu có reboot, mọi phân tích ở bước 2–4 cần đọc lại theo giả thuyết "máy đã khởi động lại".

Hai nguyên tắc khi thực hành:

  • Đọc từ dòng cuối lên, không đọc từ đầu. Dòng đầu file là trạng thái sáu tiếng trước, thường hoàn toàn không liên quan.
  • Đừng cuộn bằng mắt. Dùng tìm kiếm với các từ khoá: error, failed, rejected, no connection, removed, invalid, timeout. Log 10.000 dòng sẽ rút xuống còn 20 dòng đáng đọc.

Và một trường hợp cần chuẩn bị tinh thần: nếu cả năm bước đều sạch, nguyên nhân không phải một lỗi. Đó là trường hợp "điều kiện vào lệnh không bao giờ tới" — bot chạy hoàn hảo nhưng bộ lọc spread hoặc khung giờ giao dịch chặn mọi tín hiệu. Với trường hợp này, không có gì trong log để tìm, và cách duy nhất là ghi log giá trị của từng điều kiện (mục 5).

4. Bảng tra 25 dòng log hay gặp

Bảng này là phần bạn nên lưu lại. Cột cuối là việc cần làm, không phải việc cần nghĩ.

#Dòng log / mãNghĩaNguyên nhân thường gặpViệc cần làm
1no connectionMT5 không kết nối được serverMạng VPS, broker bảo trì, sai serverPing tới server broker; kiểm tra DNS
2network errorLỗi ở tầng mạngFirewall, DNS, card mạngThử ping bằng IP thay vì tên miền
3connection closedKết nối bị đóngBroker ngắt session định kỳBình thường nếu 1 lần/ngày; cảnh báo nếu >2 lần/5 phút
4invalid accountSố tài khoản không hợp lệBroker đổi server, sai số tài khoảnSửa cấu hình đăng nhập theo server mới
5authorization failedSai mật khẩuĐã đổi mật khẩu, chưa cập nhật VPSCập nhật mật khẩu trên VPS
6previous session closedPhiên trước đã bị đóngMT5 khởi động lạiBình thường — nhưng là dấu hiệu đã có reboot
7terminal started / build ... startedMT5 vừa khởi độngReboot, hoặc mở lại sau khi bị killĐếm số lần trong ngày: >1 lần là bất thường
8trading has been disabledGiao dịch tự động bị tắtAutoTrading off, tài khoản read-onlyBật lại, kiểm tra trạng thái tài khoản
9expert removedEA bị gỡ khỏi chartRefresh chart, đổi symbol, lỗi khởi tạoKiểm tra profile; gắn lại EA
10cannot load expertKhông nạp được EAThiếu .ex5, thiếu DLL, sai kiến trúcKiểm tra file và quyền DLL
11not enough money (134)Không đủ ký quỹKhối lượng quá lớnGiảm volume, kiểm tra margin level
12invalid stops (130)Stops quá gần giáVi phạm khoảng cách tối thiểu của sànChuẩn hoá theo SYMBOL_TRADE_STOPS_LEVEL
13invalid volume (131)Khối lượng sai bướcKhông theo VOLUME_STEP / MIN / MAXChuẩn hoá volume trước khi gửi
14requote (138)Giá đổi trong lúc gửiMạng chậm, biến động mạnhThêm retry tối đa 3 lần
15off quotesKhông có giá để khớpSpread giãn, tin tứcTránh khung tin, thêm lọc spread
16trade is not allowed (4109)Không được phép giao dịchAutoTrading off, EA bị tắt quyềnBật lại, kiểm tra thuộc tính EA
17market closed (4108)Thị trường đóngNgoài giờ, cuối tuần, ngày lễLọc theo giờ giao dịch của symbol
18too many orders (148)Vượt số lệnh tối đaGiới hạn của tài khoản hoặc symbolKiểm tra giới hạn tài khoản
19symbol not found / invalid symbolKhông có symbol đóBroker thêm hậu tố .r / .proDò symbol theo tiền tố, không hardcode
20cannot open fileKhông mở được fileSandbox, sai đường dẫn, ổ đĩa đầyKiểm tra quyền, dung lượng ổ đĩa
21array out of rangeChỉ số mảng vượt biênLỗi trong EAKiểm tra ArraySize() trước khi truy cập
22zero divideChia cho 0Dữ liệu bất thường lúc khởi độngKiểm tra mẫu số trước khi chia
23history data synchronizationĐang đồng bộ lịch sửLần đầu, hoặc sau rebootBình thường; nếu kéo dài >5 phút thì kiểm tra mạng
24timeout / no responseHết thời gian chờMạng nghẽnKiểm tra mạng, giảm tần suất gọi
25waiting for updateChờ dữ liệu mớiMất dữ liệu hoặc thị trường đóngSo TimeCurrent() với giờ hiện tại

Ba dòng trong bảng này có tính chất đặc biệt, đáng nhớ riêng:

  • Dòng 6 và 7 không phải lỗi, nhưng là bằng chứng. terminal started xuất hiện trong Journal nghĩa là MT5 đã khởi động lại. Nếu bạn thấy dòng này vài lần một ngày, bạn đang có vấn đề ở tầng máy — dù không có lỗi nào khác.
  • Dòng 9 (expert removed) là dòng bạn nên cảnh báo ngay lập tức. Nó nghĩa là EA đã rời khỏi chart, và mọi thứ phía sau nó — cảnh báo, tín hiệu, lệnh — đều đã dừng.
  • Dòng 23 giúp tránh báo động giả. Sau reboot, MT5 luôn cần một lúc để đồng bộ lịch sử. Đừng đặt cảnh báo cho giai đoạn này.

5. Viết log cho EA: ba dòng bạn nên thêm ngay hôm nay

Đây là phần có giá trị cao nhất trong bài, vì nó biến log từ "không có gì" thành "trả lời được mọi câu hỏi".

Log tồi và log tốt — nhìn là thấy khác biệt
Log tồi và log tốt — nhìn là thấy khác biệt

Nguyên tắc: mỗi dòng log phải trả lời được bốn câu — ai, làm gì, kết quả nào, số đo bao nhiêu.

Log thứ nhất — nhịp tim và trạng thái. In định kỳ (mỗi 15 phút là đủ, đừng in mỗi tick):

mql5
// In mỗi 15 phút: chứng minh EA còn sống, kèm trạng thái để so sánh về sau
void LogNhipTim()
{
   static datetime lanInCuoi = 0;
   if(TimeLocal() - lanInCuoi < 900) return;   // 900 giây = 15 phút
   lanInCuoi = TimeLocal();

   PrintFormat("HB tick=%s lenh=%d equity=%.2f margin=%.1f%% spread=%d",
      TimeToString(TimeCurrent(), TIME_MINUTES | TIME_SECONDS),
      PositionsTotal(),
      AccountInfoDouble(ACCOUNT_EQUITY),
      AccountInfoDouble(ACCOUNT_MARGIN_LEVEL),
      (int)SymbolInfoInteger(_Symbol, SYMBOL_SPREAD));
}

Dòng này cho bạn thứ quan trọng nhất khi điều tra: dấu vết cuối cùng trước khi im lặng. Khi bot chết, dòng cuối cùng này cho biết nó đang ở trạng thái nào.

Log thứ hai — tín hiệu và bước ra quyết định. Không phải in kết quả, mà in lý do:

mql5
// Khi có tín hiệu, in ra đầy đủ lý do — kể cả khi tín hiệu bị chặn
void LogTinHieu(bool coTinHieu, string lyDoChan)
{
   if(coTinHieu)
      PrintFormat("SIGNAL %s %s | spread=%d | gia=%.5f",
         (TinHieuMua() ? "buy" : "sell"), _Symbol,
         (int)SymbolInfoInteger(_Symbol, SYMBOL_SPREAD), SymbolInfoDouble(_Symbol, SYMBOL_ASK));
   else
      PrintFormat("NO-SIGNAL ly-do=%s | spread=%d | gio=%s",
         lyDoChan, (int)SymbolInfoInteger(_Symbol, SYMBOL_SPREAD),
         TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES));
}

Dòng NO-SIGNAL là dòng cứu bạn khỏi việc chẩn đoán sai. Nếu log đầy dòng NO-SIGNAL ly-do=spread suốt ba ngày, bạn biết ngay vấn đề nằm ở bộ lọc spread — không phải ở chiến lược, không phải ở mạng.

Log thứ ba — kết quả gửi lệnh, kèm mã trả về và độ trễ. Đây là dòng bạn sẽ đọc nhiều nhất:

mql5
// Ghi kết quả gửi lệnh — phải log CẢ trường hợp thành công
bool GuiLenhVaGhiLog(ENUM_ORDER_TYPE loai, double kl, double gia, double sl, double tp)
{
   MqlTradeRequest  req; MqlTradeResult res;
   ZeroMemory(req); ZeroMemory(res);
   req.action = TRADE_ACTION_DEAL; req.symbol = _Symbol; req.volume = kl;
   req.type = loai; req.price = gia; req.sl = sl; req.tp = tp;
   req.deviation = 20; req.magic = 20260913; req.comment = "FindMe";

   uint t0 = GetTickCount();
   if(!OrderSend(req, res))
   {
      // Thất bại: log ĐẦY ĐỦ tham số đã gửi → mới tìm ra nguyên nhân
      PrintFormat("REJECT retcode=%d (%s) | kl=%.2f gia=%.5f sl=%.5f tp=%.5f | tick=%dms",
         res.retcode, LoiThanhCong(res.retcode), kl, gia, sl, tp, (int)(GetTickCount() - t0));
      return(false);
   }
   // Thành công cũng phải log — không có dòng này thì không biết lệnh đã đi hay chưa
   PrintFormat("SEND %s %.2f %s @%.5f sl=%.5f tp=%.5f | retcode=%d order=%I64u | tick=%dms",
      (loai == ORDER_TYPE_BUY ? "BUY" : "SELL"), kl, _Symbol, gia, sl, tp,
      res.retcode, res.order, (int)(GetTickCount() - t0));
   return(true);
}

// Đổi mã lỗi thành chữ để đọc log là hiểu ngay
string LoiThanhCong(uint rc)
{
   switch(rc)
   {
      case 10009: return "done";
      case 10004: return "requote";
      case 10006: return "rejected";
      case 10013: return "invalid request";
      case 10014: return "invalid volume";
      case 10015: return "invalid price";
      case 10016: return "invalid stops";
      case 10018: return "market closed";
      case 10019: return "no money";
      default:    return "khac";
   }
}

Ba điểm đáng chú ý trong đoạn code này:

  • Log cả trường hợp thành công. Nhiều người chỉ log lỗi. Nhưng khi bạn cần biết "lệnh cuối cùng gửi lúc nào", chỉ log thành công mới trả lời được — và đây chính là mốc thời gian quan trọng nhất khi điều tra.
  • Log độ trễ (`tick=%dms`). Độ trễ tăng dần là dấu hiệu sớm của vấn đề mạng hoặc tài nguyên. Bạn sẽ thấy nó trước khi mọi thứ sập.
  • Log toàn bộ tham số đã gửi khi bị từ chối. Lỗi 130 (invalid stops) chỉ chẩn đoán được nếu bạn biết giá trị sl đã gửi và khoảng cách tới giá. Không có số, bạn phải tái hiện lại bằng tay.

6. Sáu dòng log cần cảnh báo tự động

Khi log đã có nội dung tốt, bước tiếp theo là đừng đọc nó bằng mắt nữa. Một script nhỏ đọc file log, khớp mẫu, đếm số lần trong cửa sổ thời gian, và báo động — không cần API, không cần dịch vụ nào.

Sáu dòng log nên đặt cảnh báo tự động
Sáu dòng log nên đặt cảnh báo tự động
Dòng log cần bắtNgưỡng cảnh báoMức
no connection / network error2 lần trong 5 phútCao
authorization failed / invalid account1 lầnCao
expert removed / cannot load expert1 lầnCao
trade is not allowed (4109)1 lầnCao
invalid stops (130) / invalid volume (131)3 lần trong 10 phútTrung bình
not enough money (134)1 lầnCao

Điểm cần chú ý về ngưỡng: một số dòng là "1 lần là báo", một số khác thì không. requote xảy ra một lần là chuyện bình thường — báo động vì nó sẽ khiến bạn nhờn cảnh báo. Nhưng expert removed xảy ra một lần là EA đã rời chart, và toàn bộ hệ thống của bạn đã ngừng làm việc. Phân biệt hai loại này là điều kiện để hệ thống cảnh báo còn đáng tin sau vài tuần.

Một ví dụ script đọc log bằng PowerShell, chạy mỗi 5 phút:

powershell
# canh-log-mt5.ps1 — đọc log EA, khớp mẫu, báo động khi vượt ngưỡng
$logFile = "C:\MT5\MQL5\Logs"           # MT5 ghi log theo ngày: AAAAMMDD.log
$trangThai = "C:\MT5\canh-log-trangthai.json"

$homNay = Get-Date -Format "yyyyMMdd"
$fileLog = Join-Path $logFile "$homNay.log"
if (!(Test-Path $fileLog)) { Write-Output "Chưa có log hôm nay"; exit 0 }

# Các mẫu cần bắt: tên → (mẫu regex, số lần tối đa, cửa sổ phút)
$mau = @{
  "mat-ket-noi"    = @{ Re = "no connection|network error";             SoLan = 2;  Phut = 5  }
  "sai-tai-khoan"  = @{ Re = "authorization failed|invalid account";    SoLan = 1;  Phut = 60 }
  "ea-bi-go"       = @{ Re = "expert removed|cannot load expert";       SoLan = 1;  Phut = 60 }
  "khong-duoc-phep"= @{ Re = "trade is not allowed|4109";               SoLan = 1;  Phut = 60 }
  "stops-volume"   = @{ Re = "invalid stops|invalid volume|retcode=130|retcode=131"; SoLan = 3; Phut = 10 }
  "thieu-margin"   = @{ Re = "not enough money|retcode=134";            SoLan = 1;  Phut = 60 }
}

$dong = Get-Content $fileLog -Tail 2000
foreach ($ten in $mau.Keys) {
  $m = $mau[$ten]
  $khop = $dong | Where-Object { $_ -match $m.Re }
  if ($khop.Count -ge $m.SoLan) {
    Write-Output "CANH BAO [$ten] $($khop.Count) lan trong $($m.Phut) phut"
    # Gọi hàm gửi Telegram/Email ở đây
  }
}

Script này cố tình đơn giản: nó không có trạng thái, không có database, chỉ đọc 2.000 dòng cuối và đếm. Với cảnh báo theo log, đơn giản là một đức tính — vì bạn cần nó hoạt động trong lúc mọi thứ khác đang hỏng.

7. Phân biệt lỗi ở tầng nào để không sửa sai

Một sai lầm tốn thời gian phổ biến: thấy lỗi giao dịch rồi đi sửa EA, trong khi nguyên nhân nằm ở tài khoản. Bảng dưới đây phân loại nhanh theo tầng.

TầngDấu hiệu trong logSửa ở đâu
Sàn / tài khoản130, 131, 134, 148, 4108, 4109, 4110Tham số lệnh, khối lượng, giới hạn tài khoản
Mạng / kết nốino connection, network error, timeout, 138Hạ tầng VPS, mạng, DNS, vị trí đặt VPS
Terminalexpert removed, cannot load expert, terminal startedProfile, cấu hình đăng nhập, AutoTrading
Máy / hệ điều hànhKhông có log nào, Event Viewer có 41/6008/1074RAM, ổ đĩa, Windows Update, Scheduled Task
Logic EAarray out of range, zero divide, NO-SIGNAL liên tụcCode EA, tham số, bộ lọc điều kiện

Nguyên tắc đọc bảng này: nếu lỗi thuộc tầng sàn hoặc tầng logic, sửa EA cũng vô ích — bạn cần sửa tham số hoặc điều kiện. Nếu lỗi thuộc tầng máy, EA không có lỗi gì cả và bạn đang tìm ở sai chỗ.

Một chi tiết thực tế: lỗi 138 (requote) không phải lỗi của bạn. Nó là tín hiệu mạng chậm hoặc thị trường đang biến động nhanh. Đừng đi tối ưu logic EA vì requote — hãy thêm retry và xem xét vị trí đặt VPS so với server broker.

8. Quản lý file log: giữ bao lâu và mất log khi nào

Log MT5 có vòng đời riêng và có ba cạm bẫy khiến bạn mất log đúng lúc cần nhất.

Cạm bẫy 1 — log chỉ giữ trong thời gian ngắn. Theo mặc định, MT5 giới hạn số ngày lưu log (thường 7 ngày cho Journal, và file theo ngày trong thư mục Logs). Nếu sự cố xảy ra và bạn chỉ phát hiện sau hai tuần, log có thể đã bị xoá. Nếu bạn dùng log để đối chiếu hiệu suất theo tháng, hãy tự lưu bản sao.

Cạm bẫy 2 — ổ đĩa đầy làm log im lặng. Đây là cạm bẫy khó thấy nhất: khi ổ đĩa gần đầy, MT5 có thể không ghi được log mới. Bạn sẽ thấy hiện tượng "log dừng ở giữa" và tưởng EA đã chết — trong khi EA có thể vẫn chạy. Hãy đặt ngưỡng cảnh báo cho dung lượng ổ đĩa ở 80%, đừng đợi tới khi máy báo đỏ.

Cạm bẫy 3 — file log của EA ghi đè lẫn nhau. Nếu bạn chạy nhiều EA cùng ghi vào một file, nội dung sẽ xen kẽ và khó đọc. Hãy cho mỗi EA một file riêng, tên file có tên EA hoặc tên tài khoản.

Thực hành khuyến nghị:

  • Giữ log 30 ngày, có script dọn log cũ hơn 30 ngày.
  • Ghi log quan trọng (sự kiện bất thường, lệnh bị từ chối) vào một file riêng, không bị xoá theo ngày.
  • Đặt tên file log có ngày tháng để tìm nhanh: canh-20260913.log.
  • Sao lưu log ra ngoài VPS định kỳ. Log nằm trong VPS có ích khi VPS còn sống; khi VPS chết, log chết theo — và đó lại đúng là lúc bạn cần log nhất.

9. Thực hành: chẩn đoán ba ca bệnh thật

Ca 1 — "Bot không vào lệnh suốt hai ngày." Log Experts đầy dòng NO-SIGNAL ly-do=spread với spread=38, trong khi bộ lọc đặt ngưỡng 25. Đọc log là biết ngay: bộ lọc quá chặt so với spread thật của symbol trong khung giờ đó. Việc cần làm không phải sửa logic, mà xem lại ngưỡng — dựa trên dữ liệu spread đã ghi, không dựa trên cảm giác.

Ca 2 — "Bot chạy tới 3 giờ sáng rồi im." Log Experts dừng đột ngột giữa một chuỗi dòng bình thường. Tab Trade không có lệnh bị từ chối. Journal có dòng terminal started lúc 5 giờ 12 phút. Event Viewer có mã 1074 lúc 5 giờ 10 phút. Kết luận: Windows Update khởi động lại máy lúc 5 giờ sáng, MT5 bị đóng, và không tự mở lại. Không có lỗi nào trong EA — vấn đề hoàn toàn ở tầng máy.

Ca 3 — "Có lệnh nhưng lệnh vào sai khối lượng." Log Trade cho thấy lệnh được gửi với khối lượng 0.13 trên một symbol yêu cầu bước 0.01 nhưng tối đa 0.10 cho tài khoản nhỏ. Lỗi trả về 131 xuất hiện ba lần, sau đó EA tự giảm khối lượng và thành công. Nhìn vào log, bạn thấy rõ nguyên nhân: khối lượng tính từ số tiền mà không chuẩn hoá theo VOLUME_MAX của symbol.

Điểm chung của cả ba ca: không ca nào chẩn đoán được nếu EA không ghi log có nội dung. Ca 1 cần dòng NO-SIGNAL kèm lý do. Ca 2 cần mốc thời gian chính xác của dòng cuối. Ca 3 cần log cả tham số khi bị từ chối. Ba dòng log ở mục 5 chính là thứ tạo ra ba khả năng đó.

Ca 4 — "Bot chạy nhưng không có log nào cả"

Ca này đáng nói riêng vì nó khiến nhiều người mất cả buổi. Bạn mở tab Experts và thấy trống hoàn toàn, hoặc chỉ có vài dòng từ nhiều ngày trước. Bạn kết luận EA bị lỗi. Nhưng thứ tự chẩn đoán đúng phải là:

Bước 1 — EA có thật sự nằm trên chart không? Mở đúng chart, nhìn góc trên bên phải. Có biểu tượng tên EA không? Nếu không có, EA chưa từng được gắn — hoặc đã bị gỡ. Tab Experts trống vì không có gì để chạy, không phải vì EA lỗi.

Bước 2 — EA có được phép in log không? Trong MQL5, Print() ghi vào tab Experts, nhưng chỉ khi EA đang chạy. Nếu EA chạy mà không in gì, nguyên nhân đơn giản là code bạn không có lệnh Print() nào trong luồng thực thi. Đây là trường hợp phổ biến nhất, và nó không phải sự cố — nó là thiếu sót thiết kế.

Bước 3 — Bạn đang mở đúng file log chưa? Nếu EA ghi log ra file riêng (như khuyến nghị ở mục 8) thì tab Experts sẽ trống theo thiết kế. Hãy vào thư mục MQL5\Files hoặc MQL5\Logs và mở file bằng Notepad. Nhiều người tìm trong tab Experts và tưởng không có log, trong khi file log của họ đang phình ra hàng megabyte.

Bước 4 — Log có bị xoay vòng và mất không? MT5 ghi log theo ngày. Nếu bạn tìm log của hôm qua trong file hôm nay, bạn sẽ thấy nó trống. Kiểm tra tên file: AAAMMDD.log — đúng ngày bạn cần mới có nội dung.

Bước 5 — Ổ đĩa có đầy không? Như đã nói ở mục 8, ổ đĩa gần đầy có thể khiến MT5 ngừng ghi log mới trong khi vẫn tiếp tục chạy. Kiểm tra dung lượng trước khi kết luận EA có vấn đề.

Thứ tự năm bước này quan trọng: nó đi từ nguyên nhân đơn giản nhất (EA không ở trên chart) tới phức tạp nhất (lỗi code). Đi ngược lại — bắt đầu bằng việc đọc code để tìm lỗi — là cách tốn thời gian nhất, vì bạn có thể đang tìm bug trong một EA hoàn toàn không chạy.

Một thói quen nhỏ đáng làm: mở log trước khi ngủ

Nếu bạn chạy bot qua đêm, hãy tạo thói quen mở tab Experts và tab Trade đúng một lần trước khi đi ngủ. Việc này mất 20 giây và cho bạn một thứ rất có giá trị: trạng thái nền của một hệ thống đang hoạt động bình thường.

Kiến thức về "bình thường" là thứ bạn không thể có nếu chỉ đọc log khi có sự cố. Khi biết log bình thường trông như thế nào — dòng nhịp tim nào xuất hiện, mật độ bao nhiêu dòng một giờ, RET xuất hiện ra sao — bạn sẽ nhận ra bất thường trong vòng vài giây thay vì phải so sánh với trí nhớ mơ hồ. Và vào đêm có sự cố, chính kiến thức đó là thứ giúp bạn trả lời nhanh câu hỏi: "dòng cuối cùng này có lạ không?"

10. Checklist 12 điểm

  1. Biết bốn loại log và mở đúng loại cho câu hỏi đang có
  2. EA có dòng log nhịp tim định kỳ (15 phút một lần là đủ)
  3. EA có dòng NO-SIGNAL kèm lý do bị chặn
  4. EA log cả trường hợp gửi lệnh thành công
  5. Khi bị từ chối, log có đầy đủ tham số đã gửi
  6. Mã trả về được dịch thành chữ đọc được
  7. Có log độ trễ (GetTickCount) để thấy vấn đề mạng sớm
  8. Mỗi EA ghi log vào file riêng
  9. Không ghi đè: file log có ngày hoặc tên EA
  10. Có script dọn log cũ và cảnh báo dung lượng ổ đĩa
  11. Có cảnh báo tự động cho ít nhất 4 dòng log ở mục 6
  12. Log quan trọng được sao lưu ra ngoài VPS

Bốn ý cần nhớ:

  1. Log là bằng chứng duy nhất, và nó chỉ hữu ích nếu bạn tự viết. MT5 không biết gì về logic của EA bạn.
  2. Đọc từ dòng cuối lên. Dòng cuối cùng là trạng thái lúc bot ngừng; đó là dòng quan trọng nhất trong cả file.
  3. Mỗi dòng log phải trả lời: ai, làm gì, kết quả nào, số đo bao nhiêu. Không có số thì không chẩn đoán được.
  4. Báo động theo log bổ sung cho báo động theo heartbeat. Heartbeat biết bot đã im lặng; log biết vì sao.

Nếu bạn muốn đi tiếp: Bot chết lúc 3h sáng: 12 nguyên nhân thật là bảng tra theo nguyên nhân (bài này là bảng tra theo dấu hiệu), và EA Watchdog: tự viết lớp canh chừng thứ hai hướng dẫn phần heartbeat mà log nhịp tim dựa vào.

Log không làm bot của bạn chạy tốt hơn. Nó chỉ làm bạn biết chuyện gì đã xảy ra — và đó là điều kiện đầu tiên để sửa được.
Đọc xong rồi? Hãy thử ngay — miễn phí 7 ngày.