P
PipsGrowth
أتمتة

دليل تداول الفوركس بـ Python: ربط MetaTrader 5 بـ Python

تعلم كيفية استخدام Python للتداول الآلي مع MetaTrader 5. تركيب المكتبة، جلب البيانات، تنفيذ الأوامر، بناء استراتيجية SMA، والاختبار الخلفي الكامل.

PG
فريق Pips Growth
2026-07-01
9 دقيقة

دليل تداول الفوركس بـ Python: ربط MetaTrader 5 بـ Python

Python هي لغة البرمجة الأكثر شعبية لتحليل البيانات والتداول الخوارزمي. مع مكتبة MetaTrader5، يمكنك ربط Python مباشرة بـ MT5 لجلب بيانات السوق لحظياً، تنفيذ الأوامر، وبناء روبوتات تداول متقدمة — كل ذلك بقوة Python ومكتباتها التحليلية.

هذا الدليل يعلمك كل ما تحتاجه: من التركيب إلى استراتيجية تداول كاملة عاملة.

لماذا Python للتداول؟

MQL5 (لغة MT5 الأصلية) ممتازة لتنفيذ الإكسبرتات داخل المنصة. لكن Python تتفوق في:

  • تحليل البيانات — pandas, numpy, scipy لتحليل إحصائي قوي
  • التعلم الآلي — scikit-learn, TensorFlow, PyTorch لبناء نماذج تنبؤية
  • الرسوم البيانية — matplotlib, plotly لمرئيات احترافية
  • الاختبار الخلفي — backtrader, vectorbt لاختبار استراتيجيات مرن
  • التكامل — ربط مع APIs خارجية (أخبار، بيانات اقتصادية، تنبيهات)

Python مقابل MQL5: متى تستخدم ماذا؟

المهمة الأداة المفضلة
تنفيذ إكسبرت داخل MT5 MQL5
تحليل البيانات وبناء الاستراتيجية Python
التعلم الآلي والتنبؤ Python
الاختبار الخلفي المتقدم Python
المراقبة والتنبيهات Python
تنفيذ صفقات من سكريبت خارجي Python

العديد من المتداولين يستخدمون كلاهما: MQL5 لتنفيذ الإكسبرت داخل MT5، و Python للبحث والتحليل والاختبار.


التركيب

المتطلبات

  1. MetaTrader 5 مثبت ويعمل (نسخة Windows)
  2. Python 3.8+ — حمّله من python.org
  3. حساب MT5 (تجريبي أو حقيقي)

مهم: مكتبة MetaTrader5 تعمل فقط على Windows. على Linux/Mac، استخدم Wine لتشغيل MT5 أو فكر في بدائل مثل FIX API.

تركيب الحزم

pip install MetaTrader5 pandas numpy matplotlib

التحقق من التركيب

import MetaTrader5 as mt5
import pandas as pd
from datetime import datetime

# تهيئة الاتصال
if not mt5.initialize():
    print("فشل التهيئة:", mt5.last_error())
    quit()

# عرض معلومات الحساب
account = mt5.account_info()
if account:
    print(f"الحساب: {account.login}")
    print(f"الرصيد: ${account.balance}")
    print(f"الرافعة: 1:{account.leverage}")

mt5.shutdown()

الاتصال بـ MT5

تهيئة الاتصال

import MetaTrader5 as mt5

# تهيئة بدون specifying حساب (يستخدم آخر حساب نشط)
mt5.initialize()

# أو حدد حساباً معيناً
mt5.initialize(
    login=12345678,
    password="your_password",
    server="ICMarkets-Demo"
)

# التحقق من الاتصال
if not mt5.initialize():
    print("فشل الاتصال:", mt5.last_error())
else:
    info = mt5.terminal_info()
    print(f"متصل بـ: {info.name}")
    print(f"المسار: {info.data_path}")

معلومات الحساب

account = mt5.account_info()
print(f"الرقم: {account.login}")
print(f"الخادم: {account.server}")
print(f"الرصيد: {account.balance}")
print(f"الأرباح العائمة: {account.profit}")
print(f"الرافعة: 1:{account.leverage}")
print(f"العملة: {account.currency}")

إغلاق الاتصال

mt5.shutdown()

نظّف دائماً بعد الانتهاء. اتصال MT5 مفتوح يستهلك موارد.


جلب بيانات السوق

بيانات الشموع (OHLC)

import pandas as pd
from datetime import datetime

# جلب آخر 500 شمعة H1 لـ EURUSD
rates = mt5.copy_rates_from("EURUSD", mt5.TIMEFRAME_H1, datetime.now(), 500)

# تحويل إلى DataFrame
df = pd.DataFrame(rates)
df['time'] = pd.to_datetime(df['time'], unit='s')
df.set_index('time', inplace=True)

print(df[['open', 'high', 'low', 'close', 'tick_volume']].tail())

الأطر الزمنية المتاحة

mt5.TIMEFRAME_M1   # دقيقة واحدة
mt5.TIMEFRAME_M5   # 5 دقائق
mt5.TIMEFRAME_M15  # 15 دقيقة
mt5.TIMEFRAME_M30  # 30 دقيقة
mt5.TIMEFRAME_H1   # ساعة واحدة
mt5.TIMEFRAME_H4   # 4 ساعات
mt5.TIMEFRAME_D1   # يوم واحد
mt5.TIMEFRAME_W1   # أسبوع واحد
mt5.TIMEFRAME_MN1  # شهر واحد

جلب بيانات التكة

# جلب آخر 1000 تكة
ticks = mt5.copy_ticks_from("EURUSD", datetime.now(), 1000, mt5.COPY_TICKS_ALL)
tick_df = pd.DataFrame(ticks)
tick_df['time'] = pd.to_datetime(tick_df['time_msc'], unit='ms')
print(tick_df[['time', 'bid', 'ask']].head())

معلومات الرمز

# جلب جميع الرموز المتاحة
symbols = mt5.symbols_get()
print(f"إجمالي الرموز المتاحة: {len(symbols)}")

# معلومات رمز محدد
info = mt5.symbol_info("EURUSD")
print(f"السبريد: {info.spread}")
print(f"الأرقام العشرية: {info.digits}")
print(f"النقطة: {info.point}")
print(f"أقل لوت: {info.volume_min}")
print(f"أكثر لوت: {info.volume_max}")
print(f"وضع التداول: {info.trade_mode}")

تنفيذ الأوامر من Python

أمر شراء سوقي

def market_buy(symbol, volume, sl_points=0, tp_points=0, magic=1001, deviation=20):
    """إرسال أمر شراء سوقي عبر MT5"""
    
    if not mt5.symbol_select(symbol, True):
        print(f"فشل اختيار {symbol}")
        return None
    
    point = mt5.symbol_info(symbol).point
    price = mt5.symbol_info_tick(symbol).ask
    
    request = {
        "action": mt5.TRADE_ACTION_DEAL,
        "symbol": symbol,
        "volume": float(volume),
        "type": mt5.ORDER_TYPE_BUY,
        "price": price,
        "sl": price - sl_points * point if sl_points > 0 else 0.0,
        "tp": price + tp_points * point if tp_points > 0 else 0.0,
        "magic": magic,
        "deviation": deviation,
        "comment": "Python buy",
        "type_time": mt5.ORDER_TIME_GTC,
        "type_filling": mt5.ORDER_FILLING_IOC,
    }
    
    result = mt5.order_send(request)
    
    if result.retcode != mt5.TRADE_RETCODE_DONE:
        print(f"فشل الأمر: {result.retcode} - {result.comment}")
        return None
    
    print(f"تم ملء أمر الشراء: {result.volume} لوت بسعر {result.price}")
    return result

أمر بيع سوقي

def market_sell(symbol, volume, sl_points=0, tp_points=0, magic=1001, deviation=20):
    """إرسال أمر بيع سوقي عبر MT5"""
    
    if not mt5.symbol_select(symbol, True):
        print(f"فشل اختيار {symbol}")
        return None
    
    point = mt5.symbol_info(symbol).point
    price = mt5.symbol_info_tick(symbol).bid
    
    request = {
        "action": mt5.TRADE_ACTION_DEAL,
        "symbol": symbol,
        "volume": float(volume),
        "type": mt5.ORDER_TYPE_SELL,
        "price": price,
        "sl": price + sl_points * point if sl_points > 0 else 0.0,
        "tp": price - tp_points * point if tp_points > 0 else 0.0,
        "magic": magic,
        "deviation": deviation,
        "comment": "Python sell",
        "type_time": mt5.ORDER_TIME_GTC,
        "type_filling": mt5.ORDER_FILLING_IOC,
    }
    
    result = mt5.order_send(request)
    
    if result.retcode != mt5.TRADE_RETCODE_DONE:
        print(f"فشل الأمر: {result.retcode} - {result.comment}")
        return None
    
    print(f"تم ملء أمر البيع: {result.volume} لوت بسعر {result.price}")
    return result

إغلاق مركز

def close_position(ticket, deviation=20):
    """إغلاق مركز مفتوح برقم الصفقة"""
    
    position = mt5.positions_get(ticket=ticket)
    if not position:
        print(f"المركز {ticket} غير موجود")
        return None
    
    pos = position[0]
    
    if pos.type == mt5.POSITION_TYPE_BUY:
        order_type = mt5.ORDER_TYPE_SELL
        price = mt5.symbol_info_tick(pos.symbol).bid
    else:
        order_type = mt5.ORDER_TYPE_BUY
        price = mt5.symbol_info_tick(pos.symbol).ask
    
    request = {
        "action": mt5.TRADE_ACTION_DEAL,
        "symbol": pos.symbol,
        "volume": pos.volume,
        "type": order_type,
        "position": ticket,
        "price": price,
        "deviation": deviation,
        "magic": pos.magic,
        "comment": "Python close",
        "type_time": mt5.ORDER_TIME_GTC,
        "type_filling": mt5.ORDER_FILLING_IOC,
    }
    
    result = mt5.order_send(request)
    
    if result.retcode != mt5.TRADE_RETCODE_DONE:
        print(f"فشل الإغلاق: {result.retcode}")
        return None
    
    print(f"تم إغلاق المركز {ticket} بسعر {result.price}")
    return result

فحص المراكز المفتوحة

# جلب جميع المراكز المفتوحة
positions = mt5.positions_get()

if positions:
    pos_df = pd.DataFrame([{
        'ticket': p.ticket,
        'symbol': p.symbol,
        'type': 'BUY' if p.type == mt5.POSITION_TYPE_BUY else 'SELL',
        'volume': p.volume,
        'open_price': p.price_open,
        'current_price': p.price_current,
        'profit': p.profit,
        'magic': p.magic,
    } for p in positions])
    
    print(pos_df)
    print(f"\nإجمالي الربح/الخسارة العائمة: ${sum(p.profit for p in positions):.2f}")
else:
    print("لا توجد مراكز مفتوحة")

بناء استراتيجية تقاطع SMA بسيطة في Python

إليك مثال عملي كامل يجلب البيانات، يحسب الإشارات، ويمكنه تنفيذ الصفقات:

import MetaTrader5 as mt5
import pandas as pd
import numpy as np
from datetime import datetime

def get_sma_signals(symbol, timeframe, fast_period, slow_period, bars=500):
    """توليد إشارات تقاطع SMA"""
    
    rates = mt5.copy_rates_from(symbol, timeframe, datetime.now(), bars)
    df = pd.DataFrame(rates)
    df['time'] = pd.to_datetime(df['time'], unit='s')
    df.set_index('time', inplace=True)
    
    df['sma_fast'] = df['close'].rolling(fast_period).mean()
    df['sma_slow'] = df['close'].rolling(slow_period).mean()
    
    df['signal'] = 0
    df.loc[df['sma_fast'] > df['sma_slow'], 'signal'] = 1   # صعودي
    df.loc[df['sma_fast'] < df['sma_slow'], 'signal'] = -1  # هبوطي
    
    df['crossover'] = df['signal'].diff().fillna(0)
    
    return df

# تشغيل الاستراتيجية
mt5.initialize()

df = get_sma_signals("EURUSD", mt5.TIMEFRAME_H1, fast_period=50, slow_period=200)

# عرض آخر 10 إشارات
signals = df[df['crossover'] != 0].tail(10)
print("أحدث تقاطعات SMA:")
for idx, row in signals.iterrows():
    direction = "شراء" if row['crossover'] > 0 else "بيع"
    print(f"  {idx}: إشارة {direction} (SMA50: {row['sma_fast']:.5f}, SMA200: {row['sma_slow']:.5f})")

mt5.shutdown()

الاختبار الخلفي لاستراتيجيات Python

بينما يحتوي MT5 على Strategy Tester خاص به، متداولو Python غالباً يستخدمون مكتبات اختبار مخصصة لمرونة أكبر.

مكتبات اختبار Python الموصى بها

المكتبة الأفضل لـ منحنى التعلم
vectorbt اختبار متجه سريع متوسط
backtrader اختبار قائم على الأحداث غني بالميزات متوسط
zipline خط أنابيب بأسلوب Quantopian صعب
bt تركيب الاستراتيجيات واختبارها سهل
pandas-ta مؤشرات التحليل الفني سهل

تشغيل إكسبرتات Python على VPS

بما أن Python تتصل بـ MT5 عبر IPC، يجب أن يعمل كلاهما على نفس الجهاز. للتداول 24/5:

  1. استأجر VPS ويندوز — Python + MT5 يتطلبان ويندوز (أو Wine على Linux لكنه غير موثوق)
  2. ثبّت MT5 و Python على VPS
  3. سجّل الدخول لـ MT5 واتركه يعمل
  4. شغّل سكريبت Python كعملية خلفية أو مهمة مجدولة

توصيات VPS

المزود السعر الموقع ملاحظات
ForexVPS 20$/شهر NY4, LD4 محسّن لـ MT5
Beeks VPS 25$/شهر NY4, LD4 تأخير منخفض للوسطاء
AWS EC2 (Windows) 15-30$/شهر متعدد مرن لكن يتطلب إعداداً

نصيحة: اختر VPS في نفس مركز البيانات كخوادم وسيطك. لـ IC Markets و Pepperstone، ذلك NY4 (نيويورك) أو LD4 (لندن). راجع دليل أفضل وسيط لإكسبرت MT5 لمواقع الخوادم.


قالب روبوت تداول Python كامل

إليك قالب روبوت تداول بسيط لكن وظيفي يمكنك تكييفه:

import MetaTrader5 as mt5
import pandas as pd
import time
from datetime import datetime

class SimpleBot:
    def __init__(self, symbol, magic=1001):
        self.symbol = symbol
        self.magic = magic
        self.running = False
        
    def initialize(self):
        if not mt5.initialize():
            raise Exception("فشل تهيئة MT5")
        if not mt5.symbol_select(self.symbol, True):
            raise Exception(f"فشل اختيار {self.symbol}")
        print(f"تم تهيئة البوت لـ {self.symbol}")
        
    def get_signal(self):
        """تجاوز هذه الطريقة باستراتيجيتك"""
        rates = mt5.copy_rates_from(self.symbol, mt5.TIMEFRAME_H1, datetime.now(), 250)
        df = pd.DataFrame(rates)
        
        df['sma_fast'] = df['close'].rolling(50).mean()
        df['sma_slow'] = df['close'].rolling(200).mean()
        
        if df['sma_fast'].iloc[-1] > df['sma_slow'].iloc[-1]:
            return "BUY"
        elif df['sma_fast'].iloc[-1] < df['sma_slow'].iloc[-1]:
            return "SELL"
        return None
    
    def has_open_position(self):
        positions = mt5.positions_get(symbol=self.symbol, magic=self.magic)
        return len(positions) > 0 if positions else False
    
    def execute_signal(self, signal):
        if signal == "BUY":
            self.market_buy()
        elif signal == "SELL":
            self.market_sell()
    
    def market_buy(self, volume=0.1, sl_points=200, tp_points=400):
        point = mt5.symbol_info(self.symbol).point
        price = mt5.symbol_info_tick(self.symbol).ask
        
        request = {
            "action": mt5.TRADE_ACTION_DEAL,
            "symbol": self.symbol,
            "volume": float(volume),
            "type": mt5.ORDER_TYPE_BUY,
            "price": price,
            "sl": price - sl_points * point,
            "tp": price + tp_points * point,
            "magic": self.magic,
            "deviation": 20,
            "comment": "Python bot buy",
            "type_time": mt5.ORDER_TIME_GTC,
            "type_filling": mt5.ORDER_FILLING_IOC,
        }
        
        result = mt5.order_send(request)
        if result.retcode == mt5.TRADE_RETCODE_DONE:
            print(f"تم ملء الشراء بسعر {result.price}")
        else:
            print(f"فشل الشراء: {result.comment}")
    
    def market_sell(self, volume=0.1, sl_points=200, tp_points=400):
        point = mt5.symbol_info(self.symbol).point
        price = mt5.symbol_info_tick(self.symbol).bid
        
        request = {
            "action": mt5.TRADE_ACTION_DEAL,
            "symbol": self.symbol,
            "volume": float(volume),
            "type": mt5.ORDER_TYPE_SELL,
            "price": price,
            "sl": price + sl_points * point,
            "tp": price - tp_points * point,
            "magic": self.magic,
            "deviation": 20,
            "comment": "Python bot sell",
            "type_time": mt5.ORDER_TIME_GTC,
            "type_filling": mt5.ORDER_FILLING_IOC,
        }
        
        result = mt5.order_send(request)
        if result.retcode == mt5.TRADE_RETCODE_DONE:
            print(f"تم ملء البيع بسعر {result.price}")
        else:
            print(f"فشل البيع: {result.comment}")
    
    def run(self, check_interval=60):
        self.running = True
        print(f"بدأ البوت. فحص كل {check_interval} ثانية")
        
        while self.running:
            try:
                if not self.has_open_position():
                    signal = self.get_signal()
                    if signal:
                        print(f"[{datetime.now()}] إشارة: {signal}")
                        self.execute_signal(signal)
                else:
                    pass  # انتظر إغلاق المركز
                    
            except Exception as e:
                print(f"خطأ: {e}")
            
            time.sleep(check_interval)
    
    def stop(self):
        self.running = False
        mt5.shutdown()
        print("تم إيقاف البوت")

# الاستخدام
if __name__ == "__main__":
    bot = SimpleBot("EURUSD", magic=1001)
    bot.initialize()
    
    try:
        bot.run(check_interval=300)  # فحص كل 5 دقائق
    except KeyboardInterrupt:
        bot.stop()

الأسئلة الشائعة

هل Python أفضل من MQL5 لتداول MT5؟

ليس أفضل أو أسوأ — بل مختلف. MQL5 أفضل للتنفيذ داخل MT5 (إكسبرتات تعمل مباشرة في المنصة). Python أفضل للبحث والتحليل والاختبار والتعلم الآلي. العديد من المتداولين يستخدمون كلاهما معاً.

هل يمكنني تشغيل Python على Mac/Linux؟

مكتبة MetaTrader5 تعمل فقط على ويندوز. على Mac/Linux، يمكنك استخدام Wine لتشغيل MT5، لكنه غير موثوق. بديل: استخدم VPS ويندوز أو فكر في واجهات تداول أخرى مثل FIX API أو REST APIs التي يقدمها بعض الوسطاء.

هل أحتاج تعلم MQL5 إذا كنت أعرف Python؟

لا، ليس بالضرورة. مع مكتبة MetaTrader5، يمكنك تنفيذ كل شيء من Python: جلب البيانات، إرسال الأوامر، إدارة المراكز. لكن MQL5 مفيد إذا كنت تريد إكسبرتات تعمل مباشرة داخل MT5 بدون Python يعمل بشكل منفصل.

كم من الوقت يستغرق تعلم تداول Python؟

إذا كنت تعرف أساسيات Python، يمكنك البدء في جلب البيانات وتنفيذ الأوامر في غضون ساعة. بناء استراتيجيات مربحة يأخذ وقتاً أطول — تعلم التحليل الفني وإدارة المخاطر والاختبار الخلفي. هذا الدليل يمنحك الأساس. للمزيد، راجع دليل بناء أول إكسبرت ودليل الاختبار الخلفي.

هل يمكنني استخدام التعلم الآلي للتنبؤ بأسعار الفوركس؟

نعم، لكن كن واقعياً. أسواق الفوركس صعبة التنبؤ بها. نماذج التعلم الآلي يمكن أن تجد أنماطاً خفية لكنها معرضة للإفراط في التركيب. ابدأ بنماذج بسيطة (انحدار خطي، أشجار قرار) قبل الانتقال للتعلم العميق. اختبر دائماً بشكل صارم مع بيانات خارجية.

ما أفضل وسيط لتداول Python مع MT5؟

نفس الوسطاء الموصى بهم لإكسبرتات MT5: IC Markets (أفضل أداء عام)، Exness (حد أدنى منخفض للاختبار)، Pepperstone (أسرع تنفيذ). راجع دليل أفضل وسيط لإكسبرت MT5 للتفاصيل الكاملة.


إخلاء مسؤولية: التداول الآلي بـ Python يحمل نفس مخاطر تداول الإكسبرت. روبوتات Python يمكنها خسارة المال بسرعة. اختبر دائماً على حساب تجريبي ولا تخاطر بأكثر مما تستطيع تحمل خسارته.

إفصاح التسويق بالعمولة: تحتوي هذه الصفحة على روابط تسويق بالعمولة. قد نحصل على عمولة عند النقر على روابط معينة أو التسجيل لدى الوسطاء المميزين على هذا الموقع، دون أي تكلفة إضافية عليك. مراجعاتنا وتوصياتنا مبنية على بحث شامل وتبقى محايدة.اعرف المزيد

تحذير بشأن المخاطر: تداول الفوركس وعقود الفروقات ينطوي على مخاطر كبيرة للخسارة. الأداء السابق لا يدل على النتائج المستقبلية. عقود الفروقات هي أدوات معقدة وتنطوي على مخاطر عالية لخسارة الأموال بسرعة بسبب الرافعة المالية. تأكد من فهمك للمخاطر قبل التداول. هذا المحتوى لأغراض تعليمية فقط ولا يشكل نصيحة مالية.

كتب بواسطة

فريق Pips Growth

فريق التعليم والأبحاث في التداول

فريق Pips Growth هو مجموعة من المتداولين ذوي الخبرة والمحللين الماليين ومعلمي التداول المكرسين لتقديم تعليم فوركس دقيق وعملي. يجمع فريقنا بين عقود من الخبرة العملية في الأسواق والمعرفة التقنية العميقة لإنشاء أدلة شاملة ومراجعات صادقة للوسطاء واستراتيجيات تداول مجربة. يتم البحث في كل مقال بدقة والتحقق من صحته ومراجعته من قبل عدة أعضاء في الفريق لضمان أعلى جودة ودقة.

15+ سنة خبرة53+ مقال منشور
تداول الفوركس والعقود مقابل الفروقاتالتحليل الفنيإدارة المخاطرمراجعات وتقييم الوسطاء
عرض الملف الشخصي الكامل
مشاركة

اشترك في النشرة

دليل تداول الفوركس بـ Python: ربط MetaTrader 5 بـ Python | PipsGrowth