Функция проверки правильности установки ТП и СЛ для разработки на MQL5.
bool CheckStopLoss_Takeprofit(ENUM_ORDER_TYPE type, string pare, double SL,double TP)
{
double Ask = SymbolInfoDouble(pare,SYMBOL_ASK);
double Bid = SymbolInfoDouble(pare,SYMBOL_BID);
//--- получим уровень SYMBOL_TRADE_STOPS_LEVEL
int stops_level=(int)SymbolInfoInteger(pare,SYMBOL_TRADE_STOPS_LEVEL);
if(stops_level!=0)
{
PrintFormat("SYMBOL_TRADE_STOPS_LEVEL=%d: StopLoss and TakeProfit must be "+
" no closer than %d pips from the close ",stops_level,stops_level);
}
//---
bool SL_check=false,TP_check=false;
//--- проверяем только два типа ордеров
switch(type)
{
//--- операция покупка
case ORDER_TYPE_BUY:
{
//--- проверим StopLoss
SL_check=(Bid-SL>stops_level * SymbolInfoDouble(pare,SYMBOL_POINT));
if(!SL_check)
PrintFormat(pare + ": For order %s StopLoss=%.5f must be less than %.5f"+
" (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d pips)",
EnumToString(type),SL,Bid-stops_level*_Point,Bid,stops_level);
//--- проверим TakeProfit
TP_check=(TP-Bid>stops_level * SymbolInfoDouble(pare,SYMBOL_POINT));
if(!TP_check)
PrintFormat(pare + ": For order %s TakeProfit=%.5f must be greater than %.5f"+
" (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d pips)",
EnumToString(type),TP,Bid+stops_level*SymbolInfoDouble(pare,SYMBOL_POINT),Bid,stops_level);
//--- вернем результат проверки
if(SL <= 0)
SL_check = true;
if(TP <= 0)
TP_check = true;
return(SL_check && TP_check);
}
//--- операция продажа
case ORDER_TYPE_SELL:
{
//--- проверим StopLoss
SL_check=(SL-Ask>stops_level*SymbolInfoDouble(pare,SYMBOL_POINT));
if(!SL_check)
PrintFormat(pare + ": For order %s StopLoss=%.5f must be greater than %.5f "+
" (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)",
EnumToString(type),SL,Ask+stops_level*SymbolInfoDouble(pare,SYMBOL_POINT),Ask,stops_level);
//--- проверим TakeProfit
TP_check=(Ask-TP>stops_level*SymbolInfoDouble(pare,SYMBOL_POINT));
if(!TP_check)
PrintFormat(pare + ": For order %s TakeProfit=%.5f must be less than %.5f "+
" (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)",
EnumToString(type),TP,Ask-stops_level*SymbolInfoDouble(pare,SYMBOL_POINT),Ask,stops_level);
//--- вернем результат проверки
if(SL <= 0)
SL_check = true;
if(TP <= 0)
TP_check = true;
return(TP_check&&SL_check);
}
break;
}
//--- для отложенных ордеров нужна немного другая функция
return false;
}