MT5 treo nhưng vẫn "đang chạy": bốn trạng thái, cách đo đúng và ngưỡng theo loại bot
Có một sự cố mà mọi cách giám sát ngây thơ đều bỏ lỡ, và nó cũng là sự cố tốn kém nhất: MT5 vẫn "đang chạy" nhưng bot đã ngừng làm việc.
Cửa sổ terminal vẫn sáng. Bạn kéo được, click được, đóng mở chart được. terminal64.exe vẫn nằm trong Task Manager — RAM vài trăm MB, CPU gần 0%. Nút AutoTrading vẫn bật. Nếu bạn ping VPS, máy trả lời bình thường. Mọi chỉ số đều xanh.
Và bot đã ngừng vào lệnh từ ba tiếng trước.
Bài này đi vào đúng sự cố đó. Phần đầu là bốn trạng thái của một terminal và lý do vì sao chỉ có một ô trong đó là nguy hiểm. Phần giữa là sáu cách đo — hai cách hầu hết mọi người dùng, và bốn cách thật sự hoạt động. Phần sau là cách đặt ngưỡng theo loại bot (đặt sai là báo động giả liên tục, và báo động giả sẽ giết chết hệ thống cảnh báo của bạn), sáu nguyên nhân gây treo, và code cụ thể để đo tick cuối từ cả trong EA lẫn từ bên ngoài MT5.
1. Vì sao đây là sự cố khó phát hiện nhất
Hãy so sánh ba kiểu "chết" của bot theo mức độ khó phát hiện:
Kiểu dễ nhất — máy tắt hẳn. VPS không phản hồi, RDP không vào được. Bạn biết ngay. Bất kỳ dịch vụ ping nào cũng phát hiện. Không ai bỏ lỡ sự cố này.
Kiểu trung bình — MT5 biến mất. Terminal bị kill vì hết RAM, hoặc Windows khởi động lại và MT5 không tự mở lại. Cửa sổ không còn. Nếu bạn có mặt ở máy, bạn thấy ngay; nếu không, bạn biết khi có ai đó kiểm tra.
Kiểu khó nhất — MT5 treo. Cửa sổ còn, tiến trình còn, mọi chỉ số đều xanh, nhưng dữ liệu đứng im. Không có tín hiệu nào để nhận ra nếu bạn không chủ động kiểm tra thời điểm tick cuối cùng.
Điểm mấu chốt nằm ở chỗ này: hai kiểu đầu khác nhau về "máy có sống không". Kiểu thứ ba giống hệt kiểu bình thường nếu bạn đo sai đối tượng. Và đó là lý do nó phổ biến hơn nhiều so với mức độ nguy hiểm mà người ta gán cho nó.
2. Bốn trạng thái của một terminal — chỉ một ô nguy hiểm
Nếu bạn phân loại trạng thái của bot theo hai trục — tiến trình còn sống hay đã chết và dữ liệu có tick mới hay không — bạn có bốn ô:
Ô 1 (tiến trình sống, tick mới): bình thường. Đây là trạng thái bạn muốn. Bot đang làm việc.
Ô 2 (tiến trình sống, tick cũ): TREO hoặc mất dữ liệu. Đây là ô nguy hiểm, và là chủ đề của cả bài này. Tất cả các phép kiểm tra kiểu "tiến trình còn sống không" đều rơi vào ô này và báo xanh.
Ô 3 (tiến trình chết, tick mới): vừa mới chết. Hiếm gặp, vì khi tiến trình chết thì tick dừng gần như ngay lập tức.
Ô 4 (tiến trình chết, tick cũ): đã chết. Dễ nhận ra nhất về mặt kỹ thuật, nhưng vẫn cần có ai đó kiểm tra.
Điều đáng chú ý: ba trong bốn ô đều là bất thường, nhưng chỉ có ô 2 là ô mà các phép đo phổ biến không phát hiện được. Vì thế khi thiết kế giám sát, câu hỏi đúng không phải "làm sao biết MT5 có chạy không", mà là "làm sao phân biệt được ô 1 với ô 2". Trả lời câu hỏi đó chính là trả lời mọi thứ.
3. Sáu cách đo — hai cách sai và vì sao
Ping VPS. Máy vẫn sống khi MT5 treo, nên ping luôn báo xanh. Ping chỉ hữu ích để phát hiện "VPS tắt hoàn toàn" — một trạng thái khác, và là trạng thái duy nhất mà lớp giám sát từ bên ngoài cần tới. Đừng nhầm ping với giám sát bot.
Kiểm tra tiến trình `terminal64.exe`. Đây là cách phổ biến nhất, và là cái bẫy chính. Khi MT5 treo, tiến trình vẫn tồn tại — đó chính là định nghĩa của treo. Phép kiểm tra này báo xanh trong suốt thời gian bot đã chết, và tai hại hơn: nó cho bạn cảm giác an toàn sai. Bạn tin rằng mình đã có giám sát, nên bạn không xây thêm lớp nào khác.
Kiểm tra AutoTrading. Trong trạng thái treo, cờ TERMINAL_TRADE_ALLOWED thường vẫn là true, vì nó chỉ phản ánh nút bấm, không phản ánh việc dữ liệu có đang chảy hay không. Cũng vô dụng.
Thời điểm tick cuối (`TimeCurrent`). Đây là cách đúng đầu tiên, và là cách đơn giản nhất: so sánh tick cuối với giờ hiện tại. Khi MT5 treo, TimeCurrent() đứng im — không tăng. Nếu khoảng cách vượt ngưỡng, bạn có sự cố.
Heartbeat do EA ghi bằng `OnTimer`. Cách đúng thứ hai, và chính xác hơn: OnTimer chạy theo đồng hồ hệ thống nên vẫn phát nhịp khi thị trường đóng, khi mất dữ liệu, và khi không có tick. Nếu heartbeat ngừng, bạn biết EA hoặc terminal đã dừng. Nếu heartbeat vẫn chạy nhưng dữ liệu đứng, bạn biết đó là mất kết nối. Chi tiết cách viết xem ở bài EA Watchdog.
Log EA có dòng mới. Hoạt động tốt, nhưng chỉ khi EA của bạn có ghi log. Đây là lý do bài về log nhấn mạnh việc tự thêm log vào EA.
Còn một chỉ số nữa đáng dùng như cảnh báo sớm: độ trễ gửi lệnh. Nếu bạn đo thời gian từ lúc gọi OrderSend tới lúc có kết quả, độ trễ tăng dần theo thời gian là dấu hiệu của vấn đề mạng hoặc tài nguyên — trước khi mọi thứ treo hẳn. Đây là chỉ số duy nhất trong danh sách có thể báo trước sự cố, thay vì báo sau.
4. Heartbeat: định nghĩa đúng của "bot còn sống"
Từ phân tích trên, định nghĩa đúng nên là:
Bot còn sống khi có dấu hiệu hoạt động mới trong khoảng thời gian chấp nhận được — đo bằng dữ liệu, không đo bằng sự tồn tại.
Cụ thể: "Có tick mới trong vòng 60 giây" (trong phiên giao dịch) và "EA có ghi nhịp heartbeat trong vòng 60 giây".
Cần cả hai điều kiện vì chúng bắt hai loại sự cố khác nhau:
- Chỉ có heartbeat, không có tick mới → EA sống, nhưng mất kết nối dữ liệu (hoặc thị trường đóng).
- Không có heartbeat, không có tick mới → EA dừng, terminal treo, hoặc bị kill.
Đây là lý do trong hướng dẫn viết heartbeat, ta ghi cả TimeLocal() (mốc sống của máy) và TimeCurrent() (tick cuối) vào cùng một dòng log. Chỉ với hai con số đó, watchdog phân biệt được hai trường hợp và bạn biết phải sửa gì.
Và cần nói rõ một điều mà nhiều người bỏ qua: định nghĩa này phải được viết vào code, không chỉ nằm trong đầu bạn. Nếu bạn không tự động kiểm tra nó, thì trên thực tế định nghĩa của bạn là "bot còn sống nếu không có ai phàn nàn" — và điều đó chỉ đúng cho tới lần đầu tiên có chuyện.
5. Ngưỡng theo loại bot — đặt sai là báo động giả
Ngưỡng là chỗ mà việc giám sát thành công hay thất bại. Ba nguyên tắc:
Nguyên tắc 1 — Ngưỡng phụ thuộc vào tần suất tick của symbol và khung thời gian. Với XAUUSD trong phiên Âu–Mỹ, tick đến nhiều lần mỗi giây, nên ngừng 30 giây đã là bất thường. Với một cặp tiền ít biến động ngoài phiên, tick có thể thưa tự nhiên. Ngưỡng phải theo thực tế đo được, không theo cảm giác.
Nguyên tắc 2 — Phải có bộ lọc theo phiên giao dịch. Đây là yếu tố quan trọng nhất và cũng bị bỏ qua nhiều nhất. Nếu không lọc, bạn sẽ nhận cảnh báo mỗi cuối tuần, mỗi đêm, mỗi ngày lễ — và sau hai tuần bạn sẽ bắt đầu bỏ qua chúng. Báo động giả không phải chuyện nhỏ: nó phá hủy giá trị của hệ thống cảnh báo.
Nguyên tắc 3 — Bắt đầu rộng, siết dần theo dữ liệu. Đây là cách duy nhất để tìm ngưỡng đúng. Cách làm cụ thể:
- Đặt ngưỡng rộng (ví dụ 90 giây) và bật cảnh báo.
- Ghi lại số lần báo trong một tuần, kèm lý do mỗi lần.
- Với mỗi lần báo, xác định: đó là sự cố thật, hay là trạng thái bình thường của thị trường?
- Thu hẹp ngưỡng chỉ khi loại được trạng thái bình thường tương ứng (ví dụ thêm lọc phiên).
Sai lầm phổ biến ở bước 4 là siết ngưỡng để giảm số lần báo, thay vì thêm bộ lọc. Hai việc này khác nhau: siết ngưỡng làm bạn phát hiện sự cố thật chậm hơn; thêm bộ lọc làm bạn phát hiện đúng hơn mà không chậm đi.
Một lưu ý về thời điểm chỉnh ngưỡng: đừng bao giờ chỉnh vào cuối tuần hoặc ngoài phiên. Lúc đó tick luôn cũ vì lý do bình thường, và bạn sẽ siết ngưỡng vì một hiện tượng không liên quan đến sự cố. Hãy chỉnh trong phiên, khi bạn biết dữ liệu phải đang chảy.
6. Sáu nguyên nhân gây treo
Hiểu nguyên nhân giúp bạn biết mình có thể chặn được gì. Sáu nguồn dưới đây xếp theo mức độ phổ biến:
Nguyên nhân 1 — Mất kết nối tới server dữ liệu. MT5 giữ kết nối tới server giao dịch nhưng mất kết nối tới nguồn giá. Cửa sổ vẫn hiển thị, nhưng nến cuối cùng không cập nhật. Đây là nguyên nhân phổ biến nhất, và cũng là nguyên nhân "lành" nhất: khi mạng trở lại, MT5 thường tự phục hồi.
Nguyên nhân 2 — Một indicator chặn luồng xử lý. Một chỉ báo lỗi có thể chiếm luồng tính toán và khiến OnTick không bao giờ được gọi cho các EA khác trên cùng chart. Dấu hiệu: chỉ một số chart bị đứng, các chart khác vẫn chạy.
Nguyên nhân 3 — EA gọi thư viện bên ngoài và bị treo. Nếu EA dùng DLL để gọi API ngoài (lấy dữ liệu, gửi HTTP), một lệnh gọi không có timeout có thể treo EA vô thời hạn. Đây là lý do mọi lệnh gọi mạng phải có timeout.
Nguyên nhân 4 — Terminal đang đồng bộ lịch sử. Sau khi mở symbol mới hoặc sau reboot, MT5 tải lịch sử. Trong vài phút đó, chart có thể đứng và dữ liệu chưa chảy. Đây là giai đoạn cần loại trừ khỏi cảnh báo, nếu không bạn sẽ có báo động giả ngay sau mỗi lần khởi động.
Nguyên nhân 5 — Tài nguyên cạn dần. Hết RAM, ổ đĩa đầy, hoặc số handle file vượt giới hạn. Trong các trường hợp này, terminal không chết ngay mà trở nên chậm dần rồi đứng. Dấu hiệu sớm: độ trễ gửi lệnh tăng, thời gian phản hồi khi mở chart tăng.
Nguyên nhân 6 — Broker bảo trì hoặc đổi server. Một số trường hợp broker ngừng cung cấp dữ liệu trong vài phút để cập nhật, hoặc đổi địa chỉ server. MT5 sẽ đứng im cho tới khi kết nối lại được.
Trong sáu nguyên nhân này, chỉ nguyên nhân 5 và 6 là bạn có thể hành động trước (đo tài nguyên, theo dõi thông báo của broker). Bốn nguyên nhân còn lại chủ yếu đòi hỏi phát hiện nhanh, vì việc khắc phục thường nằm ngoài tầm tay bạn — chờ mạng trở lại, chờ broker xong bảo trì.
Nguyên nhân 7 không nằm trong terminal: chính bộ giám sát của bạn
Có một nguyên nhân thứ bảy mà ít người nghĩ tới, vì nó không gây treo MT5 nhưng gây ra hậu quả giống hệt: bộ giám sát của bạn bị treo.
Hãy tưởng tượng hệ thống cảnh báo của bạn là một script chạy mỗi 30 giây qua Scheduled Task. Script đó cũng có thể: không chạy được (task bị vô hiệu), chạy nhưng lỗi câm (đọc file thất bại nhưng không báo), hoặc gửi cảnh báo thất bại (kênh Telegram bị chặn, token hết hạn). Trong cả ba trường hợp, MT5 của bạn có thể đã chết và không ai biết — dù bạn “có hệ thống giám sát”.
Cách phòng là áp dụng chính nguyên tắc của bài này cho bộ giám sát: nó phải tự chứng minh mình đang chạy. Cụ thể:
- Cho script giám sát ghi lại một dấu vết mỗi lần chạy (một dòng vào file, hoặc một giá trị thời gian).
- Kiểm tra dấu vết đó — theo cách thủ công nếu cần — vài ngày một lần. Nếu dấu vết cũ hơn vài giờ, bộ giám sát đã chết.
- Kiểm tra kênh cảnh báo bằng một cảnh báo giả theo lịch (ví dụ mỗi sáng Chủ nhật, khi thị trường đóng). Nếu bạn không nhận được nó, kênh đang tắc — và bạn biết điều đó vào một ngày không có giao dịch, thay vì phát hiện ra trong lúc bot đã chết ba tiếng.
Nguyên tắc chung đáng nhớ: một hệ thống giám sát không tự giám sát mình là một hệ thống bạn đang tin tưởng một cách miễn phí. Và niềm tin miễn phí là loại niềm tin dễ mất nhất — bạn chỉ mất nó vào đúng lúc bạn cần nó nhất.
7. Phân biệt ba kết cục: treo, mất dữ liệu, không có tín hiệu
Đây là phân biệt quan trọng nhất trong cả bài, vì ba kết cục này cần ba hành động khác nhau — và nếu chẩn đoán sai, bạn sẽ sửa sai chỗ.
| Kết cục | Heartbeat EA | Tick cuối | Dấu hiệu khác | Việc cần làm |
|---|---|---|---|---|
| Treo | Ngừng hoặc không có | Cũ | Cửa sổ vẫn hiển thị | Khởi động lại terminal |
| Mất dữ liệu | Vẫn đều | Cũ | Journal có no connection | Kiểm tra mạng, chờ broker |
| Không có tín hiệu | Vẫn đều | Mới | Log đầy dòng NO-SIGNAL | Xem lại bộ lọc điều kiện |
Ba dòng này là ba câu chuyện khác nhau:
Treo nghĩa là EA hoặc terminal đã dừng. Việc cần làm là khởi động lại — và với watchdog, bạn có thể tự động hoá.
Mất dữ liệu nghĩa là EA vẫn sống và vẫn tư duy, nhưng không nhận được giá. Việc cần làm không phải khởi động lại EA — vì nếu EA có lệnh đang mở, khởi động lại có thể làm mất trạng thái quản lý. Việc cần làm là kiểm tra mạng và chờ.
Không có tín hiệu nghĩa là mọi thứ kỹ thuật đều ổn; bot chạy hoàn hảo và không có gì để làm. Nếu bạn nhầm trường hợp này với hai trường hợp trên, bạn sẽ đi khởi động lại một hệ thống đang chạy đúng — và tự tạo ra sự cố.
Đây là lý do trong dòng log heartbeat nên ghi cả TimeLocal() và TimeCurrent(): chỉ với hai con số đó, ba trường hợp này tự phân biệt được mà không cần đọc thêm gì.
8. Phát hiện rồi thì làm gì
Có năm mức hành động, xếp theo mức độ can thiệp. Nguyên tắc: chỉ dùng mức cao nhất khi mức thấp hơn đã thất bại.
| Mức | Hành động | Rủi ro |
|---|---|---|
| 1 | Thông báo cho bạn, không can thiệp | Không có — luôn nên có |
| 2 | Thông báo lặp lại có leo thang nếu kéo dài | Báo nhiều quá gây nhờn |
| 3 | Nạp lại EA lên chart | Nạp sai chart → hai EA cùng chạy |
| 4 | Khởi động lại MT5 | Mất trạng thái EA đang quản lý lệnh |
| 5 | Khởi động lại VPS | Nặng tay nhất, ảnh hưởng mọi thứ trên máy |
Với trạng thái treo, mức 4 là hành động đúng trong đa số trường hợp — nhưng có một điều kiện quan trọng: kiểm tra trước xem có lệnh đang mở hay không. Nếu có, hãy cân nhắc trước khi khởi động lại, vì EA sẽ mất trạng thái quản lý. Cách an toàn hơn: dùng stop-loss đặt ở phía server cho mọi lệnh, để dù EA mất trạng thái, lệnh vẫn được bảo vệ.
Với trạng thái mất dữ liệu, mức 1 là đúng trong phần lớn trường hợp: MT5 tự kết nối lại khi mạng trở lại, và can thiệp có thể làm mọi thứ tệ hơn.
Với trạng thái không có tín hiệu, mức 0 — không làm gì — là đúng về mặt kỹ thuật. Nhưng bạn vẫn nên có cảnh báo cho trường hợp này ở mức thấp, vì "ba ngày không có tín hiệu" thường là dấu hiệu bạn đã thay đổi điều kiện thị trường hoặc tham số nào đó mà không nhận ra.
9. Quy trình chẩn đoán 5 bước
Bước 1 — Xem nến cuối cùng trên chart. Ghi lại thời điểm của nến cuối. Đây là mốc thời gian quan trọng nhất.
Bước 2 — Đối chiếu với giờ hiện tại. Nến cuối cũ hơn bao nhiêu? Nếu chỉ vài giây, không có vấn đề. Nếu hàng phút, đi tiếp.
Bước 3 — Có phải cuối tuần hoặc ngoài phiên không? Đây là bước hay bị bỏ qua nhất, và nó tiết kiệm 20 phút mỗi lần. Cuối tuần không có tick là bình thường. Nếu đúng là ngoài phiên, dừng lại — không có sự cố gì cả.
Bước 4 — Mở tab Journal tìm nguyên nhân. Tìm no connection, invalid account, network error. Nếu thấy một trong những dòng này, bạn đã biết đây là mất dữ liệu hoặc mất phiên đăng nhập, không phải treo.
Bước 5 — Kiểm tra heartbeat của EA còn hay không. Đây là bước phân biệt cuối cùng: nếu heartbeat ngừng, EA hoặc terminal đã dừng — đây là treo. Nếu heartbeat vẫn chạy, EA còn sống và vấn đề nằm ở dữ liệu hoặc ở điều kiện vào lệnh.
Sau năm bước, nếu mọi thứ đều bình thường, bạn đã loại được cả ba kết cục bất thường — và kết luận là trường hợp thứ ba: điều kiện vào lệnh không bao giờ tới. Đó không phải sự cố kỹ thuật mà là vấn đề cấu hình, và việc cần làm nằm ở bài về bộ lọc và log NO-SIGNAL.
Biến quy trình thành một lệnh duy nhất
Năm bước trên là quy trình cho lần đầu, khi bạn còn đang học cách phân biệt ba kết cục. Nhưng sau vài lần, bạn sẽ thấy mình luôn đi qua đúng một chuỗi — và lúc đó nên gom lại thành một lệnh duy nhất để chạy mỗi khi nghi ngờ, thậm chí để chạy tự động mỗi giờ.
Một lệnh gom đủ năm bước sẽ in ra một khối thông tin dạng này:
=== KIỂM TRA TRẠNG THÁI BOT — 13/09/2026 03:07:41 ===
Nhịp heartbeat cuối : 03:07:12 (cũ 29 giây)
Tick cuối : 03:07:10 (cũ 31 giây)
Lệnh đang mở : 1
Phân loại : BÌNH THƯỜNGVà khi có sự cố, nó sẽ trông như thế này:
=== KIỂM TRA TRẠNG THÁI BOT — 13/09/2026 06:41:02 ===
Nhịp heartbeat cuối : 03:07:12 (cũ 11630 giây)
Tick cuối : 03:07:10 (cũ 11632 giây)
Lệnh đang mở : 1
Phân loại : TREO — EA hoặc terminal đã dừngGiá trị thật của việc gom thành một lệnh không nằm ở tốc độ, mà ở tính nhất quán. Khi bạn phải nhớ năm bước và làm bằng tay, bạn sẽ bỏ qua bước nào đó đúng vào lúc đang sốt ruột — và bước hay bị bỏ qua nhất là bước 3 (kiểm tra cuối tuần) và bước 5 (kiểm tra heartbeat). Đó cũng chính là hai bước phân biệt ba kết cục.
Định dạng khối thông tin trên có một quy tắc nhỏ nhưng quan trọng: luôn in "cũ bao nhiêu giây" bên cạnh mỗi mốc thời gian, đừng chỉ in mốc. Vì khi bạn đọc lúc 3 giờ sáng, bạn không muốn phải tự tính xem 03:07:12 cách hiện tại bao lâu — bạn muốn con số đã được tính sẵn. Việc nhỏ này quyết định bạn mất 5 giây hay 30 giây cho mỗi lần kiểm tra.
Thử nghiệm: tự tạo một lần treo để kiểm chứng
Sau khi làm xong các bước trên, hãy tự tạo một lần treo thật — vì hệ thống giám sát chưa được kiểm thử là hệ thống bạn không biết có hoạt động hay không.
Cách tạo treo an toàn nhất là ngắt mạng, không phải kill tiến trình: disable card mạng của VPS trong 60–90 giây rồi bật lại. Cách này mô phỏng đúng nguyên nhân số 1 và không làm mất trạng thái nào của EA.
Khi ngắt mạng, bạn sẽ thấy một trong hai kết quả:
- Heartbeat vẫn phát, tick đứng lại. Hệ thống phân loại đúng thành "MẤT DỮ LIỆU". Đây là kết quả mong đợi và chứng minh rằng bạn đang đo đúng hai mốc thời gian khác nhau.
- Cả heartbeat và tick đều đứng. Điều này có nghĩa là heartbeat của bạn đang phát trong
OnTickchứ không phải trongOnTimer— và đó là lỗi cần sửa trước khi làm bất cứ việc gì khác.
Sau khi bật mạng trở lại, MT5 thường tự kết nối lại trong vòng vài chục giây. Hãy ghi lại khoảng thời gian đó: nó cho bạn biết thời gian phục hồi tự động của hệ thống mình, và đó là con số bạn sẽ dùng để chọn ngưỡng cảnh báo cho các lần sau. Nếu phục hồi mất 90 giây mà ngưỡng cảnh báo của bạn là 60 giây, bạn sẽ nhận một cảnh báo mỗi lần mạng chớp — và sau vài tuần bạn sẽ học cách bỏ qua chúng.
10. Code: đo tick cuối từ trong EA và từ ngoài MT5
Từ trong EA — ghi lại cả hai mốc thời gian. Đây là nền tảng của mọi thứ trong bài này:
// Gọi trong OnTimer của EA (không phải chỉ trong OnTick)
void GhiHaiMocThoiGian()
{
datetime gioMay = TimeLocal(); // mốc SỐNG của máy — luôn chạy
datetime gioTick = TimeCurrent(); // tick cuối — đứng im khi mất dữ liệu
// Ghi vào file để đọc được TỪ NGOÀI MT5 (PowerShell, Agent, dịch vụ cloud)
int h = FileOpen("findme_nhip.txt", FILE_WRITE | FILE_TXT | FILE_ANSI);
if(h == INVALID_HANDLE) { PrintFormat("FileOpen lỗi %d", GetLastError()); return; }
FileWriteString(h, StringFormat("%d|%d|%d|%.2f", (int)gioMay, (int)gioTick,
PositionsTotal(), AccountInfoDouble(ACCOUNT_EQUITY)));
FileClose(h);
}
// Gọi trong OnTick — đo độ trễ thật của đường vào lệnh (cảnh báo sớm)
void DoDoTre()
{
static uint lanGoiCuoi = 0;
uint bayGio = GetTickCount();
if(lanGoiCuoi > 0)
{
uint khoang = bayGio - lanGoiCuoi;
if(khoang > 10000) // tick thưa hơn 10 giây trong phiên → bất thường
PrintFormat("CANH BAO tick thua: %d ms ke tu tick truoc", khoang);
}
lanGoiCuoi = bayGio;
}Từ ngoài MT5 — đọc file và phân loại ba kết cục. Script dưới đây đọc file trên, so cả hai mốc thời gian, và tự phân loại:
// Bản MQL5 của bộ phân loại — dùng khi watchdog chạy trong cùng terminal
// (bản PowerShell tương đương ở mục 8 của bài EA Watchdog)
string PhanLoaiTrangThai(int tickTreGiay, int nhipTreGiay)
{
if(nhipTreGiay > 90) return "TREO - EA hoac terminal da dung";
if(tickTreGiay > 120 && nhipTreGiay <= 90) return "MAT DU LIEU - EA song, khong co gia";
if(tickTreGiay > 120 && nhipTreGiay > 90) return "TAT CA DEU DUNG - kiem tra may";
return "BINH THUONG";
}Và một script PowerShell đọc đúng file đó, dùng cho lớp giám sát ngoài MT5:
# doc-nhip-mt5.ps1 — đọc file nhịp, phân loại, in ra kết luận
$f = "C:\MT5\MQL5\Files\findme_nhip.txt"
if (!(Test-Path $f)) { Write-Output "Không thấy file nhịp — MT5 chưa chạy lần nào?"; exit 1 }
$p = (Get-Content $f -Raw).Trim() -split '\|'
$gioMay = [int]$p[0]; $gioTick = [int]$p[1]; $soLenh = [int]$p[2]
$now = [DateTimeOffset]::Now.ToUnixTimeSeconds()
$nhipTre = $now - $gioMay
$tickTre = $now - $gioTick
# Lọc cuối tuần: chỉ áp dụng cho việc đánh giá TICK, không áp dụng cho NHỊP
$cuoiTuan = (Get-Date).DayOfWeek -in @('Saturday','Sunday')
switch ($true) {
{ $nhipTre -gt 90 } { "TREO — nhịp cũ $nhipTre giây, $soLenh lệnh đang mở"; break }
{ $tickTre -gt 120 -and -not $cuoiTuan } { "MẤT DỮ LIỆU — nhịp mới, tick cũ $tickTre giây"; break }
{ $tickTre -gt 120 -and $cuoiTuan } { "Cuối tuần — tick cũ là bình thường"; break }
default { "BÌNH THƯỜNG ($soLenh lệnh đang mở)" }
}Hai chi tiết trong script này đáng chú ý:
- Bộ lọc cuối tuần chỉ áp dụng cho tick, không áp dụng cho nhịp. Đây chính là điểm đã nói ở mục 5: cuối tuần không có tick là bình thường, nhưng EA vẫn phải sống. Nếu bạn tắt toàn bộ kiểm tra vào cuối tuần, bạn sẽ không biết EA đã chết từ tối thứ Sáu cho tới sáng thứ Hai.
- In ra số lệnh đang mở. Vì đó là thông tin bạn cần để quyết định có nên khởi động lại hay không: 0 lệnh thì an toàn hơn nhiều so với 3 lệnh đang mở.
11. Checklist và tóm lại
Checklist 10 điểm cho việc phát hiện treo:
- Đã bỏ mọi phép kiểm tra chỉ dựa vào "tiến trình còn sống không"
- Có phép đo thời điểm tick cuối và so với giờ hiện tại
- EA có ghi heartbeat bằng
OnTimer, không chỉ bằngOnTick - Dòng nhịp ghi cả
TimeLocal()vàTimeCurrent() - Ngưỡng được đặt theo loại bot, không dùng một ngưỡng chung
- Có bộ lọc phiên giao dịch (bỏ ngoài giờ, cuối tuần)
- Bộ lọc cuối tuần không tắt kiểm tra heartbeat
- Có phân biệt ba kết cục: treo / mất dữ liệu / không có tín hiệu
- Cảnh báo có kèm số lệnh đang mở (để quyết định có khởi động lại)
- Đã thử tắt tick thật (ngắt mạng 60 giây) và xem hệ thống phân loại đúng
Bốn ý cần nhớ:
- Treo là ô mà mọi phép kiểm tra phổ biến đều báo xanh. Tiến trình còn sống, AutoTrading còn bật, ping còn trả lời — tất cả đều không nói gì về việc bot có đang làm việc.
- Đo dữ liệu, không đo sự tồn tại. Định nghĩa đúng: có tick mới và có nhịp heartbeat trong khoảng thời gian chấp nhận được.
- Ba kết cục cần ba hành động khác nhau. Khởi động lại MT5 là đúng với treo, sai với mất dữ liệu, và tai hại với "không có tín hiệu".
- Bộ lọc phiên quan trọng ngang ngưỡng. Báo động giả sẽ phá hủy giá trị của hệ thống cảnh báo nhanh hơn bất cứ điều gì khác.
Nếu bạn muốn đi tiếp: EA Watchdog: tự viết lớp canh chừng thứ hai hướng dẫn đầy đủ phần heartbeat và hành động, Đọc log MT5 để tìm nguyên nhân là bảng tra 25 dòng log, còn Bot chết lúc 3h sáng: 12 nguyên nhân thật là bảng tra theo nguyên nhân.
Cửa sổ còn sáng không có nghĩa là bot còn làm việc. Chỉ có dữ liệu mới trả lời được câu đó.