بررسی موجودی حساب پیش از ارسال سفارش در متاتریدر

یکی از مهم‌ترین پیش‌نیازها پیش از ارسال هرگونه دستور معاملاتی در پلتفرم متاتریدر، بررسی موجودی حساب و اطمینان از داشتن مارجین (Margin) کافی است. عدم وجود موجودی کافی برای باز کردن پوزیشن‌های جدید اعم از خرید، فروش یا سفارشات شرطی (Pending Orders)، منجر به بروز خطا در اجرای دستورات خواهد شد.

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

لطفاً به یاد داشته باشید که حتی قرار دادن یک دستور در انتظار ممکن است نیاز به مارجین داشته باشد. مثلا پوزیشن‌های شرطی مثل بای لیمیت یا سل لیمیت نیز نیازمند مارجین کافی می‌باشد.

چرا داشتن موجودی (مارجین) کافی الزامی است؟

به بیان ساده، برای باز کردن هر پوزیشن جدید در بازار، به مقدار مشخصی وجه تضمین یا «مارجین» نیاز دارید. اگر موجودی آزاد (Free Margin) حساب شما از این مقدار کمتر باشد، سفارش شما با خطا مواجه شده و اجرا نمی‌شود.

نکته مهم: فراموش نکنید که ثبت سفارشات در انتظار (Pending Orders) مانند «بای لیمیت» (Buy Limit) یا «سل لیمیت» (Sell Limit) نیز به مارجین اولیه نیاز دارند و سیستم پیش از ثبت آن‌ها، موجودی شما را بررسی می‌کند.

نحوه بررسی خطای عدم موجودی در متاتریدر

اگر سفارشی به دلیل کمبود موجودی اجرا نشود، متاتریدر این موضوع را ثبت می‌کند. شما می‌توانید دلایل انجام نشدن معاملات را در تب Journal مشاهده کنید.

  • در محیط لایو یا دمو: از پنجره Terminal به تب Journal مراجعه کنید.
  • در محیط تست (Strategy Tester): در بخش تستر نیز تب ژورنال برای بررسی خطاهای استراتژی وجود دارد.

اگر در لاگ‌های این بخش با خطاهایی نظیر not enough money یا [No money] مواجه شدید، به این معناست که اکسپرت یا اسکریپت شما بدون در نظر گرفتن موجودی حساب، درخواست معامله داده است. راهکار برطرف کردن این مشکل، استفاده از توابع کنترل موجودی پیش از ارسال سفارش است.

یک تست عملی برای درک بهتر

برای اینکه با نحوه بروز این خطا بهتر آشنا شوید، پیشنهاد می‌کنیم یک حساب دمو با موجودی بسیار کم (مثلاً ۱۰۰ دلار) ایجاد کنید. سپس سعی کنید یک معامله با حجم بالا (مثلاً ۱ لات استاندارد) باز کنید. بلافاصله خواهید دید که سفارش اجرا نشده و خطای not enough money در تب Journal ثبت می‌شود.

خطای عدم موجودی کافی را مشاهده می‌کنید

تابع بررسی موجودی پیش از ارسال سفارش

برای جلوگیری از بروز این خطا در اکسپرت‌های خود، باید پیش از فراخوانی تابع ارسال سفارش (مانند OrderSend)، موجودی حساب را بررسی کنید. در ادامه تابعی کاربردی برای چک کردن موجودی در زبان MQL آورده شده است:

تابع در MQL5 :

				
					bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- Getting the opening price
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//--- values of the required and free margin
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   //--- call of the checking function
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- something went wrong, report and return false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- if there are insufficient funds to perform the operation
   if(margin>free_margin)
     {
      //--- report the error and return false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- checking successful
   return(true);
  }
				
			

تابع در MQL4 :

				
					bool CheckMoneyForTrade(string symb, double lots,int type)
  {
   double free_margin=AccountFreeMarginCheck(symb,type, lots);
   //-- if there is not enough money
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
   //--- checking successful
   return(true);
  }
				
			

گپ و گفت کاربران

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *