Bot chết lúc 3h sáng: 12 nguyên nhân thật trên VPS Windows và cách chặn từng cái
Hướng dẫn13/09/2026 · 26 phút đọc

Bot chết lúc 3h sáng: 12 nguyên nhân thật trên VPS Windows và cách chặn từng cái

Bạn mở máy lúc 7 giờ sáng. MT5 vẫn nằm đó, cửa sổ vẫn sáng, chart vẫn hiện nến. Nhưng lệnh cuối cùng là lúc 03:07. Sau đó không có gì nữa — không lệnh vào, không log, không cảnh báo. Bot của bạn đã "chết" từ bốn tiếng trước, và không ai biết.

Đây là kiểu sự cố tệ nhất trong vận hành bot, không phải vì nó hiếm, mà vì nó im lặng. Một lệnh thua bạn biết ngay. Một cái chết im lặng thì bạn chỉ biết khi đã quá muộn: đêm đó thị trường chạy đúng kịch bản của bạn, và bot không có mặt.

Bài này đi qua 12 nguyên nhân thật khiến bot trading ngừng làm việc trên VPS Windows, chia theo ba tầng: tầng máy, tầng terminal, và tầng logic. Với mỗi nguyên nhân, bạn sẽ có ba thứ: dấu hiệu nhận biết, lý do xảy ra, và cách chặn cụ thể. Cuối bài có bảng chẩn đoán nhanh, checklist 20 điểm trước khi đi ngủ, và một kế hoạch 7 ngày để dựng hệ thống phòng ngừa.

Một điều cần nói trước: phần lớn nội dung dưới đây không cần mua gì. Bạn có thể tự dựng bằng Task Scheduler, một script PowerShell, và log của MT5. Nhưng trước hết, hãy hiểu vì sao chuyện này lại hay xảy ra vào ban đêm.


1. Vì sao lúc nào cũng là "3 giờ sáng"?

Không phải sự trùng hợp. Ban đêm hội đủ năm điều kiện mà ban ngày hiếm khi có cùng lúc:

Thứ nhất, tài nguyên tích lũy dần. MT5 không trả hết RAM khi bạn đóng chart. Các EA dùng OnTimer, lưu mảng lịch sử, ghi file log — bộ nhớ tăng theo từng giờ. Máy chạy 12 tiếng ban ngày có thể vẫn ổn, nhưng đến giờ thứ 16 thì vượt ngưỡng. VPS nhỏ (1–2 GB RAM) thường "chết" vào khoảng 2–4 giờ sáng, đúng sau khi đã chạy đủ lâu.

Thứ hai, Windows Update mặc định cài đặt về đêm. Windows Server lẫn Windows 10/11 đều có lịch cài bản vá ngoài giờ làm việc. Nếu VPS của bạn không bị tắt tính năng restart tự động, hệ điều hành có thể tự khởi động lại — và MT5 thì không tự mở lại.

Thứ ba, phiên Mỹ tạo biến động, và biến động tạo lỗi. Tin tức lớn thường ra lúc 20:30–22:30 giờ Việt Nam, nhưng dư chấn (spread giãn, slippage, gap) kéo dài tới rạng sáng. Spread giãn ra cũng là lúc các bộ lọc spread của EA chặn vào lệnh — và nếu đó là bộ lọc duy nhất bạn có, bot sẽ im lặng đúng vào khung giờ quan trọng nhất.

Thứ tư, nhà cung cấp VPS bảo trì về đêm. Mọi nhà cung cấp lớn đều chọn khung 2–5 giờ sáng để bảo trì máy chủ, cập nhật hypervisor, hoặc xử lý sự cố ổ cứng. VPS có thể bị reboot, bị migrate sang host khác, hoặc đơn giản là nghẽn mạng vài phút. Vài phút với con người là không đáng kể; với một EA cần tick để vào lệnh, đó là mất cơ hội.

Thứ năm, và quan trọng nhất: không ai nhìn. Ban ngày bạn liếc màn hình RDP vài lần. Ban đêm thì không. Vì thế mọi thứ ở trên — dù chỉ gây hậu quả nhỏ khi bạn đang tỉnh — đều biến thành một đêm mất trắng khi bạn đang ngủ.

Vì sao bot "chết" mà bạn không hề biết — chuỗi 5 mắt xích của một lệnh
Vì sao bot "chết" mà bạn không hề biết — chuỗi 5 mắt xích của một lệnh

Điểm mấu chốt: bot không "chết" trong một sự kiện duy nhất. Nó chết vì một mắt xích đứt, và bạn không biết mắt xích nào đứt cho tới khi tự tay kiểm tra. Vì thế bước đầu tiên không phải là mua công cụ, mà là học cách đọc dấu vết.

2. Trước khi đọc tiếp: tự chẩn đoán trong 10 phút

Lần tới khi nghi bot đã ngừng chạy, đừng mở chart và đoán. Hãy đi theo thứ tự sau, mỗi bước 1–2 phút:

Bước 1 — Xem log của EA (không phải log của MT5). Trong MT5, mở tab Experts ở khung Terminal phía dưới. Đây là nơi EA in ra Print(). Nếu log dừng ở một thời điểm cụ thể, thời điểm đó chính là lúc EA ngừng chạy. Nếu log tiếp tục nhưng chỉ toàn dòng Trade is disabled hoặc lỗi mã 130, 148, thì EA vẫn sống — vấn đề nằm ở tầng dữ liệu hoặc tài khoản.

Bước 2 — Xem log hệ thống của MT5. Tab Journal ghi các sự kiện của terminal: đăng nhập, mất kết nối, nạp EA, thay đổi symbol, lỗi mạng. Câu cần tìm thường là dạng no connection, terminal disconnected, invalid account, hoặc dòng thông báo symbol đã thay đổi.

Bước 3 — Kiểm tra tick cuối cùng. Nhìn nến cuối trên chart: nếu nến cuối cùng là từ nhiều giờ trước thì terminal đã mất dữ liệu (dù cửa sổ vẫn sáng). Đây là điểm khác biệt cốt lõi: MT5 treo vẫn là tiến trình đang sống, nên mọi cách kiểm tra kiểu "tiến trình có tồn tại không" đều cho kết quả sai.

Bước 4 — Kiểm tra Windows. Mở Event ViewerWindows LogsSystem, lọc theo thời gian nghi ngờ. Tìm ba mã này: 41 (kernel-power — máy bị tắt/khởi động lại bất thường), 6008 (shutdown ngoài dự kiến), 1074 (một tiến trình yêu cầu restart, thường là Windows Update). Nếu bạn thấy chúng, nguyên nhân nằm ở tầng máy, không phải ở EA.

Bước 5 — Kiểm tra tài nguyên. Task Manager → tab Performance: RAM có chạm 95–100% không? Ổ đĩa có đầy không? Ổ đĩa đầy là nguyên nhân bị bỏ qua nhiều nhất: MT5 không ghi được log, EA không ghi được file trạng thái, và mọi thứ ngừng hoạt động mà không có thông báo nào rõ ràng.

Bạn thấyNghĩa làNhảy tới
Không có nến mới, nhưng cửa sổ MT5 vẫn sángTerminal treo hoặc mất kết nối brokerMục 5, 6, 8
Event Viewer có mã 41 / 6008 / 1074Máy bị khởi động lạiMục 2, 4
Tab Experts log dừng hẳnEA bị gỡ khỏi chart hoặc tắtMục 6, 7
Log đầy dòng lỗi 130 / 148 / 4109Lỗi vào lệnh lặp lại, EA tự tắtMục 10, 12
Không có dòng lỗi nào, chỉ im lặngĐiều kiện vào lệnh không bao giờ tớiMục 11
RAM ~100%, ổ đĩa đầyTầng máy hết tài nguyênMục 1

3. Tầng máy (VPS + Windows): nguyên nhân 1–4

Đây là tầng dưới cùng. Khi tầng này hỏng, không có gì phía trên chạy được — và thường thì không có log nào trong MT5 để đọc, vì terminal bị giết trước khi kịp ghi.

1. Hết RAM: MT5 bị Windows giết

Dấu hiệu: Event Viewer có sự kiện ứng dụng bị kết thúc; Task Manager cho thấy RAM chạm 95–100%; MT5 biến mất hoàn toàn khỏi danh sách tiến trình.

Vì sao xảy ra: MT5 giữ dữ liệu lịch sử của mọi chart đang mở. Một chart M1 với 100.000 nến nặng hơn nhiều so với một chart H1. Mở 8 chart khung nhỏ + 8 EA + trình duyệt + TeamViewer trên VPS 2 GB RAM là công thức chắc chắn chết. Khi bộ nhớ cạn, Windows bắt đầu swap ra đĩa — hệ thống chậm dần và cuối cùng kill tiến trình ngốn nhiều nhất, thường đúng là terminal.exe.

Cách chặn:

  • Đo RAM thật của bạn: chạy 24 giờ với đúng số chart sẽ dùng, rồi xem mức cao nhất trong Task Manager. Nhân đôi con số đó là cấu hình RAM bạn cần.
  • Giảm số nến trong Tools → Options → Charts: đặt Max bars in chart ở mức 5.000–20.000 thay vì để mặc định vô hạn.
  • Đóng chart không cần thiết. Mỗi chart mở là một bộ dữ liệu trong RAM.
  • Nếu EA dùng OnTimer hoặc ArrayResize, kiểm tra xem mảng có được giải phóng không.
  • Cài cảnh báo khi RAM vượt 85% trong 2 phút liên tục — đây là ngưỡng an toàn để còn kịp xử lý.

2. Windows Update tự khởi động lại

Dấu hiệu: Event Viewer có mã 1074 (một tiến trình yêu cầu restart) hoặc 6008; MT5 không chạy dù máy vẫn bật; giờ uptime của hệ thống bắt đầu từ khoảng 2–4 giờ sáng.

Vì sao xảy ra: Windows mặc định tải và cài bản vá ngoài giờ làm việc, và với Windows Server thì lịch này lại càng kín đáo. Khác biệt chí mạng: Windows tự khởi động lại, nhưng không tự mở lại các ứng dụng — trừ khi bạn cấu hình rõ ràng.

Cách chặn:

  • Đặt Active Hours nếu bản Windows hỗ trợ, nhưng đừng tin tuyệt đối: Active Hours không chặn bản vá bảo mật khẩn.
  • Tạo một Scheduled Task chạy At startup (không phải "At log on") để mở MT5 kèm profile đã cấu hình. Cách này mô tả ở bài riêng, nhưng nguyên tắc là: terminal64.exe /portable /profile:TênProfile.
  • Đặt MT5 ở chế độ portable (/portable) để cấu hình, log và template nằm cùng thư mục — dễ backup, dễ khôi phục.
  • Bật tính năng AutoTrading trong profile sẽ mở, để không phải nhớ bật tay sau mỗi lần restart. Lưu ý: một số bản MT5 vẫn yêu cầu xác nhận khi khởi động, nên hãy thử bằng cách restart VPS thật một lần và quan sát.
  • Cuối cùng và quan trọng nhất: đừng chỉ dựa vào việc tự khởi động lại. Nó là lưới an toàn, không phải hệ thống giám sát. Nếu Task Scheduler thất bại trong im lặng, bạn lại về vạch xuất phát.

3. Mất mạng hoặc đổi IP

Dấu hiệu: Journal có no connection; nến cuối cùng ngừng cập nhật rồi hồi phục sau vài phút — hoặc không hồi phục; MT5 hiển thị tín hiệu kết nối ở góc dưới.

Vì sao xảy ra: VPS có thể mất mạng do nghẽn ở nhà cung cấp, do đổi IP khi host migrate, hoặc do DNS phân giải sai sau khi router của nhà cung cấp đổi. Với bot, điều tệ không phải là mất mạng 30 giây, mà là không có ai biết để còn xử lý lệnh đang treo. Một lệnh đang âm mà không có logic quản lý nào chạy trong 30 phút là rủi ro thật, không phải rủi ro lý thuyết.

Cách chặn:

  • Kiểm tra ping tới server broker mỗi 30 giây từ một tiến trình bên ngoài MT5 (không phải từ chính VPS đó nếu bạn muốn phát hiện "VPS mất mạng hoàn toàn").
  • Nếu mất mạng quá 60 giây, coi như sự cố và báo động — đừng chờ tới 10 phút.
  • Ghi lại IP ra ngoài (ví dụ đẩy lên một endpoint HTTP) mỗi 5 phút. Nếu IP đổi bất thường, bạn biết ngay host đã migrate.
  • Với EA có stop-loss phía server (không phải stop-loss "mềm" trong code), rủi ro mất mạng giảm mạnh — vì lệnh bảo vệ nằm ở phía sàn, không cần bot còn sống.

4. Nhà cung cấp VPS ngắt máy

Dấu hiệu: VPS không phản hồi RDP; uptime của hệ thống đếm lại từ đầu; nhà cung cấp gửi email thông báo bảo trì (thường là sau khi sự việc đã xong).

Vì sao xảy ra: Ba lý do thường gặp: bảo trì hạ tầng theo lịch, sự cố phần cứng (ổ cứng/hypervisor), và hết hạn thanh toán hoặc hết credit. Lý do thứ ba bị đánh giá thấp nhất nhưng lại phổ biến nhất với VPS dùng thẻ trả trước: hết tiền là máy bị treo (suspend), không phải xóa — nhưng bot đã ngừng chạy trước khi bạn phát hiện.

Cách chặn:

  • Bật tự động nạp tiền hoặc đặt nhắc gia hạn trước 5 ngày. Đặt ở nơi bạn chắc chắn nhìn thấy, không phải trong email quảng cáo.
  • Theo dõi uptime từ bên ngoài: một dịch vụ ping/HTTP kiểm tra mỗi phút. Đây là cách duy nhất phân biệt được "VPS chết" với "bot chết" — vì nếu VPS chết, agent trên VPS cũng chết theo và không thể báo cho bạn.
  • Ghi lại toàn bộ cấu hình MT5 (profile, template, .set file) ở nơi khác ngoài VPS. Khi máy bị tạo lại, bạn cần khôi phục trong 15 phút, không phải một buổi chiều.

4. Tầng terminal (MT5): nguyên nhân 5–8

Tầng này là vùng xám: máy vẫn sống, nhưng terminal không làm việc. Đây cũng là tầng mà mọi cách giám sát ngây thơ đều thất bại — vì tiến trình vẫn tồn tại.

5. MT5 bị treo: cửa sổ còn, dữ liệu đứng

Dấu hiệu: Cửa sổ MT5 vẫn hiện, vẫn kéo được, vẫn click được; nhưng nến cuối cùng không cập nhật; tab Experts không có dòng mới; xem Task Manager thấy terminal.exe vẫn ở đó với CPU gần 0%.

Vì sao xảy ra: Terminal có thể mất kết nối tới server dữ liệu mà vẫn giữ kết nối tới server giao dịch, hoặc ngược lại. Luồng xử lý sự kiện bị kẹt chờ I/O. Đôi khi nguyên nhân là một chỉ báo (indicator) lỗi chặn luồng tính toán, hoặc một EA gọi thư viện bên ngoài và thư viện đó treo.

Cách chặn:

  • Đo bằng tick, không đo bằng tiến trình. Định nghĩa "bot còn sống" là: có tick mới trong vòng 60 giây (trong phiên giao dịch). Đây là định nghĩa đúng, và nó tự động bắt được cả 4 nguyên nhân ở tầng này.
  • Ghi thời điểm tick cuối ra một file hoặc đẩy lên cloud mỗi 30 giây để có dấu vết khi mọi thứ dừng.
  • Nếu EA có thể, thêm một OnTimer in ra TimeCurrent() mỗi phút vào log — khi log dừng, bạn biết chính xác thời điểm treo.
Cách biết bot đã chết trong 30 giây — đo bằng heartbeat
Cách biết bot đã chết trong 30 giây — đo bằng heartbeat

6. EA bị gỡ khỏi chart

Dấu hiệu: Tab Experts không có dòng mới nào; biểu tượng EA ở góc trên bên phải chart biến mất hoặc chuyển sang trạng thái có dấu "x"; chart vẫn cập nhật nến bình thường.

Vì sao xảy ra: Ba con đường phổ biến: (a) chart bị MT5 tải lại sau khi mất kết nối và EA không tự gắn lại; (b) bạn hoặc một công cụ khác vô tình đóng chart; (c) bạn đổi symbol của chart — và EA được viết cho symbol cũ nên không khởi tạo được, MT5 gỡ nó ra.

Cách chặn:

  • Kiểm tra sau mỗi lần khởi động lại: dùng profile đã lưu, và mở lại đúng profile thay vì mở chart mới.
  • Đặt kiểm tra định kỳ: đếm số EA đang chạy trên mỗi chart so với danh sách mong đợi. Cách đơn giản nhất là ghi ra log mỗi 5 phút một dòng EA_OK kèm số chart đang chạy.
  • Không đổi symbol trên chart đang chạy EA. Nếu buộc phải đổi, gỡ EA, đổi symbol, rồi gắn lại có kiểm soát.
  • Với cấu hình nhiều EA, giữ một ảnh chụp (screenshot) trạng thái đúng để so sánh khi cần.

7. AutoTrading (Algo Trading) bị tắt

Dấu hiệu: Biểu tượng EA trên chart hiển thị trạng thái "không được phép giao dịch"; nút Algo Trading trên thanh công cụ chuyển sang màu đỏ; log có dòng thông báo giao dịch tự động đang bị tắt.

Vì sao xảy ra: Đây là nguyên nhân "ngớ ngẩn" nhất nhưng lại xảy ra thường xuyên nhất sau một lần restart. Nút AutoTrading trong MT5 không được lưu cố định trong mọi tình huống, và khi terminal bị đóng không sạch, trạng thái này có thể trở về mặc định là tắt. Điều trớ trêu: mọi thứ trông hoàn toàn bình thường — MT5 chạy, EA trên chart, dữ liệu chảy về — chỉ có lệnh là không được gửi.

Cách chặn:

  • Sau mỗi lần khởi động lại, kiểm tra nút này là việc đầu tiên, trước cả việc xem chart.
  • Thêm một phép thử chủ động: mỗi ngày một lần, ở khung giờ có thanh khoản, dùng EA thử gửi một lệnh 0.01 với comment kiểm tra vào một symbol ít biến động, để xác nhận đường vào lệnh còn thông. Xóa lệnh ngay sau đó.
  • Nếu bạn dùng một dịch vụ giám sát, hãy đảm bảo nó kiểm tra khả năng giao dịch, không chỉ kiểm tra tiến trình: cách chắc chắn nhất là đọc log giao dịch, hoặc kiểm tra một lệnh thử.

8. Mất phiên đăng nhập broker

Dấu hiệu: Journal có invalid account, account disabled, hoặc dòng yêu cầu đăng nhập lại; chart không cập nhật; MT5 hiển thị thông báo kết nối thất bại ở góc dưới phải.

Vì sao xảy ra: Broker đổi server (tên server đổi, ví dụ từ Broker-Live sang Broker-Live03), bạn đổi mật khẩu và quên cập nhật trên VPS, hoặc phiên đăng nhập bị ngắt do terminal cập nhật lên build mới. MT5 cập nhật build đôi khi cũng tự khởi động lại — lại quay về nguyên nhân số 2.

Cách chặn:

  • Lưu sẵn cấu hình đăng nhập nhiều server nếu broker hay đổi tên server.
  • Theo dõi email thông báo của broker về bảo trì server — nhưng đừng dựa vào đó làm cơ chế chính.
  • Kiểm tra định kỳ: xác nhận AccountInfoInteger(ACCOUNT_LOGIN) khớp với số tài khoản mong đợi, và log kết quả. Nếu đổi tài khoản (dễ xảy ra khi mở nhiều terminal), bạn sẽ biết ngay.

5. Tầng logic và dữ liệu: nguyên nhân 9–12

Đây là tầng khó nhất, vì bot vẫn "chạy" — có log, có tick, có tiến trình — nhưng không ra lệnh. Người mới thường kết luận sai rằng "chiến lược hết tác dụng", trong khi vấn đề là kỹ thuật.

9. Symbol bị đổi tên hoặc thêm hậu tố

Dấu hiệu: Log EA có dòng không tìm thấy symbol, hoặc SymbolInfoDouble trả về 0; EA không vào lệnh nào; chart mở đúng symbol nhưng EA lại dùng tên khác.

Vì sao xảy ra: Rất nhiều broker thêm hậu tố vào tên symbol: XAUUSD.r, XAUUSD.pro, EURUSD_raw, EURUSD+. Khi broker đổi nhà cung cấp thanh khoản, hậu tố có thể đổi. Nếu EA của bạn hardcode XAUUSD, nó sẽ chạy đúng trên tài khoản cũ và im lặng trên tài khoản mới. Trường hợp tinh vi hơn: hậu tố đổi vào cuối tuần, và bạn chỉ phát hiện khi thấy một tuần không có lệnh.

Cách chặn:

  • Không bao giờ hardcode tên symbol. Dùng biến đầu vào (input) và cho EA tự dò symbol khớp theo tiền tố nếu không tìm thấy tên chính xác.
  • Kiểm tra SymbolSelect()SymbolInfoInteger(symbol, SYMBOL_SELECT) khi khởi tạo, và in ra log rõ ràng nếu thất bại.
  • Ghi log một dòng xác nhận symbol thật đang dùng ngay khi EA khởi tạo.
  • Kiểm tra sau mỗi lần broker thông báo thay đổi điều kiện giao dịch.

10. EA tự tắt do lỗi vào lệnh lặp lại

Dấu hiệu: Log đầy các dòng lỗi với mã số và kết thúc bằng thông báo EA đã bị gỡ hoặc tự dừng; hoặc đơn giản là EA bị disable sau một chuỗi lệnh thất bại.

Vì sao xảy ra: Nhiều EA có cơ chế tự bảo vệ: gặp quá nhiều lỗi liên tiếp thì dừng lại để không gây hại. Cơ chế này đúng về mặt thiết kế, nhưng nó biến lỗi kỹ thuật thành "bot im lặng". Các mã lỗi hay gặp:

NghĩaNguyên nhân thường gặp
130Invalid stopsStop-loss/take-profit quá gần giá, vi phạm khoảng cách tối thiểu của sàn
131Invalid trade volumeKhối lượng không khớp bước nhỏ nhất (step) của symbol
134Not enough moneyKhông đủ margin
138RequoteGiá đổi khi gửi lệnh — thường do mạng chậm
148Too many ordersVượt số lệnh tối đa cho phép của tài khoản/symbol
4109Trade is not allowedAutoTrading bị tắt hoặc EA không được phép giao dịch
4110 / 4111Long/Short not allowedTài khoản ở chế độ chỉ mua hoặc chỉ bán

Cách chặn:

  • Chuẩn hóa stop-loss và khối lượng trước khi gửi lệnh: dùng SymbolInfoDouble(SYMBOL_TRADE_STOPS_LEVEL) để kiểm tra khoảng cách tối thiểu, và SYMBOL_VOLUME_STEP / SYMBOL_VOLUME_MIN cho khối lượng.
  • Thêm retry có giới hạn (ví dụ 3 lần, cách nhau 1 giây) cho các lỗi tạm thời như 138.
  • Ghi log mỗi lần lệnh bị từ chối, kèm mã lỗi và thông số đã gửi. Không có dòng log này thì bạn không bao giờ tìm ra nguyên nhân.
  • Cảnh báo khi cùng một mã lỗi lặp lại 3 lần trong 10 phút. Đây là ngưỡng đủ nhạy để bắt lỗi hệ thống mà không báo động vì một lần requote đơn lẻ.

11. Điều kiện vào lệnh không bao giờ tới

Dấu hiệu: Không có lỗi nào trong log, không có lệnh nào được gửi, mọi thứ "bình thường" nhưng trống trơn suốt nhiều ngày.

Vì sao xảy ra: Đây là nguyên nhân bị chẩn đoán sai nhiều nhất, vì nó không phải sự cố — nó là cấu hình. Ba thủ phạm thường gặp:

  • Bộ lọc spread quá chặt. Ví dụ lọc spread < 15 points cho XAUUSD. Ban ngày spread có thể 20–30 points, tức EA chưa bao giờ được phép vào lệnh. Người dùng thấy "bot chạy mà không vào lệnh" và nghĩ bot hỏng.
  • Khung giờ giao dịch sai. Nếu EA lọc theo giờ server (thường GMT+2 hoặc GMT+3) nhưng bạn lại tính theo giờ Việt Nam, cửa sổ giao dịch có thể rơi vào lúc thị trường đóng.
  • Điều kiện quá chặt cộng dồn. Mỗi điều kiện riêng lẻ đều hợp lý, nhưng xác suất đồng thời xảy ra rất thấp. Một EA có 6 điều kiện, mỗi điều kiện đúng 70% thời gian, chỉ vào lệnh khoảng 12% số nến.

Cách chặn:

  • Ghi log trạng thái mỗi nến (hoặc mỗi 15 phút) với các giá trị của từng điều kiện. Sau một ngày, bạn sẽ thấy ngay điều kiện nào chưa từng đúng.
  • Với bộ lọc spread, hãy ghi lại spread thực tế theo giờ để chọn ngưỡng dựa trên dữ liệu, không dựa trên cảm giác.
  • Kiểm tra ngưỡng giờ theo giờ server: in TimeCurrent()TimeLocal() cạnh nhau một lần để xác nhận chênh lệch.
  • Đừng bỏ qua khả năng "chiến lược thật sự không có tín hiệu" — nhưng chỉ kết luận điều đó sau khi đã loại trừ ba nguyên nhân trên.

12. Hết margin hoặc tài khoản chuyển sang chế độ chỉ đọc

Dấu hiệu: Lỗi 134 (not enough money) hoặc 4109/4110/4111; log giao dịch không có lệnh mới dù EA báo đã gửi; có thể không có thông báo nào nổi bật.

Vì sao xảy ra: Tài khoản có thể rơi vào trạng thái chỉ đọc vì nhiều lý do: ký quỹ không đủ, tài khoản hết hạn (đặc biệt là demo), bạn bị chuyển sang mật khẩu investor (chỉ xem), hoặc sàn thay đổi điều kiện giao dịch với tài khoản của bạn. Điểm nguy hiểm là lệnh bị từ chối trong im lặng: bạn chỉ thấy một dòng lỗi trong tab Journal, không có popup, không có email.

Cách chặn:

  • Kiểm tra AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)ACCOUNT_TRADE_EXPERT định kỳ, và ghi log khi chúng chuyển sang false.
  • Đặt cảnh báo khi margin level xuống dưới một ngưỡng (ví dụ 300%) — trước khi sàn tự xử lý.
  • Kiểm tra loại tài khoản đang đăng nhập: ACCOUNT_LOGINACCOUNT_SERVER. Nếu bạn có nhiều terminal, đừng để nhầm tài khoản demo với tài khoản thật.
  • Theo dõi số dư và ký quỹ hằng ngày; chênh lệch bất thường là dấu hiệu sớm.
12 nguyên nhân thật, chia theo 3 tầng — bảng tra nhanh
12 nguyên nhân thật, chia theo 3 tầng — bảng tra nhanh

6. Bảng chẩn đoán nhanh: 12 nguyên nhân trong một trang

#Nguyên nhânDấu hiệu nhận biết nhanhCách chặn chính
1Hết RAMRAM > 95%, MT5 biến mất khỏi tiến trìnhGiảm số nến/chart, cảnh báo ở 85%
2Windows UpdateEvent 1074 / 6008, uptime đếm lạiScheduled Task "At startup" mở MT5
3Mất mạng / đổi IPJournal no connection, nến ngừngPing từ bên ngoài, báo khi > 60 giây
4Nhà cung cấp ngắt máyKhông RDP được, uptime ~0Giám sát từ ngoài + nhắc gia hạn
5MT5 treoCửa sổ sáng, nến đứng, CPU ~0%Đo heartbeat tick, không đo tiến trình
6EA bị gỡ khỏi chartTab Experts im lặng, icon EA mấtDùng profile, log EA_OK định kỳ
7Algo Trading bị tắtNút đỏ, lỗi 4109Kiểm tra sau mỗi restart, lệnh thử
8Mất phiên đăng nhậpJournal invalid accountLưu nhiều server, kiểm tra login
9Symbol đổi tênLog "không tìm thấy symbol"Không hardcode, tự dò tiền tố
10EA tự tắt do lỗiChuỗi lỗi 130/148/4109Chuẩn hóa stops/volume, cảnh báo 3 lần/10 phút
11Điều kiện không tớiKhông log lỗi, không lệnhLog giá trị từng điều kiện
12Hết margin / read-onlyLỗi 134, 4110Kiểm tra TRADE_ALLOWED, cảnh báo margin

7. Ba lớp phòng: đo — báo — xử lý

Có một nguyên tắc quan trọng cần nói rõ: giám sát không phải là một công cụ, nó là ba lớp. Nếu bạn chỉ có một trong ba, bạn vẫn sẽ có đêm mất trắng.

Lớp 1 — Đo. Cần đọc trạng thái thật của bot: tiến trình còn không, tick cuối là khi nào, EA còn trên chart không, tài nguyên còn bao nhiêu. Tần suất đọc nên là 15–30 giây: nhanh hơn thì tốn tài nguyên vô ích, chậm hơn thì phát hiện muộn.

Lớp 2 — Báo. Khi vượt ngưỡng, thông tin phải tới được bạn trong vòng một phút, ở nơi bạn thật sự nhìn thấy. Telegram và email là hai kênh đủ tốt; thông báo trong app dashboard thì không, vì ban đêm bạn không mở dashboard. Điều kiện phụ nhưng quan trọng: cảnh báo phải kèm trạng thái lúc lỗi — nếu không, bạn sẽ phải dậy, mở RDP, và điều tra lại từ đầu.

Lớp 3 — Xử lý. Có ba mức, chọn theo mức độ tin cậy của hệ thống: (a) thông báo để bạn tự xử lý; (b) tự khởi động lại MT5 và nạp lại EA; (c) tự xử lý kèm leo thang — nếu sau 2 lần vẫn lỗi thì gọi người thật. Với bất kỳ mức nào, phải có giới hạn số lần thử để bot không quay vòng khởi động lại 200 lần trong một đêm.

Ba lớp phòng và thời gian phản ứng của từng lớp
Ba lớp phòng và thời gian phản ứng của từng lớp

Kết hợp ba lớp lại, mục tiêu thời gian là: phát hiện trong 30 giây, thông báo trong 60 giây, xử lý xong trong 5 phút. Đây không phải con số lý thuyết — nó là ngân sách thời gian bạn cần để một sự cố không biến thành một đêm mất trắng.

8. Chi phí thật của một đêm bot chết

Nói "bot chết thì mất cơ hội" là nói chung chung. Hãy tính cụ thể bằng ba kịch bản, dùng con số giả định nhưng có thật về tỉ lệ.

Giả sử bạn chạy một bot XAUUSD với kỳ vọng 8 lệnh/tuần, tỉ lệ thắng 55%, trung bình thắng 1.0R và lỗ 0.8R, khối lượng cho mỗi 1R là 50 USD.

