أتمتة تحسين MT5 من سطر الأوامر: تشغيل الاختبارات الراجعة من CLI
تشغيل مختبر استراتيجيات MT5 يدوياً لكل إكسبرت وزوج ومجموعة معلمات بطيء وممل. ماذا لو يمكنك إطلاق 50 تحسيناً ليلاً، تحليل النتائج، واختيار أفضل استراتيجية — كل ذلك من سكربت واحد؟
يدعم MetaTrader 5 التنفيذ من سطر الأوامر عبر ملفات config. هذا الدليل يوضح كيفية أتمتة الاختبار الراجع والتحسين باستخدام ملفات .ini وسكربتات Batch وPython وتكامل IDE بالذكاء الاصطناعي.
المتطلبات الأساسية
قبل البدء، تأكد من:
- MetaTrader 5 مثبت ومسجل الدخول بحساب تجريبي أو حقيقي
- إكسبرت مجمّع واحد على الأقل (
.ex5) في مجلدMQL5\Experts - MetaEditor مثبت (يأتي مع MT5) — مطلوب للتجميع من CLI
- Windows (أتمتة CLI لـ MT5 تعمل على Windows فقط)
- Python 3.10+ مع حزم
MetaTrader5وpandas(لتحليل النتائج)
إيجاد مسارات MT5 الخاصة بك
:: إيجاد مسار تثبيت MT5
where terminal64.exe
:: أو تحقق من المسار الافتراضي
dir "C:\Program Files\MetaTrader 5\terminal64.exe"
:: إيجاد مجلد البيانات
:: عادة: C:\Users\<you>\AppData\Roaming\MetaQuotes\Terminal\<ID>\
dir /b "%APPDATA%\MetaQuotes\Terminal\"
كيف يعمل الاختبار الراجع من CLI في MT5
يقبل ملف تنفيذ MT5 (terminal64.exe) معامل /config: يشير إلى ملف .ini بكل إعدادات الاختبار:
"C:\Program Files\MetaTrader 5\terminal64.exe" /config:C:\MT5\backtest_config.ini
عند الإطلاق بهذه الطريقة، MT5:
- يبدأ في وضع headless (بدون تفاعل GUI)
- يحمل الإكسبرت والمعلمات من ملف config
- يشغل الاختبار الراجع أو التحسين
- يحفظ التقرير على القرص
- يغلق تلقائياً (إذا كان
ShutdownTerminal=1)
ملف Config (.ini) — مرجع كامل
[Tester]
;--- الإكسبرت للاختبار (مسار نسبي من مجلد MQL5\Experts)
Expert=MyEAs\TrendFollower
;--- ملف معلمات الإكسبرت (في MQL5\Profiles\Tester)
ExpertParameters=trend_follower.set
;--- الرمز والإطار الزمني
Symbol=EURUSD
Period=H1
;--- إعدادات الحساب
Login=123456
Deposit=10000
Currency=USD
Leverage=1:100
;--- نموذج توليد التيك
; 0 = كل تيك (الأبطأ، الأكثر دقة)
; 1 = OHLC دقيقة واحدة (سريع، جيد لمعظم الإكسبرتات)
; 2 = سعر الافتتاح فقط (الأسرع، لاستراتيجيات إغلاق الشمعة)
; 4 = كل تيك بناءً على تيكات حقيقية (الأكثر واقعية)
Model=4
;--- وضع التنفيذ
; 0 = تنفيذ فوري
; -1 = تأخير عشوائي
; >0 = تأخير مخصص بالمللي ثانية
ExecutionMode=0
;--- وضع التحسين
; 0 = معطل (اختبار راجع واحد)
; 1 = خوارزمية كاملة بطيئة (يختبر كل تركيبة)
; 2 = خوارزمية جينية سريعة (موصى بها للمساحات الكبيرة)
Optimization=2
;--- معيار التحسين (ما الذي نعظمه)
; 0 = أقصى رصيد
; 5 = الرصيد × نسبة شارب (موصى به)
OptimizationCriterion=5
;--- النطاق الزمني
FromDate=2023.01.01
ToDate=2025.01.01
;--- الاختبار الأمامي
ForwardMode=2
;--- مخرجات التقرير
Report=my_ea_optimization
ReplaceReport=1
;--- إغلاق تلقائي بعد الانتهاء
ShutdownTerminal=1
;--- إعدادات الوكلاء
UseLocal=1
UseRemote=0
UseCloud=0
;--- المنفذ للاختبار المتوازي
Port=2000
تجميع الإكسبرتات من سطر الأوامر
قبل اختبار الإكسبرت، يجب تجميعه من .mq5 إلى .ex5:
"C:\Program Files\MetaTrader 5\MetaEditor64.exe" /compile:"C:\path\to\TrendFollower.mq5" /log
ملف .log يحتوي على أخطاء التجميع والتحذيرات.
تجميع جميع الإكسبرتات في مجلد
@echo off
set METAEDITOR="C:\Program Files\MetaTrader 5\MetaEditor64.exe"
set EA_DIR=C:\Users\you\AppData\Roaming\MetaQuotes\Terminal\ID\MQL5\Experts\MyEAs
for %%f in (%EA_DIR%\*.mq5) do (
echo تجميع %%~nxf ...
%METAEDITOR% /compile:"%%f" /log
)
echo تم تجميع جميع الإكسبرتات.
تجميع الإكسبرتات بـ Python
import subprocess
import os
def compile_ea(mq5_path, metaeditor_path=r"C:\Program Files\MetaTrader 5\MetaEditor64.exe"):
"""تجميع ملف .mq5 إلى .ex5 باستخدام MetaEditor CLI."""
result = subprocess.run(
[metaeditor_path, f"/compile:{mq5_path}", "/log"],
capture_output=True, timeout=60
)
# تحقق من ملف السجل للأخطاء
log_path = mq5_path.replace('.mq5', '.log')
if os.path.exists(log_path):
with open(log_path, 'r') as f:
log_content = f.read()
if 'error' in log_content.lower():
print(f"أخطاء تجميع في {mq5_path}:")
print(log_content)
return False
ex5_path = mq5_path.replace('.mq5', '.ex5')
return os.path.exists(ex5_path)
# الاستخدام
success = compile_ea(r"C:\Users\you\AppData\Roaming\MetaQuotes\Terminal\ID\MQL5\Experts\MyEAs\TrendFollower.mq5")
print(f"التجميع {'ناجح' if success else 'فاشل'}")
تجميع جميع الإكسبرتات في مجلد
@echo off
set METAEDITOR="C:\Program Files\MetaTrader 5\MetaEditor64.exe"
set EA_DIR=C:\Users\you\AppData\Roaming\MetaQuotes\Terminal\ID\MQL5\Experts\MyEAs
for %%f in (%EA_DIR%\*.mq5) do (
echo تجميع %%~nxf ...
%METAEDITOR% /compile:"%%f" /log
)
ملفات معلمات الإكسبرت (.set)
ملفات .set تحدد المعلمات التي سيتم تحسينها ونطاقاتها:
;--- TrendFollower.set
;--- المعلمة | البداية | الخطوة | النهاية
FastMA=10||5||50||Y
SlowMA=50||10||200||Y
StopLossPips=30||10||150||Y
RiskPercent=0.5||0.5||3.0||Y
MagicNumber=123456||0||123456||N
الصيغة: ParameterName=Start||Step||Stop||Optimize(Y/N)
- Start — القيمة الأولية لنطاق التحسين
- Step — الزيادة بين القيم المختبرة
- Stop — القيمة النهائية لنطاق التحسين
- Optimize —
Yلتضمين في التحسين،Nلإبقاء ثابت
توليد ملفات .set بـ Python
def create_set_file(params, output_path):
"""إنشاء ملف .set لـ MT5 للتحسين."""
lines = []
for name, (start, step, stop, optimize) in params.items():
opt_flag = 'Y' if optimize else 'N'
lines.append(f"{name}={start}||{step}||{stop}||{opt_flag}")
with open(output_path, 'w') as f:
f.write('\n'.join(lines))
print(f"تم إنشاء ملف المعلمات: {output_path}")
# الاستخدام
params = {
'FastMA': (10, 5, 50, True),
'SlowMA': (50, 10, 200, True),
'StopLossPips': (30, 10, 150, True),
'TakeProfitPips': (60, 20, 300, True),
'RiskPercent': (0.5, 0.5, 3.0, True),
'MagicNumber': (123456, 0, 123456, False), # ثابت، غير مُحسّن
}
create_set_file(params, r'C:\Users\you\AppData\Roaming\MetaQuotes\Terminal\ID\MQL5\Profiles\Tester\TrendFollower.set')
أتمتة ملف Batch
إكسبرت واحد، رموز متعددة
@echo off
set MT5="C:\Program Files\MetaTrader 5\terminal64.exe"
set SYMBOLS=EURUSD GBPUSD USDJPY AUDUSD USDCHF
for %%S in (%SYMBOLS%) do (
echo تحسين %%S ...
powershell -Command "(Get-Content D:\MT5\base.ini) -replace 'Symbol=.*', 'Symbol=%%S' | Set-Content D:\MT5\temp_%%S.ini"
%MT5% /config:D:\MT5\temp_%%S.ini
)
إكسبرتات متعددة، رموز متعددة، أطر زمنية متعددة
@echo off
set MT5="C:\Program Files\MetaTrader 5\terminal64.exe"
set CONFIG_DIR=D:\MT5\Configs
set REPORT_DIR=D:\MT5\Reports
set EAS=TrendFollower GridMaster ScalperPro
set SYMBOLS=EURUSD GBPUSD USDJPY
set TIMEFRAMES=M5 H1 H4
for %%E in (%EAS%) do (
for %%S in (%SYMBOLS%) do (
for %%T in (%TIMEFRAMES%) do (
echo اختبار %%E على %%S %%T ...
powershell -Command "(Get-Content %CONFIG_DIR%\base.ini) -replace 'Expert=.*', 'Expert=MyEAs\%%E' -replace 'Symbol=.*', 'Symbol=%%S' -replace 'Period=.*', 'Period=%%T' -replace 'Report=.*', 'Report=%REPORT_DIR%\%%E_%%S_%%T' | Set-Content %CONFIG_DIR%\run_%%E_%%S_%%T.ini"
%MT5% /config:%CONFIG_DIR%\run_%%E_%%S_%%T.ini
)
)
)
echo اكتملت جميع الاختبارات. التقارير محفوظة في %REPORT_DIR%
تحسين متوازي بمنافذ متعددة
@echo off
set MT5="C:\Program Files\MetaTrader 5\terminal64.exe"
:: إطلاق 4 تحسينات متوازية
start "" %MT5% /config:D:\MT5\config_eurusd.ini /port:2000
start "" %MT5% /config:D:\MT5\config_gbpusd.ini /port:2001
start "" %MT5% /config:D:\MT5\config_usdjpy.ini /port:2002
start "" %MT5% /config:D:\MT5\config_audusd.ini /port:2003
echo تم إطلاق 4 تحسينات متوازية.
تحليل النتائج بـ Python
import xml.etree.ElementTree as ET
import pandas as pd
import glob
import os
def parse_optimization_report(xml_path):
"""تحليل تقرير XML للاختبار الراجع."""
tree = ET.parse(xml_path)
root = tree.getroot()
results = []
for item in root.findall('.//Item'):
result = {
'profit': float(item.findtext('Profit', 0)),
'profit_factor': float(item.findtext('ProfitFactor', 0)),
'drawdown': float(item.findtext('EquityDrawdown', 0)),
'sharpe': float(item.findtext('SharpeRatio', 0)),
'trades': int(item.findtext('TotalTrades', 0)),
}
for param in item.findall('.//Input'):
result[param.get('Name')] = float(param.text)
results.append(result)
return pd.DataFrame(results)
def find_best_params(report_dir):
"""إيجاد أفضل نتيجة تحسين عبر جميع التقارير."""
all_results = []
for xml_file in glob.glob(os.path.join(report_dir, '*.xml')):
df = parse_optimization_report(xml_file)
df['source_file'] = os.path.basename(xml_file)
all_results.append(df)
combined = pd.concat(all_results, ignore_index=True)
# فلترة: رابح، أكثر من 50 صفقة، سحب أقل من 20%
filtered = combined[
(combined['profit'] > 0) &
(combined['trades'] > 50) &
(combined['drawdown'] < 20)
]
# ترتيب حسب نسبة شارب
best = filtered.sort_values('sharpe', ascending=False).head(10)
return best
# الاستخدام
best = find_best_params(r'D:\MT5\Reports')
print(best[['source_file', 'profit', 'sharpe', 'drawdown', 'trades']])
best.to_csv('best_optimization_results.csv', index=False)
معايير التحسين — شرح كامل
| المعيار | متى تستخدمه |
|---|---|
| 0 — أقصى رصيد | استراتيجيات بسيطة، فحص سريع |
| 1 — الرصيد × معامل الربح | نهج متوازن، يعاقب الخسائر الكبيرة |
| 2 — الرصيد × العائد المتوقع | التركيز على ربح ثابت لكل صفقة |
| 3 — (100% - السحب) × الرصيد | تجنب المخاطرة، يعاقب السحب بشدة |
| 4 — الرصيد × معامل الاستعادة | مقياس عام جيد، يوازن الربح والسحب |
| 5 — الرصيد × نسبة شارب | موصى به — عوائد معدلة بالمخاطرة |
| 6 — مخصص (OnTester) | متقدم: عرف دالة لياقة خاصة |
| 7 — معيار معقد | درجة متعددة العوامل مدمجة في MT5 |
خط أنابيب الأتمتة الكامل
سكربت Python كامل ينشئ configs، يشغل التحسين، ويحلل النتائج:
import subprocess
import os
import time
import xml.etree.ElementTree as ET
import pandas as pd
class MT5Optimizer:
"""خط أنابيب كامل: إنشاء config ← تشغيل تحسين ← تحليل نتائج."""
def __init__(self, mt5_path, metaeditor_path):
self.mt5_path = mt5_path
self.metaeditor_path = metaeditor_path
def compile_ea(self, ea_path):
"""تجميع الإكسبرت."""
result = subprocess.run(
[self.metaeditor_path, f"/compile:{ea_path}", "/log"],
capture_output=True, timeout=60
)
ex5_path = ea_path.replace('.mq5', '.ex5')
return os.path.exists(ex5_path)
def create_config(self, ea_name, symbol, period, from_date, to_date,
deposit=10000, model=4, optimization=2, criterion=3):
"""إنشاء ملف .ini للتحسين."""
config = f"""[Tester]
Expert={ea_name}
Symbol={symbol}
Period={period}
Deposit={deposit}
Model={model}
Optimization={optimization}
OptimizationCriterion={criterion}
FromDate={from_date}
ToDate={to_date}
Report={ea_name}_{symbol}_{period}
ReplaceReport=1
ShutdownTerminal=1
UseLocal=1
Visual=0
"""
config_path = f'D:\\MT5\\Configs\\{ea_name}_{symbol}_{period}.ini'
with open(config_path, 'w') as f:
f.write(config)
return config_path
def run_optimization(self, config_path, timeout=3600):
"""تشغيل terminal64.exe مع ملف config."""
start = time.time()
subprocess.run(
[self.mt5_path, f"/config:{config_path}"],
capture_output=True, timeout=timeout
)
return time.time() - start
def parse_results(self, report_path):
"""تحليل تقرير XML."""
tree = ET.parse(report_path)
root = tree.getroot()
results = []
for item in root.findall('.//Item'):
row = {
'profit': float(item.findtext('Profit', 0)),
'profit_factor': float(item.findtext('ProfitFactor', 0)),
'sharpe': float(item.findtext('SharpeRatio', 0)),
'drawdown': float(item.findtext('EquityDrawdown', 0)),
'trades': int(item.findtext('TotalTrades', 0)),
}
for param in item.findall('.//Input'):
row[param.get('Name')] = float(param.text)
results.append(row)
return pd.DataFrame(results)
def find_best(self, df, top_n=10):
"""فلترة وترتيب أفضل النتائج."""
filtered = df[
(df['profit'] > 0) &
(df['trades'] >= 30) &
(df['drawdown'] < 25)
].sort_values('sharpe', ascending=False)
return filtered.head(top_n)
# الاستخدام
optimizer = MT5Optimizer(
mt5_path=r'C:\Program Files\MetaTrader 5\terminal64.exe',
metaeditor_path=r'C:\Program Files\MetaTrader 5\MetaEditor64.exe'
)
# 1. تجميع الإكسبرت
optimizer.compile_ea(r'D:\MT5\EAs\TrendFollower.mq5')
# 2. إنشاء config وتشغيل التحسين
config = optimizer.create_config('TrendFollower', 'EURUSD', 'H1', '2023.01.01', '2025.01.01')
elapsed = optimizer.run_optimization(config)
print(f'اكتمل التحسين في {elapsed:.0f} ثانية')
# 3. تحليل النتائج
df = optimizer.parse_results(r'D:\MT5\Reports\TrendFollower_EURUSD_H1.xml')
best = optimizer.find_best(df)
print(best.to_string(index=False))
best.to_csv('best_params.csv', index=False)
معيار تحسين مخصص في MQL5
استخدم المعيار 6 لتعريف دالة لياقة خاصة:
double OnTester()
{
double profit = TesterStatistics(STAT_PROFIT);
double max_dd = TesterStatistics(STAT_EQUITY_DD);
double trades = TesterStatistics(STAT_TRADES);
double sharpe = TesterStatistics(STAT_SHARPE_RATIO);
if(trades < 30) return -1000;
if(max_dd > 20) return -1000;
return sharpe * MathSqrt(MathAbs(profit));
}
تكامل IDE: تحسين الإكسبرتات من محرر الكود
إعداد VS Code
أنشئ مهام بناء في .vscode/tasks.json:
{
"version": "2.0.0",
"tasks": [
{
"label": "تجميع الإكسبرت",
"type": "shell",
"command": "C:\\Program Files\\MetaTrader 5\\MetaEditor64.exe",
"args": ["/compile:${file}", "/log"],
"group": "build"
},
{
"label": "تشغيل الاختبار الراجع",
"type": "shell",
"command": "C:\\Program Files\\MetaTrader 5\\terminal64.exe",
"args": ["/config:D:\\MT5\\backtest.ini"],
"group": "build",
"dependsOn": "تجميع الإكسبرت"
}
]
}
اضغط Ctrl+Shift+B للتجميع ثم الاختبار بالتسلسل.
Windsurf / Cursor: تحسين بالذكاء الاصطناعي
في IDE المدعوم بالذكاء الاصطناعي، يمكنك وصف ما تريد والذكاء الاصطناعي يتعامل مع كل شيء:
"جمّع إكسبرت TrendFollower، أنشئ config تحسين لـ EURUSD H1 من 2023-2025 بالتحسين الجيني على FastMA (10-50) و SlowMA (50-200). شغّل التحسين، حلل نتائج XML، واعرض أفضل 5 مجموعات معلمات حسب نسبة شارب."
الذكاء الاصطناعي ينفذ: التجميع ← إنشاء config ← تشغيل التحسين ← تحليل النتائج ← عرض الجدول.
سير عمل IDE الموصى به
┌──────────────────────────────────────────────────────┐
│ IDE (VS Code / Windsurf / Cursor) │
│ │
│ 1. تحرير كود .mq5 المصدر │
│ 2. Ctrl+Shift+B → تجميع عبر MetaEditor CLI │
│ 3. تحقق من .log لأخطاء التجميع │
│ 4. شغّل terminal64.exe /config:optimize.ini │
│ 5. حلل تقرير XML بسكربت Python │
│ 6. حلل النتائج، عدّل المعاملات │
│ 7. كرر │
└──────────────────────────────────────────────────────┘
Claude Desktop مع MCP Server
للتطوير المستقل تماماً، استخدم MT5 MCP Server مع Claude Desktop. يمنح Claude 16 أداة: write_ea، compile_mql5، run_backtest، get_backtest_results، والمزيد.
شبكة MQL5 Cloud للتحسين الأسرع
[Tester]
UseCloud=1
UseLocal=1
UseRemote=0
التحسين السحابي أسرع 10-100 مرة للمساحات الكبيرة. يتطلب رصيد MQL5 Cloud.
نصائح للتحسين الفعال
- استخدم الخوارزمية الجينية — أسرع 10-100 مرة من التعداد الكامل
- فعّل ShutdownTerminal=1 — يضمن خروجاً نظيفاً للمعالجة الدفعية
- استخدم منافذ مختلفة للتشغيل المتوازي — يمنع تعارض الوكلاء
- استخدم دائماً الاختبار الأمامي — يكشف الإفراط في التجهيز
- حلل تقارير XML — الأتمتة تعمل فقط إذا يمكنك قراءة النتائج برمجياً
- جمّع قبل الاختبار — شغّل
metaeditor64.exe /compileدائماً قبل الاختبار - تحقق من ملف .log — أخطاء التجميع تنتج .ex5 فارغ بصمت
- ثبّت معايير الجودة — استخدم OnTester() لرفض النتائج السيئة برمجياً
- استخدم MQL5 Cloud للمساحات الكبيرة —
UseCloud=1لمساحات معلمات > 10,000 توليفة - احفظ نسخة من أفضل .set — انسخ ملف المعلمات الفائز لمجلد الإكسبرت الحي
الأسئلة الشائعة
هل يمكنني تشغيل الاختبار الراجع على Linux أو Mac؟
لا. terminal64.exe يعمل على Windows فقط. يمكنك استخدام Windows VM أو VPS.
كم يستغرق التحسين؟
التحسين الجيني على EURUSD H1 لمدة سنتين بـ 5 معلمات يستغرق عادة 10-30 دقيقة محلياً.
ما الفرق بين تقارير .htm و .xml؟
.htm للاختبارات الفردية (مقروء بشري). .xml للتحسين (مقروء آلياً). استخدم دائماً .xml للأتمتة.
كيف أعرف إذا كانت نتائج التحسين متجهزة بشكل زائد؟
استخدم الاختبار الأمامي (ForwardMode=1 أو 2). إذا أداء الإكسبرت جيد على الفترة العينية لكن ضعيف على الفترة الأمامية، فهو متجهز بشكل زائد. تحقق أيضاً: 50 صفقة على الأقل، قيم معاملات معقولة (ليست عند الحدود)، وأداء ثابت عبر رموز مختلفة.
هل أحتاج حساب حقيقي للاختبار الراجع؟
لا. MT5 يمكنه الاختبار بدون تسجيل الدخول. لكنك تحتاج بيانات تاريخية محمّلة للرمز الذي تختبره. افتح حساب تجريبي وتصفح رسم الرمز لتحميل البيانات.
هل يمكنني تحسين إكسبرتات متعددة بالتوازي؟
نعم. أطلق عدة نسخ من terminal64.exe بملفات /config: مختلفة وقيم Port= مختلفة. كل نسخة تعمل بشكل مستقل. راجع دليل أتمتة ملفات Batch للسكربتات.
أدلة ذات صلة
إفصاح التسويق بالعمولة: تحتوي هذه الصفحة على روابط تسويق بالعمولة. قد نحصل على عمولة عند النقر على روابط معينة أو التسجيل لدى الوسطاء المميزين على هذا الموقع، دون أي تكلفة إضافية عليك. مراجعاتنا وتوصياتنا مبنية على بحث شامل وتبقى محايدة.اعرف المزيد
تحذير بشأن المخاطر: تداول الفوركس وعقود الفروقات ينطوي على مخاطر كبيرة للخسارة. الأداء السابق لا يدل على النتائج المستقبلية. عقود الفروقات هي أدوات معقدة وتنطوي على مخاطر عالية لخسارة الأموال بسرعة بسبب الرافعة المالية. تأكد من فهمك للمخاطر قبل التداول. هذا المحتوى لأغراض تعليمية فقط ولا يشكل نصيحة مالية.
فريق Pips Growth
فريق التعليم والأبحاث في التداول
فريق Pips Growth هو مجموعة من المتداولين ذوي الخبرة والمحللين الماليين ومعلمي التداول المكرسين لتقديم تعليم فوركس دقيق وعملي. يجمع فريقنا بين عقود من الخبرة العملية في الأسواق والمعرفة التقنية العميقة لإنشاء أدلة شاملة ومراجعات صادقة للوسطاء واستراتيجيات تداول مجربة. يتم البحث في كل مقال بدقة والتحقق من صحته ومراجعته من قبل عدة أعضاء في الفريق لضمان أعلى جودة ودقة.