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

 
Дайте пример для воспроизведения, пожалуйста
 
Igor Ramensky #:

Нет, не норм.

Провёл более тщательное тестирование в течении нескольких дней, заголовки не имеют значения для данной ошибки, там у них что-то серьёзней. 

И вот какой результат:

1. Функция WebRequest в МТ4 работает в штатном режиме всегда и не отваливается через пару часов.

2. Функция WebRequest в МТ5 работает в штатном режиме после запуска и отваливается через пару часов.

3. Функция WebRequest через WinAPI (через системные DLL) в любом МТ работает в штатном режиме всегда и не отваливается никогда

Все проверки были сделаны с URL https://www.cmegroup.com/education/courses.html (эта ссылка просто для примера, просто замечено мною нестабильная работа МТ5 с хостом  www.cmegroup.com, возможно есть и еще подобные).

Так что, слова, дескать, там у них на сайте СМЕ стоит страшный файерволл, который все запросы пользователей отправляет в черную дыру,- просто смех. 

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

Так что, господа, пользуйтесь системным API и ваши проги не загнутся от "развития" МТ после очередного обновления!

если честно, ждал ответа

может быть тут почерпнете

не забудьте сделать вывод, если заработает

https://www.mql5.com/ru/forum/389306

Обсуждение статьи "Веб-проекты (Часть III): Система авторизации Laravel/MetaTrader 5"
Обсуждение статьи "Веб-проекты (Часть III): Система авторизации Laravel/MetaTrader 5"
  • 2022.02.21
  • www.mql5.com
Опубликована статья Веб-проекты (Часть III): Система авторизации Laravel/MetaTrader 5 : Автор: Anatoli Kazharski...
 
Renat Fatkhullin #:
Дайте пример для воспроизведения, пожалуйста
//+------------------------------------------------------------------+
//| 2022/05/20                                 WebRequest WinAPI.mq5 |
//+------------------------------------------------------------------+
#property copyright "2022, Example WebRequest WinAPI./Ramensky I."
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
#define HINTERNET int
#define DWORD uint
#define DWORD_PTR uint
#define LPDWORD uint&
#define LPVOID uchar&
#define LPCTSTR string&

#import  "Wininet.dll"
HINTERNET InternetOpenW(LPCTSTR lpszAgent, DWORD dwAccessType, LPCTSTR lpszProxyName, LPCTSTR lpszProxyBypass, DWORD dwFlags);
HINTERNET InternetConnectW(HINTERNET hInternet, LPCTSTR lpszServerName, int nServerPort, LPCTSTR lpszUsername, LPCTSTR lpszPassword, DWORD dwService, DWORD dwFlags, DWORD_PTR dwContext);
HINTERNET HttpOpenRequestW(HINTERNET hConnect, LPCTSTR lpszVerb, LPCTSTR lpszObjectName, LPCTSTR lpszVersion, LPCTSTR lpszReferer, LPCTSTR lplpszAcceptTypes, DWORD dwFlags, DWORD_PTR dwContext);
bool HttpSendRequestW(HINTERNET hRequest, LPCTSTR lpszHeaders, DWORD dwHeadersLength, LPVOID lpOptional[], DWORD dwOptionalLength);
bool InternetReadFile(HINTERNET hFile, LPVOID lpBuffer[], DWORD dwNumberOfBytesToRead, LPDWORD lpdwNumberOfBytesRead);
int InternetCloseHandle(HINTERNET hInternet);
#import

#import "kernel32.dll"
DWORD GetLastError(void);
#import

#define INTERNET_SERVICE_HTTP             3
#define INTERNET_FLAG_PRAGMA_NOCACHE      0x00000100
#define INTERNET_FLAG_KEEP_CONNECTION     0x00400000
#define INTERNET_FLAG_SECURE              0x00800000
#define INTERNET_FLAG_RELOAD              0x80000000

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   string url_host = "www.cmegroup.com";
   string url_path = "education/courses.html";
   string user_agent = "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko";
   string headers=
      "Accept: text/html\r\n" //Список допустимых форматов ресурса.
      "Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7\r\n" //(!!)-без этого виснет. Список поддерживаемых естественных языков.
      "Connection: keep-alive\r\n" //(!!) После этого соединение не разрывается, а остаётся открытым. Когда клиент отправляет ещё один запрос, он использует это же соединение. Постоянные соединения закрываются после 115 секунд простоя,
      ;
   headers+=("User-Agent: "+user_agent);
   uchar data[];
   string nill = NULL,_str_data="";
   StringToCharArray(_str_data, data);
   string method = "GET";
   string http_version = "HTTP/1.1";

   int HttpOpen = InternetOpenW(user_agent, 0, nill, nill, 0);
   int HttpConnect = InternetConnectW(HttpOpen, url_host, 443, nill, nill, INTERNET_SERVICE_HTTP, 0, 0);
   int HttpRequest = HttpOpenRequestW(HttpConnect, method, url_path, http_version, nill, nill,(INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_RELOAD|INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_SECURE), 0);
   bool result = HttpSendRequestW(HttpRequest, headers, StringLen(headers), data, StringLen(_str_data));

   if(result>0)
     {
      string out = "";
      uchar ch[];
      int dwBytes=0;
      int iSize=4096;
      ArrayResize(ch,iSize);
      while(InternetReadFile(HttpRequest, ch, iSize, dwBytes))
        {
         if(dwBytes <= 0)
            break;
         out =out+CharArrayToString(ch, 0, dwBytes);
         if(IsStopped())
            return;
        }
      PrintFormat("Успешная загрузка '%s', размер %d байт, Первые 15:'%s'.",url_host+"/"+url_path,StringLen(out),StringSubstr(out,0,15));
     }
   else
     {
      PrintFormat("Last Error = %d result: %d", kernel32::GetLastError(), result);
     }
   InternetCloseHandle(HttpOpen);
   InternetCloseHandle(HttpConnect);
   InternetCloseHandle(HttpRequest);
  }

Это рабочий пример для МТ5 через WinAPI. 

В МТ4 штатная функция прекрасно работает.

 
Igor Ramensky #:

Это рабочий пример для МТ5 через WinAPI. 

Я подозреваю, что нужен нерабочий пример для МТ5. Иначе не понятно, что проверять.

 
Andrey Khatimlianskii #:

Я подозреваю, что нужен нерабочий пример для МТ5. Иначе не понятно, что проверять.

во во, WinApi....

речь ни о чем

ведь тема такая:

Странное поведение WebRequest в MT5

 
Igor Ramensky #:

Это рабочий пример для МТ5 через WinAPI. 

В МТ4 штатная функция прекрасно работает.

вот WebRequest MT5 ;)

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Renat Akhtyamov, 2022.05.16 22:50

и еще, вот это все время обновлялось, т.к. не в онинит

      string CmeCookie=NULL,headers; 

      char post[],result[]; 

      int res;

      ResetLastError();

      res=WebRequest("GET",CmeUrl,CmeCookie,NULL,TimeOut,post,0,result,headers);

и работало надежно

https://www.mql5.com/ru/docs/network/webrequest
Документация по MQL5: Сетевые функции / WebRequest
Документация по MQL5: Сетевые функции / WebRequest
  • www.mql5.com
WebRequest - Сетевые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Igor Ramensky:

Берём из встроенной в МТ(4/5) Помощи пример для функции WebRequest и копируем его в скрипт WebRequest1.ex5. Компилируем и выполняем на любом графике. В логе нет ошибок.

В примере указан сайт https://finance.yahoo.com. Меняем его на https://www.cmegroup.com. Сохраняем скрипт под именем WebRequest.ex5. Компилируем и выполняем. В логе также нет ошибок.

Спустя, например, 30 минут выполняем повторно эти 2 скрипта -  в логе опять нет ошибок.

А вот далее интересней, через какое-то время, может через час, может через 2, а может и раньше, если ПК уснул и был разбужен, то скрипт WebRequest.ex5 с URL www.cmegroup.com выдаёт ошибку: "Ошибка загрузки 'https://www.cmegroup.com', код 1003".

Но тут же запущенный скрипт с URL finance.yahoo.com по прежнему работает без ошибок. Так происходит на МТ5 всегда, рано или поздно.

Но удивительно, что всё тоже самое на МТ4 работает без проблем. Проверял параллельно обе версии МТ. Сначала грешил на конкретную установку МТ5. Проверил на другом брокере и на другом ПК - все так же ошибка, спустя какое-то время. 



Что тут непонятного, написал же в 1 посте - берём все коды с хелпа. 

А вариант с МТ5 WinAPI для тех, кто думает, что на СМЕ чего-то там стоИт и он запросы именно от МТ5 игнорирует, а вот от МТ4 выполняет)). Так вот вышеприведённый примитивный пример с применением Wininet показывает, что и от МТ5 могут запросы нормально выполняться в любое время, хоть через 5 часов, хоть после пробуждения ПК, хоть после выхода ПК из гибернации, хоть когда, четко и быстро. Да и еще - бана и блокировки не последовало от СМЕ даже когда я делал интервал между запусками менее секунды и повторял запросы (повторно запускал этот скрипт) в течении 30-40 раз, это опять про мнимые защиты на стороне их сайта. Конечно, не исключено, что сайт заблочит на время его провоцирующее  IP, но это не так быстро, еще нужно постараться.

 
Renat Akhtyamov #:

во во, WinApi....

речь ни о чем

ведь тема такая:

Странное поведение WebRequest в MT5

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

 
Renat Akhtyamov #:

во во, WinApi....

речь ни о чем

ведь тема такая:

Странное поведение WebRequest в MT5

WinApi тот-же запрос, только вшитый в функцию WebRequest
 
Vitaly Muzichenko #:
WinApi тот-же запрос, только вшитый в функцию WebRequest

не вполне. Там оплётки,окружение,кэширование. Всё как можно быстрее всё ради скорости.

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

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

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

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