Автоматическое удаление логов MT5 (Batch/PowerShell) | Регулярная очистка Logs, MQL5\Logs, Tester

Введение

В этой статье объясняется, как автоматически удалять старые файлы .log из «Журналов операций (Logs/Journal)», «Экспертов (MQL5\Logs/Experts)» и «Бэктестов (Tester\logs)» в MT5 (MetaTrader 5), чтобы предотвратить раздувание диска. Это можно реализовать с помощью стандартных средств Windows: Batch (.bat) или PowerShell (.ps1). Этот контент предназначен для тех, кто хочет автоматизировать связанную статью (Стратегия борьбы с раздуванием логов MT5 | Как удалить и оптимизировать логи операций, экспертов и бэктестов).


Концепция автоматического удаления (Предпосылки)

  • Логи MT5 сохраняются по дате в формате ГГГГММДД.log.
  • Базовое условие удаления — «файлы старше ◯ дней» (пример: старше 30 дней).
  • Целевые папки в основном 3: Logs, MQL5\Logs, Tester\logs.
  • Можно запускать автоматически каждый день/неделю, зарегистрировав в «Планировщике заданий» Windows.

Как проверить целевые папки и пути

Откройте Проводник из верхнего меню MT5 «Файл → Открыть папку данных» и проверьте следующие подпапки:

  • …\Terminal\<Длинный ID>\Logs (Журналы операций)
  • …\Terminal\<Длинный ID>\MQL5\Logs (Эксперты / Индикаторы)
  • …\Terminal\<Длинный ID>\Tester\logs (Бэктест)

При использовании нескольких терминалов (несколько ID) под каждым ID существуют папки логов с одинаковыми именами. Для портативной версии MT5 папки MQL5 и Tester расположены непосредственно в физической папке.


Срок хранения (Руководство по операционной политике)

  • Реальная работа (включая VPS): Хранить 14~30 дней
  • Разработка и валидация: 7~14 дней (рекомендуется короче из-за большого объема вывода)
  • Только для бэктеста: Удалять в соответствии с циклом тестирования, от еженедельно до ежедневно

Начните с длительного периода, например 30 дней, и если проблем нет, постепенно сокращайте.


Метод A: Автоматическое удаление с помощью пакетного файла (.bat)

A-1 Рекомендуется: Массовое переключение с флагом DRYRUN (Поддержка нескольких терминалов)

Чтобы предотвратить ошибочное удаление, этот формат позволяет массово переключаться между «только список» ⇔ «продукционное удаление» с помощью флага DRYRUN. Автоматически сканирует все папки ID (Терминала) в %APPDATA%\MetaQuotes\Terminal.
Удобно при работе с несколькими MT5 на одном ПК или VPS.

@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: файлы старше %DAYS% дней
echo [MODE] DRYRUN=%DRYRUN%  (1=только список, 0=удалить)
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] Очистка логов завершена.
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] Очистка логов завершена.
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. Можно управлять, просто переключая $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] Удалить логи старше $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] Очистка логов завершена."

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] Очистка логов завершена."

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 (не удаляйте Bases, History, Profiles и т.д.).
  • Всегда сначала выполняйте пробный запуск: Пакетный — установите DRYRUN=1, PowerShell — установите $DryRun=$true.
  • Установите длительный срок хранения → сократите, если проблем нет.
  • При использовании нескольких экземпляров сделайте целью все ID ниже (скрипты в этой статье обрабатывают автоматически).
  • Обратите внимание на недостаток прав или ошибки пути (используйте путь, скопированный непосредственно из «Открыть папку данных»).

Устранение неисправностей

  • Блокировка политикой выполнения: PowerShell, запускайте с добавлением -ExecutionPolicy Bypass.
  • Доступ запрещен: Запустите от имени администратора / предоставьте задаче «наивысшие привилегии».
  • Цель не найдена: Перепроверьте путь портативной версии, расположение под несколькими ID, написание имени папки.
  • Расписание не работает: Проверьте «Последний результат выполнения (0x0 — успех)», пользователя запуска / настройки условий / историю.

Часто задаваемые вопросы (FAQ)

В. Какие папки и что нужно удалять?
О. Только файлы .log в Logs, MQL5\Logs, Tester\logs. Не удаляйте Bases, History, Profiles и т.д.
В. Какой срок хранения безопасен?
О. Начните с примерно 30 дней, и если проблем нет, можно сократить до 14 дней, 7 дней. Для реальной работы — 14~30 дней, для разработки и валидации — 7~14 дней в качестве ориентира.
В. Я использую несколько экземпляров MT5 (несколько ID). Можно ли сделать их все целью?
О. Примеры в этой статье автоматически сканируют все папки ID в %APPDATA%\MetaQuotes\Terminal\.
В. Повлияет ли удаление на советников или результаты бэктеста?
О. Только прошлые записи вывода (логи) будут потеряны, это не влияет на логику советника или результаты тестирования.
В. Сначала хочу проверить, не удаляя. Как это сделать?
О. Установив для пакетного файла DRYRUN=1, а для PowerShell $DryRun=$true, при запуске будет отображаться только список.
В. Можно ли использовать с портативной версией MT5?
О. Да. Укажите в скрипте абсолютный путь к Logs/MQL5\Logs/Tester\logs, которые находятся непосредственно в папке портативной версии.

Схема FAQ (JSON-LD)

Добавить комментарий