MT5 自動刪除日誌(Logs/MQL5\Logs/Tester):使用批次檔/PowerShell 定期清理

前言

本文將說明如何透過 Windows 標準的批次檔(.bat)PowerShell(.ps1),自動刪除 MT5(MetaTrader 5)中「操作日誌(Logs/Journal)」、「專家顧問(MQL5\Logs/Experts)」和「回測(Tester\logs)」的“舊 .log 檔案”,以防止磁碟空間被佔用。此內容適用於希望自動化執行相關文章(MT5日誌檔案過大問題解決方案|刪除操作日誌、專家和回測日誌以減輕負載)的讀者。


自動刪除的考量(先決條件)

  • MT5 日誌以日期格式 YYYYMMDD.log 儲存。
  • 基本的刪除條件是「早於某個日期的檔案」(例如:30 天前)。
  • 目標資料夾主要有 LogsMQL5\LogsTester\logs 這三個。
  • 註冊到 Windows「任務排程器」後,即可實現每日/每週的自動執行。

目標資料夾和路徑的確認方法

在 MT5 上方選單中點選「檔案 → 開啟資料夾」,開啟檔案總管,並確認以下子資料夾:

  • …\Terminal\<長 ID>\Logs(操作日誌)
  • …\Terminal\<長 ID>\MQL5\Logs(專家顧問/指標)
  • …\Terminal\<長 ID>\Tester\logs(回測)

使用多個終端機(多個 ID)時,每個 ID 下都會有同名的日誌資料夾。便攜版 MT5 的 MQL5Tester 則位於實際資料夾的根目錄。


保留天數(操作策略建議)

  • 實際操作(包括 VPS):保留 14〜30 天
  • 開發・驗證:7〜14 天(由於輸出量較大,建議較短)
  • 回測專用:配合測試週期,每週或每日刪除

建議從 30 天等較長天數開始,如果沒有問題,再逐漸縮短。


方法 A:使用批次檔(.bat)自動刪除

A-1 建議:使用 DRYRUN 旗標切換(支援多個終端機)

為防止誤刪,此版本使用 DRYRUN 旗標實現「僅列出」⇔「實際刪除」的一鍵切換。它會自動掃描 %APPDATA%\MetaQuotes\Terminal 下所有 ID(終端機)。
當您在一台電腦或 VPS 上執行多個 MT5 時非常方便。

@echo off
REM ===== MT5 日誌自動刪除(批次檔版/多個終端機&一鍵切換) =====
REM 建議以管理員權限執行。請根據需要修改 DAYS/DRYRUN。

setlocal enabledelayedexpansion
set "DAYS=30"          REM 目標檔案的保留天數(例如:30)
set "DRYRUN=1"         REM 1=僅列出(不刪除), 0=實際刪除
set "DATA_ROOT=%APPDATA%\MetaQuotes\Terminal"

echo [INFO] MT5 logs cleanup target: files older than %DAYS% days
echo [MODE] DRYRUN=%DRYRUN%  (1=list only, 0=delete)
echo [ROOT] %DATA_ROOT%
echo.

for /D %%T in ("%DATA_ROOT%\*") do (
  for %%F in ("%%T\Logs" "%%T\MQL5\Logs" "%%T\Tester\logs") do (
    if exist "%%~F" (
      echo [CLEAN] %%~F
      if "!DRYRUN!"=="1" (
        REM 僅列出(不刪除)
        forfiles /p "%%~F" /m *.log /d -%DAYS% /c "cmd /c echo @path"
      ) else (
        REM 實際刪除(靜默刪除/抑制錯誤)
        forfiles /p "%%~F" /m *.log /d -%DAYS% /c "cmd /c del /f /q @path" 2>nul
      )
    )
  )
)

echo.
echo [DONE] Completed log cleanup.
endlocal

切換方法:驗證時請使用 DRYRUN=1(僅列出)。執行刪除時,請將其變更為 DRYRUN=0 並重新儲存。您不需要取消/新增行註釋。

A-2 指定固定 ID 路徑(單一終端機)

此為針對特定終端機 ID(單一環境)的簡潔版本。請將 xxxxxxx 替換為您的 ID。

@echo off
REM ===== MT5 日誌自動刪除(批次檔版/固定 ID&一鍵切換) =====
setlocal enabledelayedexpansion

set "DAYS=30"
set "DRYRUN=1"  REM 1=僅列出, 0=刪除

REM 指定 MT5 資料夾中的日誌資料夾(替換 ID)
set "LOGS_PATH=C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Logs"
set "EXPERTS_LOGS=C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\MQL5\Logs"
set "TESTER_LOGS=C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Tester\logs"

echo [INFO] DAYS=%DAYS% / DRYRUN=%DRYRUN%
for %%F in ("%LOGS_PATH%" "%EXPERTS_LOGS%" "%TESTER_LOGS%") do (
  if exist "%%~F" (
    echo [CLEAN] %%~F
    if "%DRYRUN%"=="1" (
      forfiles /p "%%~F" /s /m *.log /d -%DAYS% /c "cmd /c echo @path"
    ) else (
      forfiles /p "%%~F" /s /m *.log /d -%DAYS% /c "cmd /c del /f /q @path" 2>nul
    )
  )
)

echo [DONE] Completed log cleanup.
endlocal

A-3 最小設定(無 DRYRUN・立即刪除)

立即刪除的最小範例(未經驗證)。請小心誤刪

@echo off
REM 指定 MT5 資料夾中的日誌資料夾
set LOGS_PATH="C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Logs"
set EXPERTS_LOGS="C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\MQL5\Logs"
set TESTER_LOGS="C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Tester\logs"

REM 刪除早於 30 天的檔案
forfiles /p %LOGS_PATH% /s /m *.log /d -30 /c "cmd /c del @file"
forfiles /p %EXPERTS_LOGS% /s /m *.log /d -30 /c "cmd /c del @file"
forfiles /p %TESTER_LOGS% /s /m *.log /d -30 /c "cmd /c del @file"

方法 B:使用 PowerShell(.ps1)自動刪除

B-1 建議:使用 $DryRun 旗標切換(支援多個終端機)

PowerShell 可以使用 -WhatIf 安全地執行模擬執行(Dry Run)。只需將 $DryRun 切換為 $true/$false 即可操作。

# ===== MT5 日誌自動刪除(PowerShell 版/多個終端機&一鍵切換) =====
# 建議以管理員權限執行。請根據需要調整 $Days / $DryRun。

$Days    = 30
$DryRun  = $true   # $true=僅列出(不刪除), $false=實際刪除
$cutoff  = (Get-Date).AddDays(-$Days)
$dataRoot = Join-Path $env:APPDATA 'MetaQuotes\Terminal'

Write-Host "[INFO] Delete logs older than $Days days"
Write-Host "[MODE] DryRun=$DryRun"
Write-Host "[ROOT] $dataRoot`n"

$terminals = Get-ChildItem -Path $dataRoot -Directory -ErrorAction SilentlyContinue

foreach ($t in $terminals) {
  $folders = @(
    Join-Path $t.FullName 'Logs'
    Join-Path $t.FullName 'MQL5\Logs'
    Join-Path $t.FullName 'Tester\logs'
  )
  foreach ($folder in $folders) {
    if (Test-Path $folder) {
      Write-Host "[CLEAN] $folder"
      $targets = Get-ChildItem -LiteralPath $folder -Filter *.log -File -ErrorAction SilentlyContinue |
                 Where-Object { $_.LastWriteTime -lt $cutoff }
      if ($DryRun) {
        $targets | ForEach-Object { Write-Host $_.FullName }
      } else {
        $targets | Remove-Item -Force -ErrorAction SilentlyContinue
      }
    }
  }
}

Write-Host "`n[DONE] Completed log cleanup."

B-2 指定固定 ID 路徑(單一終端機)

此版本僅針對特定 ID。請將 xxxxxxx 替換為您的 ID。

# ===== MT5 日誌自動刪除(PowerShell 版/固定 ID&一鍵切換) =====
$Days   = 30
$DryRun = $true
$limit  = (Get-Date).AddDays(-$Days)

$folders = @(
  "C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Logs",
  "C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\MQL5\Logs",
  "C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Tester\logs"
)

Write-Host "[INFO] DAYS=$Days / DryRun=$DryRun"
foreach ($folder in $folders) {
  if (Test-Path $folder) {
    Write-Host "[CLEAN] $folder"
    $targets = Get-ChildItem -Path $folder -Filter *.log -File -ErrorAction SilentlyContinue |
               Where-Object { $_.LastWriteTime -lt $limit }
    if ($DryRun) {
      $targets | ForEach-Object { Write-Host $_.FullName }
    } else {
      $targets | Remove-Item -Force -ErrorAction SilentlyContinue
    }
  }
}
Write-Host "[DONE] Completed log cleanup."

B-3 最小設定(立即刪除)

立即刪除的最小範例(未經驗證)。請小心誤刪

$days = 30
$limit = (Get-Date).AddDays(-$days)

$folders = @(
  "C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Logs",
  "C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\MQL5\Logs",
  "C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Tester\logs"
)

foreach ($folder in $folders) {
  Get-ChildItem -Path $folder -Filter *.log | Where-Object { $_.LastWriteTime -lt $limit } | Remove-Item -Force
}

使用任務排程器定期執行

任務排程器設定畫面

步驟

  1. 開啟 Windows「任務排程器」。
  2. 「建立基本任務」→ 輸入名稱(例如:MT5日誌自動刪除)。
  3. 選擇觸發器(每日/每週。建議在深夜等負載較低時段)。
  4. 操作=「啟動程式」。
    • 批次檔版:程式/指令碼:cmd.exe
      新增引數:/c "C:\scripts\DeleteMT5Logs.bat"
    • PowerShell 版:程式/指令碼:powershell.exe
      新增引數:-ExecutionPolicy Bypass -File "C:\scripts\DeleteMT5Logs.ps1"
  5. 如有需要,啟用「不論使用者是否登入都要執行」和「使用最高權限執行」(VPS 上建議啟用)。
  6. 在「條件」中停用與「電源」相關的限制(適用於 VPS 或全天候運作的電腦)。
  7. 啟用「工作記錄」並確認成功與否(0x0 表示成功)。

安全操作檢查清單

  • 刪除目標僅限 .log 檔案(不可刪除 BasesHistoryProfiles 等)。
  • 首次務必執行模擬執行(Dry Run):批次檔設 DRYRUN=1,PowerShell 設 $DryRun=$true
  • 保留天數先設長一點 → 確認無誤後再縮短。
  • 使用多個實例(Instance)時,請將所有 ID 下的資料夾都設為目標(本文的指令碼已自動支援)。
  • 注意權限不足或路徑錯誤(請使用從「開啟資料夾」複製的實際路徑)。

疑難排解

  • 被執行原則封鎖:PowerShell 啟動時請加上 -ExecutionPolicy Bypass
  • 存取被拒:以管理員權限執行/在任務中賦予「最高權限」。
  • 找不到目標:再次確認便攜版路徑、多個 ID 下的資料夾、資料夾名稱拼寫。
  • 排程未啟動:檢查「上次執行結果(0x0 為成功)」、啟動使用者/條件設定/記錄。

常見問題(FAQ)

Q. 我應該刪除哪個資料夾中的什麼檔案?
A. LogsMQL5\LogsTester\logs 中的 .log 檔案。請勿刪除 BasesHistoryProfiles 等。
Q. 保留多少天是安全的?
A. 建議先從 30 天左右開始,如果沒有問題,可以縮短到 14 天或 7 天。實際操作建議 14〜30 天,開發・驗證建議 7〜14 天。
Q. 我使用多個 MT5 實例(多個 ID)。可以全部設為目標嗎?
A. 本文提供的範例會自動掃描 %APPDATA%\MetaQuotes\Terminal\ 下的所有 ID 資料夾。
Q. 刪除會影響 EA 或回測結果嗎?
A. 只會刪除過去的輸出記錄(日誌),不會影響 EA 邏輯或測試結果。
Q. 我想先確認哪些檔案會被刪除,而不實際刪除,可以嗎?
A. 您可以將批次檔設為 DRYRUN=1,PowerShell 設為 $DryRun=$true,執行後即可僅列出目標檔案。
Q. 便攜版 MT5 也可以使用嗎?
A. 可以。請在指令碼中指定便攜版資料夾根目錄下的 LogsMQL5\LogsTester\logs 的絕對路徑。

發佈留言