Странное поведение WebRequest в MT5 - через какое-то время выдает ошибку. - страница 6

 
Igor Ramensky #:

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

а смысл?

Вы ее себе создали и теперь танцы с бубном...

 
Maxim Kuznetsov #:

ТС-у ранее говорили что в его посыле главное "засыпает и просыпается". Вот там вот может быть баг WebRequest, но надо привести таки код (не в виде "берите тут и правьте так") и сценарий. И чтобы сценарий можно повторить. 

но очевидно что никому не надо :-)

PS/ вполне понимаю разработчиков, если недочёт с просыпанием убежал. Его и ловить долго и не соответствует основной идее эксплуатации. Но может быть, и быть даже билдо-ось-зависимым

Да нет же, не во сне суть! 100 раз уже говорил - главное время! Через время (2-3 часа) функция падает, но не для всех сайтов. Вот я отловил для СМе.

Хотите код из хелпа? Пожалуйста:

void OnStart() 
  { 
   string cookie=NULL,headers; 
   char   post[],result[]; 
   string url="https://www.cmegroup.com/education/courses.html"; 
//--- для работы с сервером необходимо добавить URL 
//--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"): 
//--- обнуляем код последней ошибки 
   ResetLastError(); 
//--- загрузка html-страницы
   int res=WebRequest("GET",url,cookie,NULL,500,post,0,result,headers); 
   if(res==-1) 
     { 
      Print("Ошибка в WebRequest. Код ошибки  =",GetLastError()); 
      //--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления 
      MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION); 
     } 
   else 
     { 
      if(res==200) 
        { 
         //--- успешная загрузка 
         PrintFormat("Файл успешно загружен, размер %d байт.",ArraySize(result)); 
         //PrintFormat("Заголовки сервера: %s",headers); 
         //--- сохраняем данные в файл 
         int filehandle=FileOpen("url.htm",FILE_WRITE|FILE_BIN); 
         if(filehandle!=INVALID_HANDLE) 
           { 
            //--- сохраняем содержимое массива result[] в файл 
            FileWriteArray(filehandle,result,0,ArraySize(result)); 
            //--- закрываем файл 
            FileClose(filehandle); 
           } 
         else 
            Print("Ошибка в FileOpen. Код ошибки =",GetLastError()); 
        } 
      else 
         PrintFormat("Ошибка загрузки '%s', код %d",url,res); 
     } 
  }
//+------------------------------------------------------------------+
//|                                                   WebRequest.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   char   post[],result[];
   string cookie=NULL
        , result_headers=	//как оказалось - заголовки не имеют значения для этой ошибки, вот что пробовал:
   string headers1="X-Requested-With: XMLHttpRequest\r\nContent-Type: application/x-www-form-urlencoded";
   string headers=
//"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*'//*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n" //Список допустимых форматов ресурса.
      "Accept: text/html\r\n" //Список допустимых форматов ресурса.
//"Accept-Encoding: gzip, deflate, br\r\n" //Перечень поддерживаемых способов кодирования содержимого сущности при передаче.
//"Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7\r\n" //Список поддерживаемых естественных языков.
//---"Accept-Language: en-US,en;q=0.5\r\n" //Список поддерживаемых естественных языков.
//"Accept-Language: *\r\n"
      "Cache-Control: no-cache\r\n"
      "Connection: keep-alive\r\n" //После этого соединение не разрывается, а остаётся открытым. Когда клиент отправляет ещё один запрос, он использует это же соединение. Постоянные соединения закрываются после 115 секунд простоя,
      "Pragma: no-cache\r\n"   //Особенные опции выполнения операции.
//"Referer: https://www.cmegroup.com\r\n"
//"Sec-Fetch-Dest: document\r\n" //выборки метаданных заголовка запроса указывает на запрос в пункт назначения . Это инициатор исходного запроса на выборку, где (и как) будут использоваться полученные данные.: Местом назначения является документ.
//"Sec-Fetch-Mode: navigate\r\n" //выборки метаданных заголовка запроса указывает на режим запроса. Это позволяет серверу различать: запросы, исходящие от пользователя, перемещающегося между HTML-страницами и запросы других ресурсов.
//"Sec-Fetch-Site: same-origin\r\n" //этот заголовок сообщает серверу,исходит ли запрос на ресурс от того же источника,того же сайта,другого сайта или является запросом "по инициативе пользователя".: Инициатор запроса и сервер, на котором размещен ресурс, имеют одинаковое происхождение (одинаковая схема, хост и порт).
//"Sec-Fetch-User: ?1\r\n" //выборки заголовок метаданных запроса отправляется только для запросов , инициированных активацией пользователя, и его значение всегда будет ?1. Сервер может использовать этот заголовок,чтобы определить,был ли запрос на навигацию из документа,iframe и т.д.отправлен пользователем.
//"Upgrade-Insecure-Requests: 1\r\n" //указывает, что URL-адреса содержимого из небезопасных (HTTP) источников должны быть безопасно получены по протоколу HTTPS. Все, кроме Microsoft Internet Explorer.
      "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36\r\n" //Список названий и версий клиента и его компонентов с комментариями.
//"User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko\r\n"
      /*"sec-ch-ua: `\" Not A;Brand`\";v=`\"99`\", `\"Chromium`\";v=`\"101`\", `\"Google Chrome`\";v=`\"101`\"\r\n" //Заголовок содержит бренд и основную версию для каждого бренда, связанного с браузером, в списке, разделенном запятыми. Бренд — это коммерческое название пользовательского агента, такого как: Chromium, Opera, Google Chrome, Microsoft Edge, Firefox и Safari.
      "sec-ch-ua-mobile: ?0\r\n" //указывает, находится ли браузер на мобильном устройстве. Он также может использоваться настольным браузером, чтобы указать предпочтение «мобильного» пользовательского интерфейса. ?0указывает, что пользовательский агент не предпочитает мобильный интерфейс (false).
      "sec-ch-ua-platform: `\"Windows`\"\r\n" //предоставляет платформу или операционную систему, на которой работает пользовательский агент. Одна из следующих строк: "Android", "Chrome OS", "Chromium OS", "iOS", "Linux", "macOS", "Windows", или "Unknown".
      */;

//string url="https://finance.yahoo.com";
   string url="https://www.cmegroup.com/education/courses.html";
//string url="https://www.cmegroup.com";
//--- для работы с сервером необходимо добавить URL "https://finance.yahoo.com"
//--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"):
//--- обнуляем код последней ошибки
   ResetLastError();
//--- загрузка html-страницы с Yahoo Finance
//int res=WebRequest("GET",url,cookie,NULL,1000,post,0,result,result_headers);
   int res=WebRequest("GET",url,headers,1000,post,result,result_headers);
   if(res==-1)
     {
      Print("Ошибка в WebRequest. Код ошибки  =",GetLastError());
      //--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления
      MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
     }
   else
     {
      if(res==200)
        {
         //--- успешная загрузка
         PrintFormat("Файл успешно загружен, размер %d байт '%s' %s",ArraySize(result),url,CharArrayToString(result, 0, 15));
         //PrintFormat("Заголовки сервера: %s",headers);
         //--- сохраняем данные в файл
         /*int filehandle=FileOpen("url.htm",FILE_WRITE|FILE_BIN);
         if(filehandle!=INVALID_HANDLE)
           {
            //--- сохраняем содержимое массива result[] в файл
            FileWriteArray(filehandle,result,0,ArraySize(result)); //в данном случае файл нам не нужен
            //--- закрываем файл
            FileClose(filehandle);
           }
         else
            Print("Ошибка в FileOpen. Код ошибки =",GetLastError()); */
        }
      else
         PrintFormat("Ошибка загрузки '%s', код %d",url,res);
     }

  }
//+------------------------------------------------------------------+

