Blog

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àoHành động an toànBỏ sót cái gì
Tiến trình còn sốngterminal64.exe có đường dẫn file chạy trùng thư mục của tài khoản đóMở lại với /portableTerminal đang mở nhưng EA đã chết
Kết nối brokerLog Journal lặp lại connection to ... failed, hoặc TERMINAL_CONNECTED đọc từ trong EAKhởi động lại một lần rồi cảnh báoSai mật khẩu: khởi động lại mãi cũng vô ích
Heartbeat của EATuổi của file dấu thời gian mà EA ghi lại mỗi 60 giâyKhởi động lại terminal, vẫn cũ thì cảnh báoEA 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.

Dòng thời gian: terminal trên VPS chết lúc 03:14 và watchdog mở lại lúc 03:16
Giá trị của watchdog nằm ở khoảng trống hai phút. Không có nó, cùng sự cố đó bị phát hiện lúc 09:00.

Script này mù ở chỗ nào?

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

  1. Thêm heartbeat vào mọi EA trước tiên. Watchdog thiếu heartbeat chỉ là bộ đếm tiến trình.
  2. 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.
  3. Đă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.
  4. 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.
  5. 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.
  6. 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í

Bài liên quan

Giám sát VPS MT5: cần theo dõi gì, kiểm tra thế nào, và tự động hoá đến đâu

Cách giám sát MetaTrader 5 trên VPS: 5 tín hiệu báo trước bot sắp chết, cách đọc từng tín hiệu từ log hoặc script, ngưỡng cảnh báo, và điểm mà watchdog + cảnh báo Telegram thay thế việc mở RDP.

VPS tích hợp của MetaTrader và VPS riêng: EA của bạn thật sự cần cái nào

Hosting của MetaQuotes chỉ một cú bấm và ping rất thấp, nhưng chỉ chạy một terminal, giấu máy đi và không script được. So sánh thẳng với thuê VPS Windows riêng, kèm các trường hợp mỗi bên là lựa chọn đúng.

Quản lý nhiều tài khoản MT5: một màn hình cho mọi terminal, EA và VPS

MetaTrader 5 chỉ giữ một tài khoản cho mỗi terminal, nên quản lý mười tài khoản là bài toán kiểm kê chứ không phải bài toán giao dịch. Cái gì gãy ở mốc 5, 20 và 100 tài khoản, những cột thật sự cần trên một màn hình, một VPS chứa được bao nhiêu terminal, và thứ tự nên tự động hoá.

Chọn VPS chạy EA MT5: vị trí, RAM, giá, và những thứ quảng cáo không nói

Tiêu chí chọn VPS forex cho MetaTrader 5: đặt gần server broker để giảm ping, RAM theo số terminal, Windows Server hay Windows 10, nhà cung cấp trong nước hay quốc tế, và cách kiểm tra VPS trước khi trả tiền.