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