Tự khởi động lại MT5 khi treo: dựng watchdog cho terminal trên VPS
2026-09-07
Watchdog cho MetaTrader 5 là một tác vụ nhỏ chạy vài phút một lần, quyết định từng terminal có thật sự đang làm việc không, rồi mở lại những cái đã hỏng. "Thật sự đang làm việc" cần ba phép thử chứ không phải một: tiến trình phải chạy từ đúng thư mục của tài khoản đó, terminal phải còn kết nối broker, và EA phải ghi heartbeat trong vài phút gần nhất. Chỉ kiểm tra tiến trình sẽ bỏ sót lỗi ban đêm phổ biến nhất: terminal vẫn mở, vẫn xanh, còn EA thì đã ngừng thực thi.
Watchdog dựa vào đâu để kết luận terminal đã chết?
| Phép thử | Đo bằng cách nào | Hành động an toàn | Bỏ sót cái gì |
|---|---|---|---|
| Tiến trình còn sống | terminal64.exe có đường dẫn file chạy trùng thư mục của tài khoản đó | Mở lại với /portable | Terminal đang mở nhưng EA đã chết |
| Kết nối broker | Log Journal lặp lại connection to ... failed, hoặc TERMINAL_CONNECTED đọc từ trong EA | Khởi động lại một lần rồi cảnh báo | Sai mật khẩu: khởi động lại mãi cũng vô ích |
| Heartbeat của EA | Tuổi của file dấu thời gian mà EA ghi lại mỗi 60 giây | Khởi động lại terminal, vẫn cũ thì cảnh báo | EA vẫn ghi file nhưng lỗi ở mọi lệnh |
Chỉ phép thử đầu tiên đủ cơ sở để khởi động lại tự động vô điều kiện. Hai phép còn lại nên khởi động lại một lần rồi chuyển sang cảnh báo, vì vòng lặp khởi động lại trước một mật khẩu đã đổi chỉ tạo ra mười hai cảnh báo giống hệt nhau mỗi giờ. Bộ kiểm tra rộng hơn, gồm RAM và việc máy còn với tới được hay không, nằm ở bài giám sát VPS MT5: theo dõi gì và tự động hoá thế nào.
Script PowerShell 40 dòng chạy được ngay tối nay
Script này phủ một VPS với số terminal portable bất kỳ: mở lại tiến trình bị thiếu, ghi mọi quyết định vào một file CSV, và đánh dấu heartbeat quá cũ. Sửa hai đường dẫn cho từng tài khoản rồi lưu thành C:\ops\watchdog.ps1.
# watchdog.ps1 - one VPS, run every 5 minutes from Task Scheduler
$Terminals = @(
@{ Name='acct-01'; Exe='C:\MT5\acct-01\terminal64.exe'; Beat='C:\MT5\acct-01\MQL5\Files\health.txt' },
@{ Name='acct-02'; Exe='C:\MT5\acct-02\terminal64.exe'; Beat='C:\MT5\acct-02\MQL5\Files\health.txt' }
)
$StaleMinutes = 5
$LogFile = 'C:\ops\watchdog.csv'
function Write-Event($name, $state, $detail) {
$row = [pscustomobject]@{
Time = (Get-Date).ToString('s'); Terminal = $name; State = $state; Detail = $detail
}
$row | Export-Csv -Path $LogFile -Append -NoTypeInformation -Encoding UTF8
}
$running = Get-Process terminal64 -ErrorAction SilentlyContinue
foreach ($t in $Terminals) {
$proc = $running | Where-Object { $_.Path -eq $t.Exe }
if (-not $proc) {
Start-Process -FilePath $t.Exe -ArgumentList '/portable'
Write-Event $t.Name 'RESTARTED' 'process was not running'
continue
}
if (-not (Test-Path $t.Beat)) {
Write-Event $t.Name 'NO_HEARTBEAT' "file missing: $($t.Beat)"
continue
}
$ageMin = [int]((Get-Date) - (Get-Item $t.Beat).LastWriteTime).TotalMinutes
if ($ageMin -gt $StaleMinutes) {
Write-Event $t.Name 'STALE' "heartbeat $ageMin min old"
} else {
Write-Event $t.Name 'OK' "heartbeat $ageMin min old"
}
}
$os = Get-CimInstance Win32_OperatingSystem
$pct = [int](100 - ($os.FreePhysicalMemory / $os.TotalVisibleMemorySize * 100))
if ($pct -gt 85) { Write-Event 'HOST' 'RAM_HIGH' "$pct percent used" }
File heartbeat đến từ phía EA. Sáu dòng trong OnTimer() với EventSetTimer(60) là đủ: mở health.txt, ghi TimeCurrent(), đóng handle. Không có nó, script chỉ nói được rằng cửa sổ đang mở.
Làm sao cho nó chạy mỗi 5 phút?
Dùng Task Scheduler, chạy dưới đúng tài khoản Windows đang sở hữu các terminal. Một dòng trong cửa sổ dòng lệnh quyền quản trị, trong đó /RP * hỏi mật khẩu của tài khoản đó và /IT giữ tác vụ nằm trong phiên của người dùng đó:
schtasks /Create /TN "MT5 Watchdog" /SC MINUTE /MO 5 /RU %USERNAME% /RP * /IT /RL HIGHEST ^
/TR "powershell -NoProfile -ExecutionPolicy Bypass -File C:\ops\watchdog.ps1"
Tài khoản chạy tác vụ quan trọng hơn cả lịch chạy. Chạy dưới SYSTEM thì tác vụ vẫn sống sau khi đăng xuất, nhưng mọi thứ nó mở lên đều nằm ở session 0, phiên không tương tác, nên terminal vừa được mở lại không có màn hình nào bạn với tới được qua RDP. Chạy dưới chính tài khoản của các terminal kèm /IT thì terminal mở lại nằm đúng phiên bạn vẫn kết nối vào; đánh đổi là tác vụ chỉ chạy khi tài khoản đó còn đăng nhập, và đó cũng chính là lý do bạn ngắt RDP bằng dấu X thay vì Sign out. Trong phần thuộc tính của tác vụ, hãy bỏ chọn thêm Stop the task if it runs longer than, vì một job ngắn như thế này không cần thời hạn. Và lưu ý MT5 chỉ giữ một bản chạy cho mỗi thư mục dữ liệu, nên watchdog không thể vô tình mở bản thứ hai của một tài khoản đang chạy.

Script này mù ở chỗ nào?
- Chính cái máy. VPS khởi động lại hoặc nhà cung cấp mất dịch vụ thì script cũng biến mất theo. Không thứ gì bên trong một máy báo được rằng máy đó đã tắt.
- Cái chết của chính script. Một lỗi cú pháp sau khi sửa, một tác vụ bị vô hiệu hoá, một mật khẩu hết hạn của tài khoản chạy nó, và nó im lặng hỏng mãi.
- AutoTrading bị tắt. Khởi động lại đưa terminal về đúng trạng thái nút AutoTrading mà profile đã lưu. Nếu nó bật lên ở trạng thái tắt thì phép thử tiến trình vẫn đạt mà không có gì được giao dịch. Đây là sự cố mô tả ở bài vì sao EA MT5 bị dừng trên VPS.
- Mười VPS cùng lúc. Script chạy theo từng máy: mười bản sao, mười lịch chạy, mười chỗ phải kiểm tra, không có cái nhìn chung.
- Sửa bất cứ thứ gì. Nó chỉ khởi động lại: không đẩy được EA đã sửa, không đổi preset, không quay lui bản lỗi.
Khi nào khởi động lại tự động là hành động sai?
Khởi động lại terminal không đụng tới các lệnh đang mở vì chúng nằm ở phía broker, nhưng nó cắt ngang logic EA đang chạy dở, nên chỉ khởi động lại nhiều nhất một lần mỗi chu kỳ, không lặp vô hạn. Bỏ qua việc khởi động lại khi thị trường đóng cửa, vì một terminal không kết nối được vào thứ Bảy không phải là lỗi. Hãy coi "Invalid account" là điểm dừng: mật khẩu hoặc server đã đổi, chỉ con người mới cấp được thông tin mới. Cấu hình máy cũng quan trọng, vì một máy đã dùng 95% RAM sẽ giết luôn terminal bạn vừa mở; định mức RAM mỗi terminal nằm ở bài chạy nhiều MT5 trên một VPS.
Bản không bị mù
AutoBotCenter chạy đúng ba phép thử đó cộng tài nguyên máy và phép kiểm tra từ ngoài vào, nhưng bằng một agent cài như dịch vụ có giám sát trên mỗi VPS, nên đóng console cũng không giết được nó, kèm một máy chủ nhận ra khi cả máy ngừng báo cáo và gửi cảnh báo Telegram mà chính máy đó không gửi nổi. Cũng dashboard đó đẩy file .ex5 và preset .set tới một hay hai mươi terminal, ghim phiên bản EA theo từng tài khoản, và giữ việc cập nhật ở dạng tự chọn theo từng VPS. Nền tảng không có API đặt lệnh: nó mở, tắt, khởi động lại terminal và cài EA, chứ không thể mở, sửa hay đóng một lệnh. Gói free đủ cho một VPS và không cần thẻ; các bước ghi danh có ở hướng dẫn cài đặt.
Làm ngay
- Thêm heartbeat vào mọi EA trước tiên. Watchdog thiếu heartbeat chỉ là bộ đếm tiến trình.
- Lưu script ở trên với đường dẫn thật và chạy tay một lần khi đã cố ý đóng một terminal.
- Đăng ký tác vụ dưới đúng tài khoản đang sở hữu các terminal, rồi ngắt RDP bằng dấu X và xác nhận file CSV vẫn dài thêm.
- Giới hạn một lần khởi động lại mỗi chu kỳ cho mỗi terminal; lần hỏng thứ hai thì báo cho người.
- Thêm một thứ nằm ngoài VPS để nhận ra khi cả máy im lặng, vì script không bao giờ làm được.
- Khi đã chạy hơn hai máy, gom kết quả về một màn hình thay vì rải trên từng máy.
Muốn khỏi mở RDP từng máy?
AutoBotCenter gom mọi VPS, MT5 và EA của bạn về một dashboard: watchdog tự dựng MT5 chết, cài EA từ xa, cảnh báo Telegram. Gói Free đủ chạy 1 VPS, không cần thẻ.
Dùng thử miễn phí