Kịch bản A — bot chết một đêm, không có lệnh nào: bạn mất khoảng 1–2 lệnh trong đêm đó. Nếu bỏ lỡ 2 lệnh mà cả hai đều thắng, mất 100 USD kỳ vọng. Nếu một trong hai là lệnh có nghĩa (đôi khi một lệnh thắng lớn chiếm phần lớn lợi nhuận tháng), con số có thể lên tới 300–500 USD.

Kịch bản B — bot chết khi lệnh đang âm, không có logic xử lý: đây là kịch bản đau nhất. Lệnh âm không có stop-loss phía server, thị trường đi tiếp 200 pips, bạn mở máy lúc 7 giờ. Mức lỗ có thể bằng 5–20R, tức 250–1.000 USD cho một lần.

Kịch bản C — bot chết trong ngày ra tin quan trọng: bạn thiết kế chiến lược để tận dụng biến động đầu phiên. Bot không chạy đúng ngày đó. Không những mất phần lợi nhuận kỳ vọng, bạn còn có thể vào lệnh muộn hơn và đi ngược chuyển động — chi phí biến thành số âm.

Kịch bảnKiểu thiệt hạiƯớc tính cho 1 R = 50 USD
A. Chết một đêm, lệnh trắngMất cơ hội100–500 USD kỳ vọng
B. Chết khi lệnh đang âmLỗ không kiểm soát250–1.000 USD thực lỗ
C. Chết đúng ngày ra tinMất lợi nhuận + vào lệnh sai200–800 USD
Chi phí phòng ngừaCông cụ + thời gian cài20 USD/tháng/VPS

Con số cuối cùng là điểm cần nhấn mạnh: chi phí của lớp phòng ngừa thấp hơn một lần sự cố theo tỉ lệ 10–50 lần. Nhưng khoản chi phí thật sự không phải tiền — mà là thời gian bạn không ngủ được vì không biết bot của mình còn sống hay không.

9. Checklist 20 điểm trước khi đi ngủ

Đây là danh sách thực dụng, làm được trong 5 phút. Đừng cố làm hết 20 điểm ngay ngày đầu — hãy bắt đầu từ nhóm "tầng máy" rồi tiến lên.

Tầng máy (1–6)

  1. RAM đang dùng dưới 85%
  2. Ổ đĩa còn ít nhất 20% dung lượng trống
  3. Đã hạn chế số nến mỗi chart (đặt Max bars in chart)
  4. Windows đã tắt (hoặc dời) restart tự động cho giai đoạn giao dịch
  5. Có Scheduled Task "At startup" mở MT5 với profile đúng
  6. Đã thử restart VPS một lần và xác nhận bot tự sống lại

Tầng terminal (7–13)

  1. Nút Algo Trading đang bật
  2. Mỗi chart cần thiết đều có EA với biểu tượng mặt cười (đang chạy)
  3. Không có chart thừa đang mở chỉ để xem
  4. Đã xác nhận tick đang về (nến cuối cùng là nến hiện tại)
  5. Đã đăng nhập đúng tài khoản (kiểm tra số tài khoản, không chỉ thấy "đã kết nối")
  6. MT5 chạy chế độ portable để dễ backup
  7. Đã lưu profile và template ở nơi khác ngoài VPS

Tầng logic (14–18)

  1. Tên symbol trong EA khớp tên thật trên tài khoản (kể cả hậu tố)
  2. Bộ lọc spread ở mức thực tế (đã đo, không phải đoán)
  3. Cửa sổ thời gian giao dịch đúng theo giờ server
  4. Không có lỗi 130/148/4109 trong log của ngày hôm trước
  5. Margin level trên 300%

Giám sát (19–20)

  1. Có cảnh báo tự động gửi tới Telegram/email khi bot im lặng
  2. Có giám sát từ bên ngoài VPS để phát hiện trường hợp VPS chết hoàn toàn

Hai điểm cuối là hai điểm quan trọng nhất, và cũng là hai điểm hay bị bỏ qua nhất. Nếu bạn chỉ làm được hai việc trong danh sách này, hãy làm điểm 19 và 20.

10. Câu hỏi thường gặp

"Tôi dùng VPS xịn, 8 GB RAM, nhiều core — có cần giám sát không?"

Cần. Nguyên nhân 5–12 không liên quan gì đến cấu hình máy. MT5 treo vì mất kết nối dữ liệu, Algo Trading bị tắt sau restart, symbol đổi hậu tố — tất cả đều xảy ra trên máy mạnh. Ngược lại, một VPS nhỏ nhưng có giám sát tốt an toàn hơn nhiều so với VPS lớn không ai canh.

"Tôi tự viết script PowerShell để kiểm tra, có đủ không?"

Đủ cho lớp 1 nếu bạn kiểm tra đúng thứ: tick, không phải tiến trình. Giới hạn của cách tự làm là bạn phải tự xử lý độ tin cậy (script treo thì sao), tự làm lớp 2 (gửi thông báo), và tự lo trường hợp VPS chết hoàn toàn — khi đó script cũng chết và không báo được gì. Nếu chấp nhận được ba giới hạn đó, tự làm là phương án tốt và rẻ.

"Tôi chỉ chạy một bot, doanh số nhỏ — có đáng đầu tư giám sát?"

Đặt câu hỏi ngược lại: một đêm bot chết khiến bạn mất bao nhiêu? Nếu con số dưới 20 USD thì có lẽ không đáng. Nếu trên 100 USD thì có. Phần lớn trader chạy XAUUSD hoặc EURUSD với khối lượng thật đều vượt ngưỡng này rất nhanh.

"Bao lâu kiểm tra một lần là đủ?"

Trong phiên giao dịch: 30 giây một lần. Ngoài phiên: không cần kiểm tra dày, nhưng vẫn nên kiểm tra tiến trình và tài nguyên mỗi 5 phút để bắt được sự cố hạ tầng.

"Có nên để bot tự khởi động lại MT5 không?"

Nên, nhưng phải có hai điều kiện: (a) giới hạn số lần thử trong một khoảng thời gian (ví dụ tối đa 3 lần mỗi giờ), và (b) luôn thông báo cho bạn mỗi lần tự xử lý. Tự xử lý im lặng là điều tệ nhất: hệ thống có thể đang khởi động lại 40 lần một đêm và bạn không biết gì.

"Bot chạy trên điện thoại hoặc máy cá nhân thì sao?"

Rủi ro cao hơn VPS, vì máy cá nhân có thêm các nguồn sự cố: mất điện, tắt máy, Windows sleep, đóng nắp laptop. Nếu buộc phải chạy trên máy cá nhân, hãy tắt chế độ ngủ và cắm nguồn liên tục — nhưng VPS vẫn là lựa chọn đúng cho bot chạy tiền thật.

11. Kế hoạch 7 ngày để không còn đêm mất trắng

Ngày 1 — Đo trước khi sửa. Ghi lại RAM cao nhất, số chart đang mở, số EA đang chạy, và thời điểm tick cuối của từng chart. Đây là mức nền để so sánh.

Ngày 2 — Dọn tầng máy. Giảm số nến mỗi chart, đóng chart thừa, dời lịch Windows Update, kiểm tra dung lượng ổ đĩa. Mục tiêu: RAM nền giảm ít nhất 20%.

Ngày 3 — Dựng khả năng tự sống lại. Tạo Scheduled Task mở MT5 với profile đã lưu. Restart VPS và xác nhận bot tự chạy lại đúng. Ghi lại những gì còn phải làm bằng tay — đó là danh sách việc cần tự động hoá tiếp.

Ngày 4 — Chuẩn hoá tầng logic. Kiểm tra tên symbol, bộ lọc spread, khung giờ giao dịch. Bổ sung retry cho lỗi 138 và kiểm tra stops level trước khi gửi lệnh.

Ngày 5 — Thêm lớp đo. Dựng một tiến trình ghi lại heartbeat (tick cuối, trạng thái tiến trình, tài nguyên) mỗi 30 giây vào file và đẩy lên nơi khác ngoài VPS.

Ngày 6 — Thêm lớp báo. Cấu hình cảnh báo Telegram cho 4 tình huống: không có tick 60 giây, MT5 không tồn tại, RAM > 85%, không kết nối được broker. Thử cảnh báo giả để chắc chắn nó hoạt động.

Ngày 7 — Thử một sự cố thật. Tắt MT5 theo cách thô (kill tiến trình) lúc bạn đang thức, đo thời gian từ lúc tắt tới lúc nhận được cảnh báo. Nếu trên 2 phút, hãy siết lại ngưỡng. Nếu cảnh báo không tới, bạn biết mình còn việc phải làm — và tốt nhất là biết điều đó trong một buổi chiều, không phải trong một đêm mất trắng.

12. Tóm lại

Nếu bạn chỉ nhớ bốn ý từ bài này, hãy nhớ bốn ý sau:

  1. Bot không "chết" — nó mất một mắt xích. Và mắt xích đứt thường nằm ở tầng máy hoặc tầng terminal, không phải ở chiến lược.
  2. Đo bằng dữ liệu, không đo bằng tiến trình. MT5 treo vẫn là tiến trình đang sống. Định nghĩa đúng của "bot còn sống" là có tick mới trong vòng 60 giây.
  3. Ba lớp mới đủ: đo — báo — xử lý. Thiếu lớp nào cũng dẫn tới cùng một kết quả: bạn biết khi đã quá muộn.
  4. Chi phí phòng ngừa luôn nhỏ hơn chi phí sự cố 10–50 lần. Một sự cố 250 USD đủ trả cho hơn một năm giám sát.

Nếu bạn muốn đi thẳng vào phần thực hành, hai bài nên đọc tiếp là 2 lớp canh chừng: Agent & EA Watchdog — mô tả kiến trúc hai lớp giám sát và vì sao lớp trong VPS không đủ — và Giám sát VPS MT5 EA 24/7 — đi sâu vào cơ chế báo động và xử lý từ xa.

Còn nếu bạn muốn làm ngay trong hôm nay, hãy bắt đầu từ checklist 20 điểm ở mục 9, và làm điểm 19 và 20 trước tiên: có cảnh báo tự động, và có giám sát từ bên ngoài VPS. Hai điểm đó là khác biệt giữa "đôi khi tôi mất một đêm" và "tôi biết trong 30 giây".

Bot không cần bạn thức cùng nó. Nó cần một hệ thống biết nói khi nó ngừng nói.
Đọc xong rồi? Hãy thử ngay — miễn phí 7 ngày.