Чт. Апр 18th, 2024

Функция проверки правильности установки ТП и СЛ для разработки на 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;
  }

Поделись с друзьями:

от drivermql

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.