ما باید قبل از ارسال هر دستور تجاری،بررسی کنیم که آیا موجودی کافی در حساب داریم یا خیر. نداشتن موجودی کافی برای خرید یا فروش یا دستور باز شدن در آینده (پوزیشنهای شرطی یا پندینگ اردر) به عنوان یک خطا شناخته میشود. به زبان ساده اگر بخواهید یک پوزیشن جدید بگیرید باید موجودی کافی در حساب داشته باشید وگرنه با خطا مواجه میشویم.
لطفاً به یاد داشته باشید که حتی قرار دادن یک دستور در انتظار ممکن است نیاز به مارجین داشته باشد. مثلا پوزیشنهای شرطی مثل بای لیمیت یا سل لیمیت نیز نیازمند مارجین کافی میباشد.
شما میتوانید خطاهایی که باعث میشود معامله انجام نشود را از بخش Journal در متاتریدر مشاهد کنید. عکس زیر نحوه دسترسی به این بخش را در استراتژی تستر نشان میدهد. البته در جاهای دیگر که تب Journal وجود دارد نیز میتوانید خطاها را مشاهده کند. در بین خطاها اگر با not enough money یا [No money] مواجه شدید برای برطرف کردنش این مقاله کاربرد دارد.
برای اینکه این موضوع را تست کنید توصیه میکنم که یک حساب دمو با موجودی کم ایجاد کنید و حجم زیادی بزنید. و سپس از بخش ژرنال خطاها را مشاهده کنید.
شما قبل از اینکه سفارشی را ارسال کنید از تابع زیر برای چک کردن موجودی استفاده کنید.
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);
}
توابع بالا را میتوانید کپی کنید و قبل از اینکه سفارش را ارسال کنید ابتدا مقدار موجودی حساب را چک کنید.
نویسنده و مدرس اکسپرتنویسی فارکس
لطفا با نظرات خوبتون، ما را در بالا بردن کیفیت یاری کنید. نظرتون را بگید حتی اگر منفی باشه.❤️😊
ما در بورس۹۰ آموزشهای تخصصی در زمینهی اکسپرتنویسی و ابزارهای معاملاتی ارائه میدهیم و به کاربران کمک میکنیم تا با استفاده از استراتژیهای خودکار، عملکرد بهتری در معاملاتشان داشته باشند.
بدون دیدگاه