Функция webrequest выдает ошибку 5203. Куда копать?

 

Всем привет! Помогите пожалуйста разобраться, в чем причина ошибки. Есть у меня советник, который чекает периодически веб страницу. Все работает нормально, но через какое то время (несколько дней, неделя и т.д) он перестает работать. Возвращая ошибку 5203

2019.11.06 08:21:58.647 WebEA XAUUSD,H1: Error WebRequest :: -1, LastError=5203, Error=no error

Самое интересное, что советник тестируется в нескольких терминалах и забирает данные с одного и того же сайта. И бывает такое, что на одном из терминалов работает, а на другом нет. И сова установлена на нескольких валютных парах. Перестает работать на всех. Что такое, ума не приложу.

Вот функция для веб-запроса.

string GetHtml()
{
   if(request_url=="test.html"){
      int file_handle2=FileOpen("test.html",FILE_READ|FILE_TXT|FILE_ANSI);
      if(file_handle2==INVALID_HANDLE)
      {
          Print("FileOpen error #"+(string)GetLastError());
      }
      
      string res_str = "";
      while(!FileIsEnding(file_handle2))
      {
         res_str += FileReadString(file_handle2) + "\r\n";
      
      }
      
      FileClose(file_handle2);
      return res_str;
   }   

   string      method = "GET";                                                                         // HTTP method 
   string      headers = "";                                                                           // headers 
   char        data[];                                                                                 // the array of the HTTP message body 
   char        result[];                                                                               // an array containing server response data 
   string      result_headers;                                                                         // headers of server response 

   ResetLastError(); 
   int res=WebRequest(method,request_url,headers,_request_wait_timeout,data,result,result_headers); 
   if(res!=200) 
   { 
      Print("Error WebRequest :: "+(string)res+", LastError="+(string)GetLastError() + ", Error="+ErrorDescription(GetLastError())); 
      return ""; 
   }
   
   string html=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8);  
   return html;
}
Документация по MQL5: Сетевые функции / WebRequest
Документация по MQL5: Сетевые функции / WebRequest
  • www.mql5.com
Для использования функции WebRequest() следует добавить адреса серверов в список разрешенных URL во вкладке "Советники" окна "Настройки". Порт сервера выбирается автоматически на основе указанного протокола - 80 для "http://" и 443 для "https://". Функция WebRequest() является синхронной, это означает, что она приостанавливает выполнение...
 
сейчас проверил. Если открыть настройки советника и нажать ок, то он, перечитав настройки начинает получать данные нормально. Но опять же до поры до времени.
 
Ivan Ovchinnikov:
сейчас проверил. Если открыть настройки советника и нажать ок, то он, перечитав настройки начинает получать данные нормально. Но опять же до поры до времени.

Вы как то странно пишите.

Сначала открываете файл и если file_handle2==INVALID_HANDLE, то выводите в принт ошибку. Но далее считываете из файла строчки и закрываете файл. А если было условие  file_handle2==INVALID_HANDLE, то откуда вы считываете строчку и какой файл вы закрываете?

Тоже самое и с вебреквестом. Идет проверка if(res!=200), а потом несмотря на результаты 

   string html=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8);  
   return html;
 
Vladimir Tkach:

Вы как то странно пишите.

Сначала открываете файл и если file_handle2==INVALID_HANDLE, то выводите в принт ошибку. Но далее считываете из файла строчки и закрываете файл. А если было условие  file_handle2==INVALID_HANDLE, то откуда вы считываете строчку и какой файл вы закрываете?

Тоже самое и с вебреквестом. Идет проверка if(res!=200), а потом несмотря на результаты 

так в этом и беда, что изначально это все делал не я.

А чтобы переделать моего уровня программирования не хватает, я только по мелочи могу исправить.

 
Ivan Ovchinnikov:

так в этом и беда, что изначально это все делал не я.

А чтобы переделать моего уровня программирования не хватает, я только по мелочи могу исправить.

Закройте скобками, может поможет.

string GetHtml()
{
   if(request_url=="test.html"){
      int file_handle2=FileOpen("test.html",FILE_READ|FILE_TXT|FILE_ANSI);
      if(file_handle2==INVALID_HANDLE)
      {
          Print("FileOpen error #"+(string)GetLastError());
      }
      
if(file_handle2!=INVALID_HANDLE)
{
      string res_str = "";
      while(!FileIsEnding(file_handle2))
      {
         res_str += FileReadString(file_handle2) + "\r\n";
      
      }
      
      FileClose(file_handle2);
      return res_str;
}
   }   

   string      method = "GET";                                                                         // HTTP method 
   string      headers = "";                                                                           // headers 
   char        data[];                                                                                 // the array of the HTTP message body 
   char        result[];                                                                               // an array containing server response data 
   string      result_headers;                                                                         // headers of server response 

   ResetLastError(); 
   int res=WebRequest(method,request_url,headers,_request_wait_timeout,data,result,result_headers); 
   if(res!=200) 
   { 
      Print("Error WebRequest :: "+(string)res+", LastError="+(string)GetLastError() + ", Error="+ErrorDescription(GetLastError())); 
      return ""; 
   }
   if(res==200) 
   {   
   string html=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8);  
   return html;
}
return "";
}
 
сейчас попробую, посмотрим что будет..
 
В общем то, не помогло. Какие еще есть варианты?
 
Ivan Ovchinnikov:
В общем то, не помогло. Какие еще есть варианты?

Кто вызывает GetHtml()? И что затем происходит если возврат ""?

- т.е. есть проверка на возврат пустой строчки?

 
Vladimir Tkach:

Кто вызывает GetHtml()? И что затем происходит если возврат ""?

- т.е. есть проверка на возврат пустой строчки?

его вызывает другая функция, для разбора полученных данных

void InitValues()
{
   string html = GetHtml();
   order_type = GetValueFromHTML(html, "id=\"order-type\">");
   t_profit = (double)GetValueFromHTML(html, "id=\"order-tp\">");
   s_loss = (double)GetValueFromHTML(html, "id=\"order-sl\">");
}
 
Ivan Ovchinnikov:

его вызывает другая функция, для разбора полученных данных

Может так случиться, что файл не прочитается. Вам нужно такой вариант предусмотреть чтобы далее алгоритм не обрабатывал пустое значение и не глючил.

 
Кстати я тут подумал, позможно веб сервер иногда отклоняет запрос робота (хотя с браузера заходит нормально). 
Причина обращения: