چگونه مشکل «Trade Context Busy» را در متاتریدر حل کنیم؟ رفع خطای 146

چگونه مشکل «Trade Context Busy» را در متاتریدر حل کنیم

اگر هنگام اجرای معامله یا فعالیت یک اکسپرت در متاتریدر با پیام Trade Context Busy مواجه شده‌اید، معمولاً به این معناست که ترمینال در همان لحظه درگیر پردازش یک عملیات معاملاتی دیگر است. در ادامه چگونه مشکل «Trade Context Busy» را در متاتریدر حل کنیم را بررسی خواهیم کرد.

این مشکل به‌خصوص در MetaTrader 4 (MT4) دیده می‌شود و در مستندات رسمی MQL4 با کد 146 و نام ERR_TRADE_CONTEXT_BUSY ثبت شده است.

راه‌حل سریع: اگر کاربر عادی هستید، ابتدا معامله‌ها و اکسپرت‌های فعال را بررسی کنید، اکسپرت‌های غیرضروری را موقتاً متوقف کنید و در صورت باقی ماندن خطا، متاتریدر را ببندید و دوباره اجرا کنید. اگر چند EA روی یک حساب فعال هستند، اجرای آن‌ها در چند ترمینال جداگانه نیز می‌تواند احتمال تداخل را کاهش دهد.

اما برای اینکه مشکل دوباره ایجاد نشود، باید علت اصلی آن را پیدا کرد.

مشکل Trade Context Busy چیست؟

Trade Context Busy یک خطای مرتبط با محیط معاملاتی متاتریدر ۴ است. این خطا زمانی ایجاد می‌شود که یک عملیات معاملاتی هنوز در حال پردازش باشد و عملیات دیگری بخواهد تقریباً هم‌زمان از همان مسیر معاملاتی استفاده کند.

در MQL4 این وضعیت با خطای 146 گزارش می‌شود:

ERR_TRADE_CONTEXT_BUSY

مستندات MQL4 این خطا را به‌صورت مستقیم «Trade context is busy» تعریف کرده است.

به زبان ساده، فرض کنید یک اکسپرت در حال ارسال درخواست باز کردن معامله است. قبل از اینکه این عملیات تمام شود، اکسپرت دیگری یا یک اسکریپت تلاش می‌کند معامله دیگری را ارسال یا یک سفارش را تغییر دهد. در چنین شرایطی ممکن است درخواست دوم با خطای Trade Context Busy مواجه شود.

این وضعیت به معنی خراب شدن حساب معاملاتی یا بسته شدن حساب توسط بروکر نیست. مشکل معمولاً به نحوه مدیریت هم‌زمان عملیات معاملاتی در ترمینال مربوط است.

خطای 146 چرا در متاتریدر ایجاد می‌شود؟

خطای 146 چرا در متاتریدر ایجاد می‌شود؟

چند عامل می‌تواند احتمال بروز این خطا را افزایش دهد.

اجرای هم‌زمان چند اکسپرت

یکی از رایج‌ترین دلایل، فعال بودن چند Expert Advisor روی نمودارهای مختلف یک ترمینال است.

برای مثال، ممکن است سه اکسپرت روی نمودارهای EURUSD، GBPUSD و XAUUSD فعال باشند. اگر دو یا چند اکسپرت تقریباً در یک زمان بخواهند سفارش ارسال کنند یا سفارش‌های قبلی را تغییر دهند، احتمال تداخل افزایش پیدا می‌کند.

این مسئله در اکسپرت‌هایی که معاملات زیادی انجام می‌دهند یا مرتباً سفارش‌ها را اصلاح می‌کنند بیشتر قابل مشاهده است.

اجرای هم‌زمان اسکریپت و اکسپرت

تداخل فقط میان دو EA اتفاق نمی‌افتد.

ممکن است یک اکسپرت در حال انجام عملیات معاملاتی باشد و هم‌زمان یک Script نیز تلاش کند سفارش جدیدی ارسال کند.

بنابراین اگر خطا فقط گاهی ظاهر می‌شود، بررسی کنید چه ابزارهای معاملاتی هم‌زمان روی ترمینال فعال هستند.

ارسال بیش از حد درخواست معاملاتی

اکسپرتی که بدون کنترل مناسب، پشت سر هم درخواست ارسال، اصلاح یا بستن معامله ایجاد می‌کند، می‌تواند شرایط مناسبی برای بروز خطا ایجاد کند.

برای مثال، اگر یک EA در هر تیک بازار دوباره تلاش کند یک سفارش را اصلاح کند، تعداد درخواست‌های معاملاتی می‌تواند بسیار زیاد شود.

در چنین شرایطی مشکل فقط Trade Context Busy نیست؛ خطاهای دیگری مانند درخواست‌های بیش از حد نیز ممکن است ظاهر شوند. مستندات MQL4 خطاهای جداگانه‌ای مانند ERR_TOO_FREQUENT_REQUESTS و ERR_TOO_MANY_REQUESTS نیز تعریف کرده است.

اجرای چند عملیات معاملاتی در فاصله بسیار کوتاه

گاهی مشکل از چند اکسپرت مختلف نیست.

ممکن است خود یک اکسپرت چند عملیات را با فاصله بسیار کم اجرا کند؛ برای مثال:

  1. ارسال سفارش
  2. اصلاح Stop Loss
  3. اصلاح Take Profit
  4. ارسال سفارش بعدی

اگر برنامه‌نویسی EA این عملیات را بدون مدیریت صحیح انجام دهد، احتمال تداخل بیشتر می‌شود.

چگونه مشکل Trade Context Busy را سریع حل کنیم؟

چگونه مشکل Trade Context Busy را سریع حل کنیم؟

اگر با این خطا مواجه شده‌اید، بهتر است مراحل زیر را به ترتیب انجام دهید.

روش اول، متاتریدر را بررسی کنید

ابتدا ببینید آیا چند اکسپرت روی نمودارهای مختلف فعال هستند یا خیر.

در صورت نیاز، اکسپرت‌های غیرضروری را موقتاً غیرفعال کنید.

اگر مشکل بعد از این کار برطرف شد، احتمالاً یکی از EAها یا ترکیب چند اکسپرت عامل اصلی بوده است.

روش دوم، اکسپرت‌های فعال را کاهش دهید

اگر چند EA را روی یک حساب اجرا می‌کنید، بهتر است تعداد آن‌ها را کاهش دهید یا فعالیت آن‌ها را میان چند ترمینال MT4 تقسیم کنید.

این راهکار از سوی برخی مراکز پشتیبانی بروکرها نیز برای کاهش احتمال تداخل پیشنهاد شده است.

برای مثال، به‌جای اجرای هم‌زمان تعداد زیادی EA در یک ترمینال، می‌توانید آن‌ها را در دو یا چند نصب جداگانه MT4 اجرا کنید.

روش سوم، متاتریدر را یک‌بار راه‌اندازی مجدد کنید

اگر خطا موقتی است و نمی‌دانید کدام ابزار باعث آن شده، متاتریدر را ببندید و دوباره اجرا کنید.

این کار وضعیت موقت ترمینال را از ابتدا ایجاد می‌کند و در برخی موارد مشکل را برطرف می‌کند. راه‌اندازی مجدد ترمینال یکی از راهکارهای مستقیم پیشنهادشده برای این خطا است.

البته اگر علت اصلی، اجرای هم‌زمان چند EA باشد، ری‌استارت فقط یک راه‌حل موقت است و مشکل ممکن است دوباره برگردد.

روش چهارم، بخش Journal و Experts را بررسی کنید

اگر مشکل ادامه دارد، فقط به پیام روی صفحه اکتفا نکنید.

در متاتریدر، بخش‌های Journal و Experts را بررسی کنید.

این لاگ‌ها می‌توانند نشان دهند که:

  • کدام EA درخواست را ارسال کرده است.
  • خطا در چه زمانی رخ داده است.
  • چه عملیات معاملاتی در همان لحظه در حال انجام بوده است.
  • آیا خطاهای دیگری هم‌زمان ایجاد شده‌اند یا خیر.

این روش به‌خصوص زمانی مفید است که چند اکسپرت روی حساب فعال باشد.

چگونه بفهمیم مشکل از کدام اکسپرت است؟

اگر چند EA دارید، بهترین روش این است که به‌صورت مرحله‌ای آن‌ها را بررسی کنید.

بررسی مرحله‌ای اکسپرت‌ها

ابتدا همه اکسپرت‌های غیرضروری را متوقف کنید.

سپس فقط اکسپرت موردنظر را فعال کنید و عملکرد آن را بررسی کنید.

اگر خطا دیگر مشاهده نشد، EAها را یکی‌یکی فعال کنید.

به این ترتیب می‌توانید متوجه شوید:

  • آیا یک EA به‌تنهایی مشکل ایجاد می‌کند؟
  • آیا مشکل فقط هنگام اجرای دو EA به وجود می‌آید؟
  • آیا یک EA خاص درخواست‌های معاملاتی بیش از حد ارسال می‌کند؟

این روش از حذف تصادفی فایل‌های متاتریدر بهتر است، زیرا بدون تغییر غیرضروری در نصب نرم‌افزار می‌توانید منبع مشکل را پیدا کنید.

آیا Trade Context Busy مشکل اینترنت یا بروکر است؟

در اغلب موارد، نباید این خطا را مستقیماً به قطع اینترنت یا خراب بودن سرور بروکر نسبت داد.

خطای 146 در MQL4 به وضعیت Trade Context مربوط است. یعنی ترمینال در زمان ارسال درخواست، مسیر انجام عملیات معاملاتی را درگیر می‌بیند.

البته مشکلات ارتباطی می‌توانند باعث خطاهای معاملاتی دیگری شوند.

برای مثال، MQL4 خطاهای جداگانه‌ای برای مواردی مانند:

  • قطع ارتباط
  • Timeout
  • Requote
  • Off Quotes
  • Broker Busy

دارد.

بنابراین اگر هم‌زمان چند نوع خطا در Journal مشاهده می‌کنید، نباید همه آن‌ها را تحت عنوان Trade Context Busy قرار دهید.

آیا چند اکسپرت می‌توانند روی یک حساب کار کنند؟

آیا چند اکسپرت می‌توانند روی یک حساب کار کنند؟

بله، اما اجرای چند اکسپرت روی یک ترمینال MT4 نیازمند مدیریت مناسب است.

مشکل اصلی این نیست که صرفاً چند EA روی حساب وجود دارد. مسئله زمانی ایجاد می‌شود که چند ابزار بخواهند عملیات معاملاتی خود را در زمان‌های نزدیک به هم انجام دهند.

برای مثال:

وضعیت احتمال تداخل
یک EA با درخواست‌های کنترل‌شده پایین‌تر
چند EA روی نمودارهای مختلف بیشتر
چند EA با معاملات هم‌زمان بالا
EA با ارسال درخواست‌های بسیار سریع بالا
چند EA اسکالپینگ در یک ترمینال می‌تواند بسیار بالا باشد

در چنین شرایطی، جدا کردن EAها در چند ترمینال MT4 می‌تواند راهکار مناسبی باشد.

تفاوت Trade Context Busy در متاتریدر ۴ و ۵ چیست؟

این قسمت اهمیت زیادی دارد، چون عبارت Trade Context Busy بیشتر به ساختار معاملاتی MT4 و خطای 146 در MQL4 مربوط است.

در مستندات MQL4، خطای 146 به‌طور مشخص با عنوان ERR_TRADE_CONTEXT_BUSY ثبت شده است.

در MetaTrader 5 ساختار ارسال درخواست‌های معاملاتی متفاوت است. در MQL5، درخواست از طریق ساختار MqlTradeRequest ارسال و نتیجه در MqlTradeResult دریافت می‌شود و باید retcode نتیجه نیز بررسی شود.

بنابراین نباید هر خطای معاملاتی در MT5 را به‌عنوان «خطای 146» معرفی کرد.

در MT5 کدهای مختلفی برای وضعیت درخواست وجود دارد؛ برای نمونه TRADE_RETCODE_DONE، TRADE_RETCODE_REQUOTE و TRADE_RETCODE_TIMEOUT در مستندات رسمی تعریف شده‌اند.

پس اگر مقاله یا آموزشی درباره Error 146 صحبت می‌کند، منظور اصلی آن MetaTrader 4 است.

راه‌حل برنامه‌نویسی برای اکسپرت‌ها چیست؟

اگر توسعه‌دهنده EA هستید، صرفاً ری‌استارت متاتریدر راه‌حل مناسبی نیست.

در MQL4 می‌توان وضعیت مجاز بودن عملیات معاملاتی و وضعیت Trade Context را قبل از اجرای عملیات بررسی کرد. مستندات و مقاله رسمی MQL4 درباره خطای 146 نیز استفاده از بررسی‌هایی مانند IsTradeAllowed() را برای مدیریت این وضعیت توضیح می‌دهد.

همچنین در صورت دریافت خطای 146، برنامه می‌تواند به‌جای تلاش‌های پشت سر هم، برای مدت کوتاهی صبر کرده و سپس دوباره درخواست را بررسی کند.

مدیریت درخواست‌های تکراری

یک EA حرفه‌ای نباید در صورت شکست یک سفارش، بدون هیچ محدودیتی بلافاصله صدها بار همان درخواست را تکرار کند.

منطق مناسب باید:

  1. خطا را تشخیص دهد.
  2. کد خطا را ثبت کند.
  3. مدت کوتاهی منتظر بماند.
  4. وضعیت بازار و سفارش را دوباره بررسی کند.
  5. فقط در صورت مناسب بودن شرایط، درخواست را مجدداً ارسال کند.

این کار علاوه بر Trade Context Busy، از ایجاد درخواست‌های اضافی نیز جلوگیری می‌کند.

آیا تابع IsTradeAllowed همیشه مشکل را حل می‌کند؟

آیا تابع IsTradeAllowed همیشه مشکل را حل می‌کند؟

خیر.

این نکته برای برنامه‌نویسان مهم است.

بررسی وضعیت Trade Context درست قبل از ارسال سفارش می‌تواند مفید باشد، اما به‌تنهایی تضمین نمی‌کند که درخواست بعدی حتماً بدون خطا اجرا شود.

ممکن است دو اکسپرت تقریباً در یک لحظه وضعیت را آزاد ببینند و سپس هر دو تلاش کنند عملیات معاملاتی خود را انجام دهند.

بنابراین مدیریت واقعی باید علاوه بر بررسی اولیه، خطای 146 و منطق تکرار درخواست را نیز مدیریت کند.

مقاله رسمی MQL4 درباره خطای 146 نیز به همین مسئله و روش‌های هماهنگ کردن عملیات چند Expert Advisor پرداخته است.

در صورت تکرار خطا چه کار کنیم؟

اگر با وجود غیرفعال کردن EAهای اضافی و راه‌اندازی مجدد متاتریدر همچنان مشکل وجود دارد، این چک‌لیست را دنبال کنید:

  • تعداد EAهای فعال را بررسی کنید.
  • اسکریپت‌های در حال اجرا را بررسی کنید.
  • بخش Experts را بررسی کنید.
  • بخش Journal را بررسی کنید.
  • ببینید آیا خطا فقط هنگام اجرای یک EA خاص رخ می‌دهد.
  • بررسی کنید EA درخواست‌های معاملاتی زیادی ارسال نکند.
  • در صورت امکان EAها را در چند ترمینال جداگانه اجرا کنید.
  • نسخه متاتریدر و سازگاری EA را بررسی کنید.
  • اگر خودتان کدنویسی می‌کنید، مدیریت خطای 146 را در کد اضافه کنید.
  • در صورت ادامه مشکل، با غیرفعال کردن EAها مشخص کنید آیا مشکل واقعاً از Trade Context است یا خطای دیگری هم وجود دارد.

اشتباهات رایج هنگام رفع Trade Context Busy

بستن و باز کردن مداوم متاتریدر

اگر هر بار که خطا ظاهر می‌شود فقط متاتریدر را ری‌استارت کنید، ممکن است مشکل اصلی باقی بماند.

اگر چند EA هم‌زمان فعال هستند، بعد از مدتی احتمالاً خطا دوباره ایجاد می‌شود.

نسبت دادن تمام خطاها به بروکر در چگونه مشکل «Trade Context Busy» را در متاتریدر حل کنیم؟

Trade Context Busy الزاماً به معنای مشکل بروکر نیست.

ابتدا باید وضعیت ترمینال، EAها و درخواست‌های معاملاتی را بررسی کنید.

اجرای تعداد زیادی اکسپرت در یک ترمینال

فعال کردن تعداد زیادی EA روی یک MT4، به‌خصوص اگر چند اکسپرت فعالیت معاملاتی زیادی داشته باشند، می‌تواند مدیریت درخواست‌ها را دشوارتر کند.

ارسال مجدد سفارش بدون کنترل

اگر یک EA بعد از دریافت خطا بدون تأخیر و بدون بررسی مجدد، درخواست را بارها ارسال کند، مشکل می‌تواند تشدید شود.

چگونه از بروز دوباره این خطا جلوگیری کنیم؟

چگونه از بروز دوباره این خطا جلوگیری کنیم؟

بهترین راه، پیشگیری از تداخل است.

برای کاربران عادی، تعداد EAهای فعال را تا حد امکان مدیریت کنید و ابزارهایی را که واقعاً به آن‌ها نیاز ندارید روی ترمینال اجرا نکنید.

اگر چند سیستم معاملاتی دارید، می‌توانید آن‌ها را بین چند نصب MT4 تقسیم کنید. این روش تعداد ابزارهایی را که در یک ترمینال برای ارسال درخواست معاملاتی رقابت می‌کنند کاهش می‌دهد.

برای برنامه‌نویسان نیز مهم است که EA را طوری طراحی کنند که:

  • درخواست‌های غیرضروری ارسال نکند.
  • عملیات معاملاتی را پشت سر هم بدون کنترل اجرا نکند.
  • خطاهای معاملاتی را ثبت کند.
  • خطای 146 را مدیریت کند.
  • پس از خطا، درخواست را بدون محدودیت تکرار نکند.
  • وضعیت سفارش را قبل از ارسال درخواست بعدی بررسی کند.

جمع‌بندی چگونه مشکل «Trade Context Busy» را در متاتریدر حل کنیم؟

مشکل Trade Context Busy در متاتریدر، به‌خصوص در MetaTrader 4، معمولاً زمانی رخ می‌دهد که ترمینال درگیر یک عملیات معاملاتی باشد و درخواست معاملاتی دیگری در همان زمان ارسال شود.

کد رسمی این خطا در MQL4 برابر با 146 یا ERR_TRADE_CONTEXT_BUSY است.

برای کاربران معمولی، بهترین مسیر رفع مشکل این است:

بررسی EAها → کاهش ابزارهای هم‌زمان → بررسی Experts و Journal → راه‌اندازی مجدد متاتریدر → در صورت نیاز تقسیم EAها بین چند ترمینال

اگر مشکل مربوط به یک اکسپرت خاص باشد، ری‌استارت متاتریدر فقط راه‌حل موقت است. در این حالت باید منطق ارسال و تکرار درخواست‌های معاملاتی در خود EA بررسی شود.

همچنین توجه داشته باشید که Error 146 مشخصاً یک خطای MQL4 است و نباید آن را بدون بررسی ساختار درخواست‌های معاملاتی به تمام خطاهای MetaTrader 5 تعمیم داد. در MT5 باید نتیجه درخواست و retcode مربوط به آن بررسی شود.

سوالات متداول چگونه مشکل «Trade Context Busy» را در متاتریدر حل کنیم؟

آیا Trade Context Busy همان خطای 146 است؟

بله. در MQL4، خطای 146 با نام ERR_TRADE_CONTEXT_BUSY ثبت شده و به مشغول بودن Trade Context مربوط است.

چرا هنگام اجرای چند اکسپرت خطای Trade Context Busy می‌گیرم؟

چون چند اکسپرت ممکن است در فاصله زمانی بسیار کوتاه بخواهند عملیات معاملاتی مانند ارسال، اصلاح یا بستن سفارش را انجام دهند. در MT4 این موضوع می‌تواند باعث تداخل درخواست‌ها شود.

آیا ری‌استارت متاتریدر مشکل را حل می‌کند؟

اگر خطا موقتی باشد، ری‌استارت می‌تواند وضعیت ترمینال را دوباره راه‌اندازی کند. اما اگر علت اصلی اجرای هم‌زمان چند EA یا منطق نادرست یک اکسپرت باشد، احتمال بازگشت مشکل وجود دارد.

آیا Trade Context Busy به معنی خراب بودن بروکر است؟

خیر. خطای 146 به وضعیت Trade Context در MT4 مربوط است و نباید آن را به‌تنهایی نشانه مشکل بروکر دانست. خطاهای ارتباطی و سروری در MQL4 کدهای جداگانه‌ای دارند.

آیا این خطا در متاتریدر ۵ هم وجود دارد؟

عبارت و کد Error 146 / ERR_TRADE_CONTEXT_BUSY مربوط به MQL4 است. در MQL5 ساختار درخواست و پاسخ معاملاتی متفاوت است و نتیجه عملیات از طریق MqlTradeResult و retcode بررسی می‌شود.

اگر چند اکسپرت دارم، چطور احتمال این خطا را کم کنم؟

تعداد EAهای فعال در یک ترمینال را مدیریت کنید، درخواست‌های معاملاتی غیرضروری را کاهش دهید و در صورت نیاز EAها را بین چند ترمینال MT4 تقسیم کنید.

منابع:

نوشته‌های تازه

ما را در شبکه اجتماعی دنبال کنید:

  • Insta
  • Telegram
  • youtube

.