
- يتواصل Python مع منصة MT5 محلية، بينما تتواصل المنصة مع خادم الوسيط
- مسار حزمة MetaTrader5 الرسمية يعتمد على منصة سطح المكتب وليس تلقائياً على REST API للوسيط
- ابدأ بحساب تجريبي واستخدم متغيرات البيئة وorder_check وبوابات تنفيذ صريحة قبل order_send
- يجب اكتشاف لاحقات الرموز وأسماء الخوادم وأنماط الملء والمناطق الزمنية ومسار المنصة بدلاً من افتراضها
- تحتاج الأتمتة التشغيلية إلى مفتاح إيقاف وحد خسارة يومية وسجلات ومراقبة وخطة إعادة تشغيل مجرّبة
إفصاح الشراكة: قد تحصل ForexTradeLab على عمولة إذا استخدمت رابط وسيط متتبّعاً، من دون تكلفة إضافية عليك. لا تغير العلاقات التجارية المتطلبات التقنية الواردة هنا. راجع إفصاح الشراكة وتحقق بنفسك من الوسيط والكيان القانوني وقواعد الأتمتة والتكاليف.
تحذير تعليمي ومخاطر الأتمتة: هذا المحتوى للتعليم التقني وليس نصيحة استثمارية أو توصية بالتداول. قد تؤدي الرافعة المالية في الفوركس وعقود الفروقات إلى خسائر سريعة. ويمكن لأخطاء البرمجيات والأسعار القديمة وتشغيل نسخ مكررة والانقطاع والانزلاق وإعداد الحساب الخطأ أن تضاعف الضرر. ابدأ تجريبياً، وعطّل إرسال الأوامر افتراضياً، ولا تخاطر بأموال لا تستطيع تحمل خسارتها.
البنية الفعلية: بماذا يتصل Python؟#
الإجابة المختصرة
تتصل حزمة MetaTrader5 الرسمية بعملية MetaTrader 5 المكتبية المثبتة محلياً. أما المنصة نفسها، لا برنامج Python مباشرة، فتحافظ على جلسة الاتصال الموثقة مع خادم MT5 التابع للوسيط.
استراتيجية Python
↓ حزمة MetaTrader5 / اتصال محلي بين العمليات
منصة MT5 المكتبية المحلية
↓ اتصال MT5 موثق
خادم MetaTrader 5 لدى الوسيط
يُسمّى هذا عادة تكاملاً عبر API، لكنه لا يصبح بذلك واجهة REST أصلية للوسيط. إذا كان الوسيط يقدم REST أو WebSocket أو FIX بشكل منفصل، فله مصادقة ورموز وحدود استخدام ونموذج أوامر خاص به.
الشرح التفصيلي
المنصة عنصر دائم الحالة في هذا التصميم. فهي تحتفظ بالحساب المحدد واتصال الخادم ورموز Market Watch وسجل الأسعار وصلاحيات التداول. تطلب دوال مثل account_info() وcopy_rates_from() وorder_send() المعلومات من المنصة أو تطلب منها تمرير أمر إلى الخادم. منصة WebTerminal التي تعمل في المتصفح ليست بديلاً مباشراً لهذه المنصة المحلية.
يشرح ذلك أعطالاً كثيرة: قد يعثر Python على تثبيت MT5 تابع لوسيط آخر، أو تكون المنصة مسجلة في حساب مختلف، أو يكون اسم الخادم غير صحيح، أو تستخدم نسخة ثانية من المنصة مجلد بيانات آخر. لذلك يجب أن تتحقق الشفرة بعد كل تهيئة من رقم الحساب والخادم وصلاحية التداول ومسار المنصة.
مثال
نشرت Exness مادة تعليمية عن Python وMT5 تستخدم بيانات دخول MT5 ورمزاً خاصاً بالحساب مثل XAUUSDm. المثال يوضح سير العمل عبر المنصة، لكنه لا يعني أن كل حساب لدى Exness يحمل اسم الخادم أو اللاحقة نفسها. وتؤكد صفحة XM الرسمية دعم المستشارين الخبراء على MT5؛ وهذه معلومة مرتبطة بالأتمتة، مع ضرورة التمييز بين تكامل Python وبرامج EA المكتوبة بلغة MQL5.
خطأ شائع
وصف الحزمة بأنها «اتصال مباشر بخادم الوسيط»، ثم نشر ملف Python وحده على خادم افتراضي وتوقع عمله من دون منصة سطح المكتب وجلسة الدخول الموثقة.
نصيحة احترافية
سجّل عند البدء نتيجة mt5.version() وبعض حقول terminal_info() ورقم الحساب والخادم، لكن لا تسجّل كلمة المرور مطلقاً. أوقف البرنامج فوراً إذا اختلفت هوية الحساب الفعلية عن الحساب التجريبي المحدد.
المتطلبات والتثبيت بمنهج يبدأ بالتجريبي#
الإجابة المختصرة
استخدم حساباً تجريبياً مخصصاً، ومنصة MT5 المكتبية التابعة للوسيط، وإصداراً حديثاً من Python، وبيئة افتراضية معزولة، ومتغيرات بيئة للأسرار. يركز الدليل على Windows لأن مرجع التكامل الموثق يقبل مسار metatrader.exe أو metatrader64.exe. تحقق من الدعم الرسمي الحالي قبل تصميم نشر لنظام تشغيل آخر.
الشرح التفصيلي
ثبّت MT5 من الوسيط أو من مصدر MetaQuotes الذي يحدده الوسيط. سجّل الدخول يدوياً باستخدام رقم حساب MT5 وكلمة مرور التداول واسم الخادم الدقيق. قد تختلف بيانات منطقة العميل في موقع الوسيط عن بيانات منصة التداول. تأكد من تحرك الأسعار ومن ملاءمة صلاحيات AutoTrading قبل إضافة Python.
أنشئ بعد ذلك بيئة المشروع:
py -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install MetaTrader5 pandas python-dotenv
احفظ الإعدادات في متغيرات نظام التشغيل أو مدير أسرار، أو في ملف .env محلي غير متتبّع:
MT5_LOGIN=12345678
MT5_PASSWORD=replace-with-demo-password
MT5_SERVER=Broker-Demo
MT5_PATH=C:\Program Files\Broker MT5\terminal64.exe
MT5_EXPECT_DEMO=true
MT5_ALLOW_ORDER_SEND=false
MT5_KILL_SWITCH=false
هذه قيم تمثيلية وليست بيانات حقيقية. استبعد .env من Git. وعلى VPS مُدار، قيّد صلاحية قراءة الأسرار واستخدم حساب نظام غير إداري مخصصاً للخدمة متى كان ذلك عملياً.
مثال
يرفض المثال التالي أي حساب غير تجريبي ويغلق الاتصال في جميع الحالات:
import os
import MetaTrader5 as mt5
from dotenv import load_dotenv
load_dotenv()
login = int(os.environ["MT5_LOGIN"])
if not mt5.initialize(
os.environ["MT5_PATH"],
login=login,
password=os.environ["MT5_PASSWORD"],
server=os.environ["MT5_SERVER"],
timeout=60_000,
):
raise RuntimeError(f"MT5 initialize failed: {mt5.last_error()}")
try:
terminal = mt5.terminal_info()
account = mt5.account_info()
if terminal is None or account is None:
raise RuntimeError(f"MT5 state unavailable: {mt5.last_error()}")
if account.login != login:
raise RuntimeError("Connected account does not match configuration")
if os.getenv("MT5_EXPECT_DEMO", "true").lower() == "true" and account.trade_mode != mt5.ACCOUNT_TRADE_MODE_DEMO:
raise RuntimeError("Safety stop: account is not demo")
print({"login": account.login, "server": account.server, "connected": terminal.connected})
finally:
mt5.shutdown()
لا يكفي نجاح initialize() لإثبات صحة البيئة؛ فالتحقق اللاحق هو الذي يمنع استخدام الحساب الخطأ.
خطأ شائع
كتابة كلمة المرور داخل الشفرة، أو إهمال مسار ملف المنصة مع وجود عدة منصات لوسطاء مختلفين، أو افتراض أن نجاح الاتصال يعني أن الحساب المطلوب هو النشط.
نصيحة احترافية
افصل بيئات البحث والتجريبي والحقيقي—إذا وصلت لاحقاً إلى الحقيقي—باستخدام حسابات نظام ومجلدات وإعدادات وأرقام magic مختلفة. يقلل الفصل احتمال تنفيذ أمر في حساب غير مقصود.
اكتشاف الرموز وقراءة Ticks والأسعار والحساب#
الإجابة المختصرة
اكتشف الاسم الفعلي للرمز لدى الوسيط، واستدع symbol_select، وارفض البيانات المفقودة، واستخدم كائنات وقت واعية بمنطقة UTC عند طلب السجل. لا تفترض أن EURUSD هو الاسم المتاح أو أن توقيت الرسم البياني يساوي توقيت جهازك.
الشرح التفصيلي
قد تختلف قائمة الرموز حسب نوع الحساب. فقد يكون الزوج EURUSD أو EURUSDm أو EURUSD.a، وقد لا يكون متاحاً أصلاً. كما تختلف أدنى كمية وخطوة الحجم وعدد المنازل العشرية ومسافة الوقف ونمط التداول وسياسة الملء. استعلم من المنصة المتصلة بدلاً من نسخ مواصفات وسيط آخر.
تعيد symbol_info_tick() أحدث تحديث متاح في المنصة. وتعيد copy_rates_from() شموعاً منظمة تشمل الوقت وأسعار OHLC وحجم ticks والفارق والحجم الحقيقي عند توفره. يوصي المرجع الرسمي بإنشاء أوقات UTC لأن MT5 تخزن أوقات الشموع وticks وفق UTC. حوّلها إلى الوقت المحلي عند العرض فقط، ووثق حدود جلسة يوم الوسيط بصورة منفصلة.
مثال
from datetime import datetime, timezone
import pandas as pd
import MetaTrader5 as mt5
matches = mt5.symbols_get(group="*EURUSD*") or ()
print([item.name for item in matches]) # اختر رمز الحساب التجريبي يدوياً
symbol = "EURUSD" # استبدله بعد الاكتشاف
if not mt5.symbol_select(symbol, True):
raise RuntimeError(f"Cannot select {symbol}: {mt5.last_error()}")
info = mt5.symbol_info(symbol)
tick = mt5.symbol_info_tick(symbol)
account = mt5.account_info()
rates = mt5.copy_rates_from(
symbol, mt5.TIMEFRAME_M15, datetime.now(timezone.utc), 200
)
if info is None or tick is None or account is None or rates is None or len(rates) == 0:
raise RuntimeError(f"Missing MT5 data: {mt5.last_error()}")
frame = pd.DataFrame(rates)
frame["time"] = pd.to_datetime(frame["time"], unit="s", utc=True)
print(frame[["time", "open", "high", "low", "close", "spread"]].tail())
print({"balance": account.balance, "equity": account.equity, "bid": tick.bid, "ask": tick.ask})
اعتبر السعر قديماً إذا تجاوز طابعه الزمني الحد الذي وثقته لساعات السوق. تحتاج عطلات نهاية الأسبوع والإجازات وفترات توقف الأداة إلى قواعد مختلفة عن الجلسة النشطة.
خطأ شائع
استخدام datetime.now() من دون منطقة زمنية، أو قبول مصفوفة فارغة بصمت، أو حساب النقاط بقيمة ثابتة من دون فحص digits وpoint ومواصفات العقد.
نصيحة احترافية
احفظ الأوقات الخام بصيغة UTC، وأضف تسمية منفصلة لجلسة الوسيط، واحفظ لقطة من symbol_info() مع كل اختبار. بذلك يصبح تغير اللاحقة أو خطوة الحجم أو العقد قابلاً للمراجعة.
فحص order_check وأمر تجريبي محمي#
الإجابة المختصرة
ابنِ الطلب من مواصفات الرمز الحالية، وشغّل order_check، وضع order_send خلف بوابات صريحة لا تسمح إلا بالحساب التجريبي. نجاح الفحص لا يضمن التنفيذ؛ إذ يعيد الخادم تقييم الطلب النهائي.
الشرح التفصيلي
يجب أن يطابق الطلب اسم الرمز وحجم العقد وخطوة الحجم ونمط التنفيذ وسياسة الملء التي يدعمها الوسيط. ويجب أن تلتزم مسافات وقف الخسارة وجني الربح بالقواعد الحالية. يساعد order_check() على اكتشاف نقص الهامش أو خطأ الحقول، لكن السعر وحالة الحساب قد يتغيران قبل إرسال الطلب.
يبقى المثال التالي في وضع عدم الإرسال افتراضياً. ولا يسمح بطلب تجريبي بأدنى حجم إلا بعد تحقق الشروط الآتية:
- الحساب المتصل مؤكد على أنه تجريبي.
- ضُبط
MT5_ALLOW_ORDER_SEND=trueعمداً. - مفتاح
MT5_KILL_SWITCHغير مفعّل. - لم يصل مجموع الخسارة المحققة والعائمة إلى الحد اليومي.
- لا يوجد مركز مفتوح للرمز نفسه.
- يتوفر tick حديث ومواصفات صالحة ونتيجة فحص ناجحة.
مثال
import os
import MetaTrader5 as mt5
def guarded_demo_buy(symbol: str, daily_pnl: float, max_daily_loss: float = 50.0):
account = mt5.account_info()
info = mt5.symbol_info(symbol)
tick = mt5.symbol_info_tick(symbol)
if account is None or info is None or tick is None:
raise RuntimeError(f"State unavailable: {mt5.last_error()}")
if account.trade_mode != mt5.ACCOUNT_TRADE_MODE_DEMO:
raise RuntimeError("Blocked: demo accounts only")
if os.getenv("MT5_KILL_SWITCH", "false").lower() == "true":
raise RuntimeError("Blocked: kill switch active")
if daily_pnl <= -abs(max_daily_loss):
raise RuntimeError("Blocked: maximum daily loss reached")
if mt5.positions_get(symbol=symbol):
raise RuntimeError("Blocked: existing symbol position")
if not mt5.symbol_select(symbol, True):
raise RuntimeError(f"Symbol unavailable: {mt5.last_error()}")
request = {
"action": mt5.TRADE_ACTION_DEAL,
"symbol": symbol,
"volume": info.volume_min,
"type": mt5.ORDER_TYPE_BUY,
"price": tick.ask,
"deviation": 10,
"magic": 26091001,
"comment": "FTL_DEMO_TEST",
"type_time": mt5.ORDER_TIME_GTC,
"type_filling": mt5.ORDER_FILLING_RETURN, # تحقق من دعم الوسيط
}
checked = mt5.order_check(request)
if checked is None or checked.retcode != 0:
raise RuntimeError(f"order_check rejected: {checked}; {mt5.last_error()}")
if os.getenv("MT5_ALLOW_ORDER_SEND", "false").lower() != "true":
return {"sent": False, "reason": "dry run", "check": checked._asdict()}
result = mt5.order_send(request)
if result is None or result.retcode != mt5.TRADE_RETCODE_DONE:
raise RuntimeError(f"order_send failed: {result}; {mt5.last_error()}")
return {"sent": True, "deal": result.deal, "order": result.order}
لا تحسب الدالة استراتيجية أو مسافة وقف أو مخاطرة ملائمة، وحد الخسارة النقدي فيها تعليمي فقط. في أداة اختبار فعلية، احسب الحجم من وقف مُراجع باستخدام أداة حجم العقد والمخاطرة، وطابقه مع volume_step إلى الأسفل؛ لا ترفعه بما يزيد المخاطرة.
خطأ شائع
نسخ نمط ملء أو حجم من مثال عام، أو اعتبار retcode=0 في order_check وعداً بالتنفيذ، أو إعادة المحاولة بعد انتهاء المهلة من دون مطابقة الأوامر والمراكز. قد تنشئ الإعادة العمياء تعرضاً مكرراً.
نصيحة احترافية
اعتمد سياسة تمنع التكرار باستخدام معرف حدث الاستراتيجية ورقم magic والرمز والنافذة الزمنية. بعد أي استجابة غير مؤكدة، استعلم عن الأوامر والصفقات والمراكز قبل تقرير إمكان الإعادة.
مقارنة طرق التكامل وتشغيلها بأمان#
الإجابة المختصرة
يناسب Python مع MT5 التحليل بلغة Python والتنفيذ عبر المنصة المحلية. يعمل EA داخل MT5، بينما تكون API الأصلية للوسيط خدمة أخرى. اختر وفق الدعم والكمون وقابلية النقل وعبء التشغيل، لا وفق التسميات التسويقية.
الشرح التفصيلي
| الطريقة | مسار الاتصال | الأنسب لها | الخطر التشغيلي الأساسي |
|---|---|---|---|
حزمة MetaTrader5 | Python ←→ MT5 محلية ←→ خادم الوسيط | البحث بـPython والتنفيذ عبر المنصة | الاعتماد على جلسة المنصة |
| مستشار MQL5 خبير | EA داخل MT5 ←→ خادم الوسيط | معالجة أحداث أصلية داخل المنصة | تطوير خاص بلغة MQL5 |
| API أصلية للوسيط | التطبيق ←→ نقطة نهاية موثقة | خدمات مستقلة إذا دعمها الوسيط | مصادقة وحدود ونموذج أوامر مختلف |
| أتمتة النقرات | نقرات واجهة ←→ المنصة | لا استخدام إنتاجي موثوق | هشاشة وصعوبة التدقيق |
لا تجعل خدمة VPS الاستراتيجية الرديئة آمنة؛ إنها تمنح المنصة والبرنامج مضيفاً دائماً فقط. اختر منطقة مناسبة لخوادم الوسيط، وشبكة مستقرة، ومزامنة وقت، وتحديثات مضبوطة، ومساحة تخزين كافية، ونسخة عملية واحدة خاضعة للمراقبة. قد تنتهي جلسات Windows أو يعاد تشغيلها؛ اختبر الإقلاع والتعافي بدلاً من افتراض الاستمرارية.
ينبغي لمفتاح الإيقاف منع التعرض الجديد مع إبقاء المراقبة، وربما السماح بتقليص المراكز وفق تصميم مقصود. احسب حد الخسارة اليومية من بيانات الحساب والصفقات الموثوقة وبداية يوم ثابتة. حدد هل يشمل الربح والخسارة المحققة والعائمة والعمولات والمبادلات. أوقف النظام عند قدم الأسعار أو تكرار الرفض أو اتساع الفارق بصورة غير طبيعية أو تغير الحساب أو فقد الاتصال.
مثال
تكتب خدمة آمنة سجلات JSON تشمل وقت UTC وإصدار الاستراتيجية وبصمة غير عكسية للحساب والرمز والقرار ومعرف الطلب ورمز الفحص ورمز الإرسال والكمون، من دون أسرار. ينبه مراقب الصحة عند غياب النبض، لكنه لا يشغّل نسخاً متعددة آلياً. وبعد إعادة التشغيل، تطابق الخدمة المراكز والربح والخسارة اليومية، ثم تبدأ في وضع المحاكاة حتى تنجح فحوص الصحة.
خطأ شائع
تثبيت MT5 على VPS وتفعيل بدء التشغيل وإرسال الأوامر معاً، ثم اكتشاف أن مهمتين مجدولتين شغّلتا نسختين من الاستراتيجية بعد إعادة تشغيل النظام.
نصيحة احترافية
تدرّب على أربعة حوادث في الحساب التجريبي: انقطاع المنصة، وسعر قديم، وانتهاء مهلة استجابة الأمر، وبلوغ حد الخسارة. إذا لم يفسر دليل التشغيل المراكز والسجلات الناتجة، فالمنظومة غير جاهزة لرأس مال حقيقي.
استكشاف الأخطاء وإصلاحها#
- فشل
initialize(): اطبعmt5.last_error()وتحقق من مسار ملف التشغيل والتثبيت وجلسة المستخدم والتوافق واسم الخادم. - ظهور حساب غير مقصود: مرر رقم الدخول والخادم صراحة وقارن
account_info().login؛ أوقف البرنامج ولا تبدّل الحساب بصمت. - غياب الأسعار أو ticks: حدد رمز الوسيط الدقيق، وافحص Market Watch وساعات السوق وتوفر السجل والاتصال.
- الرمز غير موجود: استخدم
symbols_get(group="*EURUSD*")؛ قد تتغير البادئة أو اللاحقة حسب نوع الحساب. - رفض الحجم: افحص
volume_minوvolume_maxوvolume_step، ثم طبّع الحجم إلى الأسفل ضمن حد المخاطرة. - وقف غير صالح: افحص حجم النقطة وحدود الوقف والتجميد؛ لا تحذف الحماية لمجرد تمرير الطلب.
- نمط ملء غير مدعوم: افحص قدرات الرمز ووثائق الوسيط؛ لا تفترض دعم
ORDER_FILLING_RETURN. - انزياح الوقت: أنشئ أوقات الطلب وفق UTC وحوّلها للعرض فقط؛ ميّز بين UTC ووقت خادم الوسيط والوقت المحلي.
- يعمل محلياً ويفشل على VPS: طابق المنصة ومجلد البيانات والحساب والمتغيرات والصلاحيات وجلسة المستخدم.
- انتهاء المهلة بعد الإرسال: لا تعد الإرسال فوراً؛ طابق أولاً أحدث الأوامر والصفقات والمراكز.
قائمة تحقق قبل التشغيل#
- استخدم حساب MT5 تجريبياً مخصصاً وتحقق من الكيان القانوني والخادم.
- ثبّت منصة سطح المكتب الصحيحة وثبّت مسار ملف التشغيل في الإعدادات.
- احفظ البيانات السرية في متغيرات البيئة أو مدير أسرار.
- سجّل هوية البيئة وحالتها من دون تسجيل أي سر.
- اكتشف الرموز ومواصفات العقود من الحساب المتصل.
- استخدم UTC داخلياً وعرّف بداية يوم الوسيط.
- ارفض ticks القديمة والبيانات المفقودة والفارق غير الطبيعي والانقطاع.
- شغّل
order_checkقبل كل طلب وافحص النتيجة. - اجعل
MT5_ALLOW_ORDER_SENDبقيمة false افتراضياً. - امنع تعدد النسخ وطابق الحالة بعد كل إعادة تشغيل.
- طبّق مفتاح إيقاف وحداً للمراكز وحد خسارة يومية.
- اختبر مسارات الخطأ والمهلة والتعافي على الحساب التجريبي.
- راجع شروط الأتمتة الحالية لدى الوسيط والقيود القانونية المحلية.
- اختبر الاستراتيجية تاريخياً من دون اعتبار النتائج وعداً.
مسرد المصطلحات#
- منصة MT5: تطبيق MetaTrader 5 المكتبي المثبت الذي يحتفظ بجلسة الوسيط.
- حزمة MetaTrader5: وحدة Python من MetaQuotes للتواصل مع المنصة المحلية.
- خادم الوسيط: نقطة MT5 التي يديرها الوسيط وتوثّق المنصة اتصالها بها.
- لاحقة الرمز: إضافة خاصة بالحساب مثل
mأو.aفي اسم الأداة. - Tick: أحدث تحديث متاح لسعري العرض والطلب وطابعه الزمني.
- الشمعة: بيانات OHLC مجمعة لفترة زمنية.
order_check: فحص تمهيدي للطلب، وليس ضماناً للتنفيذ.order_send: طلب من المنصة لتمرير أمر تداول إلى الخادم.- رقم Magic: معرف رقمي يربط الأوامر باستراتيجية آلية.
- مفتاح الإيقاف: تحكم يمنع إنشاء تعرض آلي جديد عند تفعيله.
- VPS: خادم افتراضي خاص لاستضافة المنصة والبرنامج بصورة مستمرة.
تابع التعلّم#
الأسئلة الشائعة
initialize() العثور على المنصة وتشغيلها عند الحاجة وفق المرجع الرسمي. لكن التشغيل الموثوق ما زال يتطلب التثبيت والمسار والحساب وجلسة المستخدم الصحيحة.
التعليقات
أضف ملاحظة مفيدة للمتداولين الآخرين. نراجع التعليقات قبل النشر.