دليل تداول الفوركس بـ 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 للبحث والتحليل والاختبار.
التركيب
المتطلبات
- MetaTrader 5 مثبت ويعمل (نسخة Windows)
- Python 3.8+ — حمّله من python.org
- حساب 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:
- استأجر VPS ويندوز — Python + MT5 يتطلبان ويندوز (أو Wine على Linux لكنه غير موثوق)
- ثبّت MT5 و Python على VPS
- سجّل الدخول لـ MT5 واتركه يعمل
- شغّل سكريبت 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 هو مجموعة من المتداولين ذوي الخبرة والمحللين الماليين ومعلمي التداول المكرسين لتقديم تعليم فوركس دقيق وعملي. يجمع فريقنا بين عقود من الخبرة العملية في الأسواق والمعرفة التقنية العميقة لإنشاء أدلة شاملة ومراجعات صادقة للوسطاء واستراتيجيات تداول مجربة. يتم البحث في كل مقال بدقة والتحقق من صحته ومراجعته من قبل عدة أعضاء في الفريق لضمان أعلى جودة ودقة.