یکی از مهمترین پیشنیازها پیش از ارسال هرگونه دستور معاملاتی در پلتفرم متاتریدر، بررسی موجودی حساب و اطمینان از داشتن مارجین (Margin) کافی است. عدم وجود موجودی کافی برای باز کردن پوزیشنهای جدید اعم از خرید، فروش یا سفارشات شرطی (Pending Orders)، منجر به بروز خطا در اجرای دستورات خواهد شد.
در این مقاله، به زبان ساده بررسی میکنیم که چرا و چگونه باید پیش از ارسال سفارش، موجودی حساب را در برنامهنویسی اکسپرت بررسی کنیم.
لطفاً به یاد داشته باشید که حتی قرار دادن یک دستور در انتظار ممکن است نیاز به مارجین داشته باشد. مثلا پوزیشنهای شرطی مثل بای لیمیت یا سل لیمیت نیز نیازمند مارجین کافی میباشد.
به بیان ساده، برای باز کردن هر پوزیشن جدید در بازار، به مقدار مشخصی وجه تضمین یا «مارجین» نیاز دارید. اگر موجودی آزاد (Free Margin) حساب شما از این مقدار کمتر باشد، سفارش شما با خطا مواجه شده و اجرا نمیشود.
نکته مهم: فراموش نکنید که ثبت سفارشات در انتظار (Pending Orders) مانند «بای لیمیت» (Buy Limit) یا «سل لیمیت» (Sell Limit) نیز به مارجین اولیه نیاز دارند و سیستم پیش از ثبت آنها، موجودی شما را بررسی میکند.
اگر سفارشی به دلیل کمبود موجودی اجرا نشود، متاتریدر این موضوع را ثبت میکند. شما میتوانید دلایل انجام نشدن معاملات را در تب Journal مشاهده کنید.
اگر در لاگهای این بخش با خطاهایی نظیر 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);
}
بدون دیدگاه