GrabWeb не работает на MT4 Build 600 - страница 2

 
gchrmt4:
...Тем не менее, этот сценарий должен работать для получения коротких ответов сервера, таких как результаты запроса на лицензирование. Проблемы возникают только в том случае, если размер ответа сервера превышает 1 КБ.

Спасибо, это отлично сработало!
 

Здравствуйте, thili55,

Не могли бы вы помочь нам и опубликовать ваше решение для получения grabWeb() для работы с build 600? Я думаю, многие люди будут заинтересованы в том, чтобы FFCal работал с билдом 600.

Большое спасибо

 
bennyHanna:

Не могли бы вы помочь нам и опубликовать ваше решение для получения grabWeb() для работы с build 600? Я думаю, многие люди были бы заинтересованы в том, чтобы FFCal работал с билдом 600.

См. сообщение, на которое отвечает thili55 - но обратите внимание, что в настоящее время в v600, похоже, есть проблемы с обработкой строк, что может повлиять на загрузку такого количества данных, как календарь FF.
 
gchrmt4:
См. сообщение, на которое отвечает thili55 - но обратите внимание, что в настоящее время в v600, похоже, есть проблемы с обработкой строк, которые могут повлиять на загрузку такого количества данных, как календарь FF.


Спасибо за ваш ответ. Значит, нам нужно дождаться исправления v600, прежде чем придумывать решение для grabWeb, правильно? Или исправление было предоставлено в v603?

 
bennyHanna:


Спасибо за ваш ответ. Значит, нам нужно дождаться исправления v600, прежде чем придумывать решение для grabWeb, верно? Или исправление было предоставлено в v603?

Похоже, вы не понимаете суть проблемы. Код должен быть исправлен, чтобы учесть изменения в mql4.
 

Здесь представлена функция GrabWeb, обновленная для работы на v600. Теперь она использует InternetOpenW и InternetOpenUrlW и преобразование юникода. Она действительно получает XML-файлы, но все файлы содержат NULL-данные. Смотрите в коде оператор Print для StrWebPage. Если вы посмотрите на выводимые данные, то это мусор, в то время как strThisRead имеет действительные данные. Может ли кто-нибудь взглянуть и посмотреть, сможет ли он найти исправление? Это следует из исправления в этой теме: https://www.mql5.com/en/forum/149360.

Просто скопируйте и вставьте код в ваш FFCal.mq4, скомпилируйте с v600 MT4 и запустите (пожалуйста, отредактируйте элементы, которые не принадлежат вашей версии, чтобы он скомпилировался).

bool bWinInetDebug = false;

#define  READURL_BUFFER_SIZE   1000

#import "wininet.dll"
   int InternetOpenW(string, int, string, string, int);
   int InternetOpenUrlW(int, string, string, int, int, int);
   int InternetReadFile(int, uchar & arr[], int, int & arr[]);
   int InternetCloseHandle(int);
#import

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
bool GrabWeb(string strUrl, string& strWebPage)
   {
           int     hInternet;
           int     hInternetUrl;
           bool    bSuccess = false;
           
           // Get an internet handle
           hInternet = InternetOpenW("mt4", 0 /* 0 = INTERNET_OPEN_TYPE_PRECONFIG */, NULL, NULL, 0);
        
           if (bWinInetDebug) 
                   Log("hInternet: " + hInternet);   
                   
           if (hInternet == 0) 
         {     
            Message = Symbol() + " " + IndicatorName + " Error 890 - Unable to get an Internet Handle!";
            Print(Message);
            Alert(Message);                                     
            HealthBuffer[0] = Error_state; 
            bSuccess = false;
         }
      else
         {         
            // Get a URL handle
            hInternetUrl = InternetOpenUrlW(hInternet, NewsURL, NULL, 0, 0, 0);
            
           if (bWinInetDebug) 
                   Log("hInternetUrl: " + hInternetUrl);   

           if (hInternetUrl == 0) 
               {     
                  Message = Symbol() + " " + IndicatorName + " Error 891 - Unable to get a URL handle!";
                  Print(Message);
                  Alert(Message);                           
                  HealthBuffer[0] = Error_state; 
                  bSuccess = false;
               }
            else
               {
                  Print("Reading URL: " + strUrl);
                       
                       bool bKeepReading = true;
                  
                  while (bKeepReading) 
                     {                    
                                            int   lReturn[1];
                                            uchar arrReceive[];
                                            
                                            ArrayResize(arrReceive, READURL_BUFFER_SIZE + 1);
                        
                        int success = InternetReadFile(hInternetUrl, arrReceive, READURL_BUFFER_SIZE, lReturn);
            
                        if (success == 0) 
                           {
                              Message = Symbol() + " " + IndicatorName + " Error 892 - Unable to read News Database WebPage!";
                              Print(Message);
                              Alert(Message);                                  
                              HealthBuffer[0] = Error_state; 
                              bKeepReading = false;
                              bSuccess = false;
                           }
                        else 
                           {
                                   if (bWinInetDebug) 
                                           Log("success: " + success);
                                   
                                   if (bWinInetDebug) 
                                           Log("arrReceive: " + arrReceive[0]);    

                                   if (bWinInetDebug) 
                                           Log("lReturn: " + lReturn[0]);
                                   
                              // InternetReadFile() has succeeded, but we may be at the end of the data 
                              if (lReturn[0] == 0) 
                                 {
                                    if (bWinInetDebug) 
                                       Print("Reached end of data");
                                    
                                    bKeepReading = false;
                                    bSuccess = true;
                                 } 
                              else 
                                 {
                                    // Convert the data from Ansi to Unicode using the built-in MT4 function
                                    string strThisRead = CharArrayToString(arrReceive, 0, lReturn[0], CP_UTF8);
                                    strWebPage = StringConcatenate(strWebPage, strThisRead);  // <-- PROBLEM HERE ON FIRST USE ONLY IN EACH MT4 SESSION
                                 Print ("------------------------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  strWebPage : ", strWebPage);  // this shows garbage!
				}
                           }
                     }
               }
         }

      Print("Closing URL web connection");
           success = InternetCloseHandle(hInternetUrl);
           
           if (success == 0) 
         {     
            Message = Symbol() + " " + IndicatorName + " Error 896 - Unable to close URL handle!";
            Print(Message);
            Alert(Message);                                  
            HealthBuffer[0] = Error_state; 
            bSuccess = false;
         }
      else
         {
                 success = InternetCloseHandle(hInternet);

           if (success == 0) 
               {     
                  Message = Symbol() + " " + IndicatorName + " Error 898 - Unable to close Internet Handle!";
                  Print(Message);
                  Alert(Message);                                  
                  HealthBuffer[0] = Error_state; 
                  bSuccess = false;
               }
              }
              
           return(bSuccess);
   
   } // end of function
 

Я пытаюсь сделать скрипт GRABWEB.

очень простой... и отлично работает в билде 604

 
#import  "Wininet.dll"
   int InternetOpenW(string, int, string, string, int);
   int InternetConnectW(int, string, int, string, string, int, int, int); 
   int HttpOpenRequestW(int, string, string, int, string, int, string, int); 
   int InternetOpenUrlW(int, string, string, int, int, int);
   int InternetReadFile(int, string, int, int& OneInt[]);
   int InternetCloseHandle(int); 
   
#import
 
int start()
{
   string URL="http://www.forexfactory.com/ff_calendar_thisweek.xml";
  
    int HttpOpen = InternetOpenW(" ", 0, " "," ",0 ); 
    int HttpConnect = InternetConnectW(HttpOpen, "", 80, "", "", 3, 0, 1); 
    int HttpRequest = InternetOpenUrlW(HttpOpen,URL, NULL, 0, 0, 0);
   
   int read[1];
   string Buffer = " ";
   string NEWS = "";
 
   while (true)
   {
      InternetReadFile(HttpRequest, Buffer, StringLen(Buffer), read);
      if (read[0] > 0) NEWS = NEWS + StringSubstr(Buffer, 0, read[0]);
      else             break;
   }
   
 
   
   if (HttpRequest > 0) InternetCloseHandle(HttpRequest); 
   if (HttpConnect > 0) InternetCloseHandle(HttpConnect); 
   if (HttpOpen > 0) InternetCloseHandle(HttpOpen);  
     MessageBox(NEWS, "HTTP READ:" );     //  i show the result via message box
 
   //----
   return(0);
}
  
//+------------------------------------------------------------------+
 
WDholic:

Я пытаюсь сделать скрипт GRABWEB.

очень простой... и отлично работает в билде 604.


Могу я спросить, как вы преодолеваете эту ошибку компиляции в v604 для этой строки кода:

InternetReadFile(HttpRequest, Buffer, StringLen(Buffer), read);

Ошибка: 'Buffer' - преобразование параметров не разрешено

Пожалуйста, проверьте версию MT4 и попробуйте еще раз!



 
bennyHanna:


Могу я спросить, как вы преодолеваете эту ошибку компиляции в v604 для этой строки кода?

Ошибка: 'Buffer' - преобразование параметров не разрешено

Пожалуйста, проверьте версию MT4 и повторите попытку!




Нет такой ошибки на моих v604 и v600 с этой программой нет ошибок и предупреждений файл был загружен правильно
WDholic:

Я пытаюсь сделать скрипт GRABWEB.

очень простой... и работает нормально в билде 604.

Я попробовал, у меня тоже работает.... спасибо.
 
bennyHanna:


Могу я спросить, как вы преодолеваете эту ошибку компиляции в v604 для этой строки кода?

Ошибка: 'Buffer' - преобразование параметров не разрешено

Пожалуйста, проверьте версию MT4 и попробуйте еще раз!




возможно, вы используете u char

 int InternetReadFile(int, uchar & arr[], int, int & arr[]);

В моем скрипте я использую строку

int InternetReadFile(int, string, int, int& OneInt[]); 
Причина обращения: