GrabWeb não funciona no MT4 Build 600 - página 2

 
gchrmt4:
...Entretanto, esse script ainda deve funcionar para recuperar respostas curtas do servidor, tais como os resultados de uma consulta de licenciamento. Só tem problemas se o tamanho da resposta do servidor exceder 1KB-ish.

Obrigado, isto funcionou perfeitamente!
 

Oi thili55,

Você pode nos ajudar e publicar sua solução para conseguir que a grabWeb() funcione com build 600? Penso que muitas pessoas estariam interessadas em ter a FFCal trabalhando com a build 600.

Muito obrigado.

 
bennyHanna:

Você pode nos ajudar e publicar sua solução para conseguir que a grabWeb() funcione com build 600? Penso que muitas pessoas estariam interessadas em ter a FFCal trabalhando com a build 600.

Veja o post ao qual thili55 está respondendo - mas note que atualmente parece haver problemas de manuseio de strings na v600 que podem afetar o download de tantos dados quanto o calendário FF.
 
gchrmt4:
Veja o post ao qual thili55 está respondendo - mas note que atualmente parece haver problemas de manuseio de strings na v600 que podem afetar o download de tantos dados quanto o calendário FF.


Obrigado por sua resposta. Então, precisaremos esperar por uma correção da v600 antes de elaborarmos uma solução para a grabWeb correta? Ou foi fornecida uma correção na v603?

 
bennyHanna:


Obrigado por sua resposta. Então precisaremos esperar por uma correção de v600 antes de elaborarmos uma solução para o "grabWeb" correto? Ou foi fornecida uma correção na v603?

Parece que você não entende o problema. O código tem que ser fixado para levar em conta a mudança no mql4.
 

Aqui está a função GrabWeb atualizada para rodar na v600. Ela agora usa InternetOpenW e InternetOpenUrlW e a conversão de unicode. Ele obtém os arquivos XML OK, mas todos os arquivos têm dados NULL. Veja a declaração de impressão para StrWebPage no código. Se você olhar para os dados impressos, eles são lixo enquanto strThisRead tem dados válidos. Alguém pode dar uma olhada e ver se consegue detectar uma correção? Segue a correção neste tópico: https://www.mql5.com/en/forum/149360

Basta copiar e colar o código em seu FFCal.mq4 e compilar com v600 MT4 e executar (por favor, edite os itens que não pertencem à sua versão para que ela compila).

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
 

eu tento fazer um roteiro GRABWEB

muito simples... e funciona bem na construção 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:

eu tento fazer um roteiro GRABWEB

muito simples... e funciona bem na construção 604


Posso perguntar como você está superando este erro de compilação com a v604 para esta linha de código:

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

Erro: 'Buffer' - a conversão de parâmetros não é permitida

Por favor, verifique sua versão MT4 e tente novamente!



 
bennyHanna:


Posso perguntar como você está superando este erro de compilação com a v604 para esta linha de código:

Erro: 'Buffer' - a conversão de parâmetros não é permitida

Por favor, verifique sua versão MT4 e tente novamente!




Não existe tal erro em minha v604 e v600 com este programa nenhum erro e nenhum aviso de que o arquivo foi baixado corretamente
WDholic:

eu tento fazer um roteiro GRABWEB

muito simples... e funciona bem na construção 604

Eu tentei, funciona para mim também.... obrigado
 
bennyHanna:


Posso perguntar como você está superando este erro de compilação com a v604 para esta linha de código:

Erro: 'Buffer' - a conversão de parâmetros não é permitida

Por favor, verifique sua versão MT4 e tente novamente!




pode ser você usando u char

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

no meu script eu uso string

int InternetReadFile(int, string, int, int& OneInt[]); 
Razão: