التداول الخوارزمي لم يعد حكراً على البنوك الاستثمارية الكبرى وصناديق التحوط — بل أصبح في متناول أي مطور أو متداول متقدم يمتلك الأدوات الصحيحة. وAPIMEXEM — المبنية على بنية Interactive Brokers التقنية — هي من أقوى وأشمل واجهات برمجية في صناعة الوساطة الأوروبية. فكما كشفنا في مقارنتنا الموضوعية بين MEXEM وأبرز الوسطاء الأوروبيين، API MEXEM هي إحدى النقاط التي يتفوق فيها MEXEM على غالبية المنافسين تفوقاً واضحاً.
في هذا المقال، نستعرض بعمق كيف تعمل API MEXEM، ما البروتوكولات والمكتبات المتاحة، وكيف تبني أول بوت تداول خوارزمي من الصفر — مع أمثلة كود حقيقية وقابلة للتطبيق.
| نوع الـ API | TWS API + Client Portal (Web) API |
| اللغات المدعومة | Python, Java, C++, C#, DDE للـ Excel |
| البروتوكول | TCP/IP Socket (TWS) + REST/WebSocket (Portal) |
| الأسواق المتاحة | كل أسواق MEXEM: أسهم + ETF + خيارات + عقود آجلة + سندات |
| سرعة التنفيذ | ميلي ثانية — مناسبة لاستراتيجيات متوسطة السرعة |
| بيانات السوق | بيانات فورية + تاريخية + L2 Order Book |
| الحساب التجريبي | Paper Trading Account — اختبر بدون مخاطر |
| التوثيق | Interactive Brokers API Documentation الرسمية |
اقرأ تقييم MEXEM الشامل والموضوعي على theqabrokers.com — تحليل معمّق لكل جوانب الوسيط.
التداول الخوارزمي (Algorithmic Trading) هو تنفيذ صفقات التداول تلقائياً باستخدام برامج حاسوبية تتخذ القرارات بناءً على معايير محددة مسبقاً — سواء كانت إشارات تقنية، بيانات أساسية، أحداث إخبارية، أو معادلات رياضية — دون الحاجة لتدخل بشري في كل صفقة.
لماذا MEXEM API تحديداً؟
تعمل عبر بروتوكول TCP/IP Socket. تتصل مباشرةً بـ Trader Workstation أو IB Gateway المُثبَّت على جهازك. تُتيح الوصول لجميع إمكانيات MEXEM بدون استثناء.
| الخاصية | التفاصيل |
| بروتوكول الاتصال | TCP/IP Socket — localhost:7497 (live) أو 7496 (paper) |
| اللغات الرسمية | Python, Java, C++, C# — مكتبات رسمية من IBKR |
| الوصول للبيانات | بيانات فورية + تاريخية + L2 + أخبار + ملخص الحساب |
| الأوامر المتاحة | جميع أنواع الأوامر (Market, Limit, Stop, Algo, Options…) |
| الحد الأقصى للطلبات | 50 رسالة/ثانية (ضبط آلي للوتيرة مطلوب) |
| المتطلبات | TWS أو IB Gateway مُشغَّل محلياً |
| الموثوقية | ممتازة — بنية IBKR المُثبَتة منذ عقود |
واجهة REST/WebSocket تعمل عبر HTTP بدون الحاجة لتثبيت TWS محلياً. مثالية للحلول السحابية والتشغيل على خوادم بعيدة.
| الخاصية | التفاصيل |
| بروتوكول الاتصال | HTTPS REST + WebSocket |
| المتطلبات | لا يحتاج TWS — يعمل على أي خادم |
| المصادقة | OAuth 2.0 — آمنة وحديثة |
| الأنسب لـ | النشر السحابي + التطبيقات المبنية على ويب |
| محدودية | أقل شمولاً من TWS API في بعض الميزات المتقدمة |
| الوثائق | swagger/OpenAPI specification رسمية |
قم بتنزيل IB Gateway (أخف من TWS، مخصص للتشغيل الآلي) من موقع Interactive Brokers وتثبيته. فعّل خيار “Enable ActiveX and Socket Clients” من قائمة Edit → Global Configuration → API → Settings.
| # تثبيت ib_insync (مكتبة مجتمعية شائعة)pip install ib_insync # أو المكتبة الرسمية من IBKRpip install ibapi |
| from ib_insync import * # الاتصال بحساب Paper Trading (المنفذ 7497)ib = IB()ib.connect(‘127.0.0.1’, 7497, clientId=1) # طباعة ملخص الحسابaccount = ib.accountSummary()for item in account[:5]: print(f”{item.tag}: {item.value} {item.currency}”) ib.disconnect() |
تنبيه مهم: استخدم دائماً المنفذ 7497 (Paper Trading) في مرحلة الاختبار، والمنفذ 7496 فقط حين تكون جاهزاً تماماً للتداول الحقيقي. أخطاء الكود في الحساب الحقيقي تُنفَّذ فوراً بأموال حقيقية.
أ) بيانات الأسعار الفورية (Market Data)
| from ib_insync import * ib = IB()ib.connect(‘127.0.0.1’, 7497, clientId=1) # تحديد الأصل: سهم Apple في NASDAQstock = Stock(‘AAPL’, ‘SMART’, ‘USD’) # طلب بيانات فوريةib.qualifyContracts(stock)ticker = ib.reqMktData(stock) # انتظار البياناتib.sleep(2) print(f”السعر الحالي: {ticker.last}”)print(f”عرض الشراء: {ticker.bid}”)print(f”عرض البيع: {ticker.ask}”)print(f”حجم التداول: {ticker.volume}”) |
ب) البيانات التاريخية (Historical Data)
| # جلب بيانات يومية لآخر سنةbars = ib.reqHistoricalData( stock, endDateTime=”, durationStr=’1 Y’, barSizeSetting=’1 day’, whatToShow=’TRADES’, useRTH=True) # تحويل لـ DataFrameimport pandas as pddf = util.df(bars)print(df.tail()) |
📈 الاستراتيجية الأولى: تقاطع المتوسطات المتحركة (MA Crossover)
من أبسط وأشهر الاستراتيجيات الخوارزمية: حين يتقاطع المتوسط المتحرك القصير (مثل 20 يوماً) فوق المتوسط الطويل (50 يوماً) — شراء. حين يتقاطع تحته — بيع. بسيطة، قابلة للفهم والاختبار، ومناسبة كنقطة بداية.
| import pandas as pdfrom ib_insync import * def ma_crossover_signal(df, short=20, long=50): df[‘MA_short’] = df[‘close’].rolling(short).mean() df[‘MA_long’] = df[‘close’].rolling(long).mean() df[‘signal’] = 0 df.loc[df[‘MA_short’] > df[‘MA_long’], ‘signal’] = 1 # شراء df.loc[df[‘MA_short’] < df[‘MA_long’], ‘signal’] = -1 # بيع return df |
⚖️ الاستراتيجية الثانية: المراجحة الإحصائية (Pairs Trading)
شراء سهم وبيع سهم مرتبط به آنياً حين ينحرفان عن علاقتهما التاريخية — مراهنة على العودة للمتوسط. مثال: AAPL وMSFT، أو BP وShell، أو سهمَان في نفس القطاع. التنفيذ يحتاج دقة عالية واختباراً إحصائياً مسبقاً.
| import numpy as npfrom scipy import stats def check_pair_signal(price_a, price_b, window=60, threshold=2.0): # نسبة التسعير بين السهمَين ratio = price_a / price_b mean = ratio.rolling(window).mean() std = ratio.rolling(window).std() z_score = (ratio – mean) / std # إشارة شراء: Z > +threshold -> بيع A وشراء B # إشارة بيع: Z < -threshold -> شراء A وبيع B return z_score.iloc[-1] |
🕒 الاستراتيجية الثالثة: تنفيذ VWAP — تقليل تأثير الصفقات الكبيرة
لمن يريد تنفيذ أوامر كبيرة بأقل تأثير على السوق: خوارزمية VWAP المدمجة في MEXEM API تُوزّع الأمر الكبير على مدار اليوم بما يتناسب مع حجم التداول في كل فترة — تُقلّل من “تأثير السوق” وتحصل على متوسط سعر تنفيذ أقرب لمتوسط اليوم الفعلي.
| # استخدام خوارزمية VWAP المدمجة مباشرةfrom ib_insync import * order = Order()order.action = ‘BUY’order.orderType = ‘IBALGO’order.algoStrategy = ‘Vwap’order.totalQuantity = 1000order.algoParams = [ TagValue(‘startTime’, ’09:30:00 US/Eastern’), TagValue(‘endTime’, ’16:00:00 US/Eastern’), TagValue(‘maxPctVol’, ‘0.1’), # 10% من حجم السوق TagValue(‘noTakeLiq’, ‘0’),] |
🔄 الاستراتيجية الرابعة: إعادة التوازن الآلي للمحفظة
بناء بوت يُعيد التوازن لمحفظتك الاستثمارية آلياً بناءً على أوزان مُحددة مسبقاً — مثلاً 60% أسهم + 30% ETFs + 10% ذهب. مرة شهرياً أو ربع سنوياً، يفحص البوت الأوزان الحالية ويُنفّذ الصفقات اللازمة لإعادتها للأهداف. هذا يُكمل خطة الادخار الآلية التي تحدثنا عنها — لكن بمستوى تحكم برمجي أعلى بكثير.
ابدأ التداول الخوارزمي مع MEXEM API اليوم! افتح حسابك مجاناً في MEXEM — بدون حد أدنى للإيداع، وصول فوري لـ API الاحترافية من اليوم الأول. ► افتح حسابك المجاني في MEXEM الآن
| from ib_insync import * ib = IB()ib.connect(‘127.0.0.1’, 7497, clientId=1) # تحديد الأصلstock = Stock(‘MSFT’, ‘SMART’, ‘USD’)ib.qualifyContracts(stock) # إنشاء أمر الشراءorder = MarketOrder(‘BUY’, 10) # شراء 10 أسهم # تنفيذ الأمرtrade = ib.placeOrder(stock, order)ib.sleep(3) print(f’حالة الأمر: {trade.orderStatus.status}’)print(f’سعر التنفيذ: {trade.orderStatus.avgFillPrice}’) |
| # Bracket Order: شراء + هدف ربح + وقف خسارةbracket = ib.bracketOrder( action = ‘BUY’, quantity = 100, limitPrice = 185.00, # سعر الشراء المحدد takeProfitPrice = 195.00, # هدف الربح stopLossPrice = 178.00 # وقف الخسارة) # تنفيذ الثلاثة أوامر دفعة واحدةfor o in bracket: ib.placeOrder(stock, o) |
| # استخدام Events للاستجابة الفوريةdef on_order_status(trade, fill): print(f’تنفيذ: {fill.shares} سهم بسعر {fill.execution.price}’) def on_pnl_update(account, portfolio, positions): for pos in positions: print(f'{pos.contract.symbol}: P&L = {pos.unrealizedPnL}’) # ربط الدوال بالأحداثib.execDetailsEvent += on_order_statusib.updatePortfolioEvent += on_pnl_update # تشغيل حلقة الأحداثib.run() |
أي بوت تداول بدون إدارة مخاطر مدمجة هو قنبلة موقوتة. كما ذكرنا في مقالنا عن لماذا MEXEM هو الوسيط الأوروبي الأكثر أماناً، الأمان لا يقتصر على الوسيط — بل يشمل منطق الكود نفسه.
🛡️ الحد الأقصى للخسارة اليومية (Daily Loss Limit)
أضف للبوت شرطاً: إذا تجاوزت الخسارة اليومية X% من رأس المال، أوقف كل التداول لبقية اليوم. لا تترك للبوت حرية خسارة لا محدودة في يوم واحد سيئ.
| def check_daily_loss_limit(ib, max_loss_pct=0.02): account = {a.tag: float(a.value) for a in ib.accountSummary()} net_liq = account.get(‘NetLiquidation’, 0) daily_pnl = account.get(‘RealizedPnL’, 0) daily_pnl += account.get(‘UnrealizedPnL’, 0) loss_pct = abs(daily_pnl) / net_liq if daily_pnl < 0 else 0 if loss_pct > max_loss_pct: print(f’تجاوز حد الخسارة اليومية: {loss_pct:.1%}’) cancel_all_orders(ib) return False return True |
📊 الحد الأقصى لحجم المراكز (Position Sizing)
لا تترك للبوت فتح مراكز بأحجام غير محدودة. اجعل حجم كل مركز نسبة ثابتة من رأس المال — مثلاً 5% كحد أقصى لأي مركز واحد. هذا يمنع “مضاعفة” الخسارة في صفقة واحدة سيئة.
⏱️ اختبار الخلفية (Backtesting) قبل التشغيل
قبل تشغيل أي بوت بأموال حقيقية، اختبره على بيانات تاريخية لأطول فترة ممكنة. إذا خسر في الاختبار الخلفي — سيخسر في الحقيقي غالباً. إذا ربح في الاختبار فقط — راجع هل اختبارك متحيز (Overfitting).
| الأداة | الاستخدام | اللغة | مستوى الصعوبة |
| ib_insync | أفضل مكتبة Python لـ TWS API — واجهة async أنيقة | Python | سهل |
| ibapi (رسمية) | المكتبة الرسمية من IBKR — أكثر تحكماً | Python/Java/C++ | متوسط |
| zipline-reloaded | منصة Backtesting + Live Trading | Python | متوسط |
| backtrader | محاكاة الاستراتيجيات وBacktesting | Python | متوسط |
| pandas-ta | حساب المؤشرات الفنية (RSI, MACD…) | Python | سهل |
| alpaca + MEXEM | بعض المطورين يستخدمان معاً | Python | متوسط |
| Jupyter Notebook | اختبار وتطوير الاستراتيجيات تفاعلياً | Python | سهل |
| Docker | نشر البوت على خادم سحابي باستمرار | DevOps | متوسط-صعب |
إليك هيكل بوت تداول متكامل يدمج كل ما تعلمناه: الاتصال، جلب البيانات، الإشارة، التنفيذ، وإدارة المخاطر:
| from ib_insync import *import pandas as pdimport logging logging.basicConfig(level=logging.INFO)log = logging.getLogger(__name__) class MexemAlgoBot: def __init__(self, paper=True): self.ib = IB() self.port = 7497 if paper else 7496 self.max_loss = 0.02 # 2% حد الخسارة اليومية def connect(self): self.ib.connect(‘127.0.0.1’, self.port, clientId=10) log.info(‘متصل بـ MEXEM API’) def get_signal(self, symbol: str) -> int: stock = Stock(symbol, ‘SMART’, ‘USD’) self.ib.qualifyContracts(stock) bars = self.ib.reqHistoricalData( stock, endDateTime=”, durationStr=’3 M’, barSizeSetting=’1 day’, whatToShow=’TRADES’, useRTH=True ) df = util.df(bars) df[‘ma20’] = df[‘close’].rolling(20).mean() df[‘ma50’] = df[‘close’].rolling(50).mean() last = df.iloc[-1] if last[‘ma20’] > last[‘ma50’]: return 1 # إشارة شراء elif last[‘ma20’] < last[‘ma50’]: return -1 # إشارة بيع return 0 def execute(self, symbol: str, action: str, qty: int): if not self.check_risk(): return stock = Stock(symbol, ‘SMART’, ‘USD’) self.ib.qualifyContracts(stock) trade = self.ib.placeOrder(stock, MarketOrder(action, qty)) self.ib.sleep(2) log.info(f’تنفيذ: {action} {qty} {symbol} @ {trade.orderStatus.avgFillPrice}’) def check_risk(self) -> bool: return check_daily_loss_limit(self.ib, self.max_loss) def run(self, symbols: list): self.connect() for sym in symbols: sig = self.get_signal(sym) if sig == 1: self.execute(sym, ‘BUY’, 10) elif sig == -1: self.execute(sym, ‘SELL’, 10) self.ib.disconnect() # تشغيل البوت بحساب Paper Tradingbot = MexemAlgoBot(paper=True)bot.run([‘AAPL’, ‘MSFT’, ‘GOOGL’]) |
API MEXEM لا تعمل بمعزل — بل هي طبقة التحكم الكاملة لجميع ما يُقدّمه MEXEM. يمكن للمطور بناء نظام يتحكم في:
API MEXEM هي المسار الذي يُفتح أمام المطور والمتداول المتقدم للانتقال من “تنفيذ يدوي” إلى “نظام استثماري ذكي” يعمل على مدار الساعة. ومع دعم لغات متعددة، بيانات فورية بجودة مؤسسية، وخوارزميات تنفيذ مدمجة كـ VWAP وTWAP — أنت تمتلك أدوات كانت حكراً على بنوك الاستثمار الكبرى حتى وقت قريب. وكما استعرضنا في مقالنا عن كيف تبدأ رحلتك الاستثمارية مع MEXEM، البداية لا تحتاج رأس مال ضخم — بل حسابًا مجانيًا وفكرة واضحة.
وللاطّلاع على التقييم الكامل والموضوعي لكل ما يُقدّمه هذا الوسيط — توجّه إلى تقييم MEXEM الشامل على theqabrokers.com.
| اقرأ التقييم الكامل تقييم MEXEM على theqabrokers.com | ابدأ البرمجة الآن افتح حسابك مجاناً في MEXEM |
إخلاء المسؤولية
جميع الاستثمارات تنطوي على مخاطر. الأكواد والأمثلة البرمجية المذكورة لأغراض تعليمية فقط — اختبرها دائماً في بيئة Paper Trading قبل تفعيلها بأموال حقيقية. التداول الخوارزمي لا يضمن الأرباح. MEXEM Ltd وسيط منظَّم من CySEC برقم ترخيص 325/17.
تمتع بالدعم الفوري لدى ثقة بروكز! تواصل معنا عبر الواتساب الآن.