Это вариант WR с заголовками. Эти 2 варианта глючат одинаково. А то же самое с WinAPI - нет!

 
Renat Akhtyamov #:

а смысл?

Вы ее себе создали и теперь танцы с бубном...

Нет что сказать - не говорите. Вообще, я хочу установить диалог с разработчиками, но почему влезает всякая... не понимаю.

 

Хорошо, напишу зачем мне это.

Я создал некий торговый комплекс.

В его составе есть индикатор опционных уровней.

Вот так на нём сегодня выглядит нефть. Индикатор пользуется данными с биржи CME.  Этот комплекс используется уже несколько лет (разработка 2015 года).

Обновлением данных занимается советник. Он работает по расписанию. Советник наполняет БД данными, а множество индикаторов пользуются этими данными.

Раньше все Inet-функции работали исключительно на WinAPI. Поскольку реализация их в МТ4/5 была мягко говоря не стабильная.

Примерно, года 3 назад в очередной раз испробовав встроенные запросы в  МТ, я остался доволен и переписал на них всё, что касалось скачивания данных с CME и некоторый другие.

Всё работало хорошо и на МТ4 и на МТ5, один и тот же код (понятно, что есть незначительные различия в коде и они учтены). 

Но где-то с полгода назад работа MT5 "поломалась", стали постоянные сбои в запросах спустя какое-то время простоя советника.

Скачиваются данные почти по всем ликвидным опционам на фьючерсы. Это список опционов из мануала к индикатору. 

Данные в папках структурированы по видам опционов:

Здесь показана только  папка с файлами для нефти. 

Вот тут виден объём скачанных со CME данных за последний год.

Здесь данные в обычном CSV-формате. Показываю, чтобы был виден объём скачанных данных за день.

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

В Zip-архиве пример файла нефти в CSV-формате .

Файлы:
 

Написанное выше хочу чтобы не считали какой-то рекламой. Это только для того, чтобы уже звучал какой-то конструктив. А не бла-бла.

Работы было сделано много, надеюсь понятно, почему мне не хотелось бы возвращаться на функцию WebRequest с WinAPI?

Но если "поддержка" здесь такая, то я, конечно, вернусь к Wininet. 

 
Igor Ramensky #:

Но если "поддержка" здесь такая, то я, конечно, вернусь к Wininet. 

Поддержки здесь, можно сказать, нет.

Но если вы сможете создать минимальный пример, который явно воспроизведёт проблему у самих разработчиков - с большой вероятностью, они это, не комментируя, пофиксят.

 
JRandomTrader #:

Поддержки здесь, можно сказать, нет.

Но если вы сможете создать минимальный пример, который явно воспроизведёт проблему у самих разработчиков - с большой вероятностью, они это, не комментируя, пофиксят.

Значит не судьба, явной ошибки-то нет, есть лишь при условии обращения к некому сайту повторно через некое время((...

 
Igor Ramensky #:

Нет что сказать - не говорите. Вообще, я хочу установить диалог с разработчиками, но почему влезает всякая... не понимаю.

ну ну....

сначала в браузере свою ссыль проверьте.........


 
Renat Akhtyamov #:

ну ну....

сначала в браузере свою ссыль проверьте.........


https://www.cmegroup.com/education/courses.html Что не так? Любая ссылка вот с этим хостом  https://www.cmegroup.com пофигу какая не работает.

 
Igor Ramensky #:

https://www.cmegroup.com/education/courses.html Что не так? Любая ссылка вот с этим хостом  https://www.cmegroup.com пофигу какая не работает.

разговор то ни о чем получается до сих пор

по какой ссылке грузите реально?

мне кажется что Вы пользуетесь чем то чужим и Вам просто захотелось написать такое же, но чо та никак

Вы привели выше код - ну полная чушь,

WebRequest

так не скачает ни одного файла

сравните что Ваша ссылка кидает и что моя

//---

вот теперь вставьте эту ссылку в вебреквест и ждите - когда бахнется система

отвечу - никогда

удачи!

;)

Причина обращения: