วิธีลบล็อกของ MT5 อัตโนมัติ (Batch/PowerShell) | ทำความสะอาด Logs, MQL5\Logs และ Tester แบบกำหนดเวลา

เกริ่นนำ

บทความนี้อธิบายวิธีลบ “ไฟล์ .log เก่า” ของ MT5 (MetaTrader 5) ใน «บันทึกการทำงาน (Logs/Journal)», «Expert (MQL5\Logs/Experts)» และ «แบ็กเทสต์ (Tester\logs)» แบบอัตโนมัติเพื่อป้องกันดิสก์โตเกินไป สามารถทำได้ด้วย Batch (.bat) ของ Windows หรือ PowerShell (.ps1) เหมาะสำหรับผู้อ่านที่ต้องการทำงานอัตโนมัติจากบทความที่เกี่ยวข้อง (แนวทางแก้ปัญหาล็อก MT5 โต | วิธีลบล็อกการทำงาน Expert และแบ็กเทสต์เพื่อลดน้ำหนัก)


แนวคิดการลบอัตโนมัติ (ข้อสมมติ)

  • ล็อกของ MT5 ถูกบันทึกตามวันที่ในรูปแบบ YYYYMMDD.log
  • เงื่อนไขหลักคือ “เก่ากว่า N วัน” (เช่น เก่ากว่า 30 วัน)
  • โฟลเดอร์เป้าหมายหลักมี 3 โฟลเดอร์: Logs, MQL5\Logs, Tester\logs
  • หากลงทะเบียนใน “Task Scheduler” ของ Windows จะสามารถรันอัตโนมัติรายวัน/รายสัปดาห์

วิธีตรวจสอบโฟลเดอร์และพาธเป้าหมาย

เปิด Explorer จากเมนูด้านบนของ MT5 “ไฟล์ → เปิดโฟลเดอร์ข้อมูล” แล้วตรวจสอบซับโฟลเดอร์ต่อไปนี้:

  • …\Terminal\<ID ยาว>\Logs (บันทึกการทำงาน)
  • …\Terminal\<ID ยาว>\MQL5\Logs (Expert/อินดิเคเตอร์)
  • …\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 หลายตัวบน PC หรือ VPS เดียว

@echo off
REM ===== ลบล็อก MT5 อัตโนมัติ (Batch / หลายเทอร์มินัล & สลับรวดเดียว) =====
REM แนะนำให้รันด้วยสิทธิ์ผู้ดูแลระบบ ปรับ DAYS/DRYRUN ตามต้องการ

setlocal enabledelayedexpansion
set "DAYS=30"          REM เก่ากว่า N วัน (เช่น 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 ตายตัว (เทอร์มินัลเดียว)

เวอร์ชันกระชับสำหรับเทอร์มินัลเดียว แทนที่ xxxxxxx ด้วย ID ของคุณ

@echo off
REM ===== ลบล็อก MT5 อัตโนมัติ (Batch / 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 รองรับ dry run อย่างปลอดภัยด้วย -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] 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
}

ตั้งรันตามกำหนดด้วย Task Scheduler

หน้าจอตั้งค่า Task Scheduler

ขั้นตอน

  1. เปิด “Task Scheduler” ของ Windows
  2. “Create Basic Task” → ตั้งชื่อ (เช่น ลบล็อก MT5 อัตโนมัติ)
  3. เลือกทริกเกอร์ (รายวัน/รายสัปดาห์; แนะนำช่วงดึกหรือเวลาที่โหลดต่ำ)
  4. การทำงาน = “Start a program”
    • แบบ Batch: โปรแกรม/สคริปต์: cmd.exe
      อาร์กิวเมนต์เพิ่มเติม: /c "C:\scripts\DeleteMT5Logs.bat"
    • แบบ PowerShell: โปรแกรม/สคริปต์: powershell.exe
      อาร์กิวเมนต์เพิ่มเติม: -ExecutionPolicy Bypass -File "C:\scripts\DeleteMT5Logs.ps1"
  5. เปิดใช้ “Run whether user is logged on or not” และ “Run with highest privileges” ตามความเหมาะสม (แนะนำใน VPS)
  6. ที่ “Conditions” ปิดข้อจำกัดเกี่ยวกับ “Power” (สำหรับ VPS หรือ PC ที่เปิดตลอด)
  7. เปิด “Task History” และตรวจสอบผลลัพธ์ (รหัส 0x0 คือสำเร็จ)

รายการตรวจสอบการใช้งานอย่างปลอดภัย

  • ลบเฉพาะไฟล์ .log (ห้ามลบ Bases, History, Profiles ฯลฯ)
  • ครั้งแรกควร dry run: Batch ใช้ 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\ อัตโนมัติ
ถาม: การลบจะกระทบ EA หรือผลแบ็กเทสต์ไหม?
ตอบ: ลบเพียงบันทึกผลย้อนหลัง ไม่กระทบตรรกะของ EA หรือผลการทดสอบ
ถาม: อยากตรวจสอบก่อนโดยไม่ลบทำอย่างไร?
ตอบ: Batch ใช้ DRYRUN=1; PowerShell ใช้ $DryRun=$true เพื่อแสดงรายการเท่านั้น
ถาม: ใช้กับ MT5 แบบพกพาได้หรือไม่?
ตอบ: ได้ ให้ระบุพาธแบบสมบูรณ์ของ Logs/MQL5\Logs/Tester\logs ใต้โฟลเดอร์หลักของเวอร์ชันพกพา

สคีมาคำถามที่พบบ่อย (JSON-LD)

ใส่ความเห็น