GrabWeb no funciona en MT4 Build 600 - página 2

 
gchrmt4:
...Sin embargo, ese script debería seguir funcionando para recuperar respuestas cortas del servidor, como los resultados de una consulta sobre licencias. Sólo tiene problemas si el tamaño de la respuesta del servidor es superior a 1KB.

Gracias, esto ha funcionado perfectamente.
 

Hola thili55,

¿Puedes ayudarnos y publicar tu solución para conseguir que grabWeb() funcione con la build 600? Creo que mucha gente estaría interesada en que FFCal funcionara con la build 600.

Muchas gracias

 
bennyHanna:

¿Puedes ayudarnos y publicar tu solución para conseguir que grabWeb() funcione con la versión 600? Creo que mucha gente estaría interesada en que FFCal funcione con la build 600.

Mira el post al que responde thili55 - pero ten en cuenta que actualmente parece haber problemas de manejo de cadenas en v600 que pueden afectar a la descarga de tantos datos como el calendario de FF.
 
gchrmt4:
Vea el post al que responde thili55 - pero tenga en cuenta que actualmente parece haber problemas de manejo de cadenas en v600 que pueden afectar a la descarga de tantos datos como el calendario de FF.


Gracias por su respuesta. Así que tendremos que esperar a que se corrija la versión 600 antes de idear una solución para GrabWeb, ¿correcto? ¿O es que la v603 ya tiene una solución?

 
bennyHanna:


Gracias por su respuesta. ¿Así que tendremos que esperar a que se corrija la v600 antes de idear una solución para grabWeb, es correcto? ¿O se ha previsto una solución en la versión 603?

Parece que no entiendes el problema. Hay que arreglar el código para tener en cuenta el cambio en mql4.
 

Aquí está la función GrabWeb actualizada para funcionar en v600. Ahora utiliza InternetOpenW e InternetOpenUrlW y la conversión de unicode. Obtiene los archivos XML correctamente pero todos los archivos tienen datos NULL. Vea la sentencia Print para StrWebPage en el código. Si miras los datos de salida son basura mientras que strThisRead tiene datos válidos. ¿Puede alguien echar un vistazo y ver si puede encontrar una solución? Sigue el arreglo en este hilo: https://www.mql5.com/en/forum/149360

Sólo tienes que copiar y pegar el código en tu FFCal.mq4 y compilar con v600 MT4 y ejecutar (por favor, edita los elementos que no pertenecen a tu versión para que compile).

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
 

Trato de hacer un script GRABWEB

muy simple.. y funciona bien en la compilación 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:

Trato de hacer un script GRABWEB

muy Simple .. y funciona bien en la construcción 604


Puedo preguntar cómo se supera este error de compilación con v604 para esta línea de código:

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

Error: 'Buffer' - conversión de parámetros no permitida

Por favor, compruebe su versión de MT4 y vuelva a intentarlo.



 
bennyHanna:


Puedo preguntar cómo está superando este error de compilación con v604 para esta línea de código:

Error: 'Buffer' - conversión de parámetros no permitida

Por favor, compruebe su versión de MT4 y vuelva a intentarlo.




No hay tal error en mi v604 y v600 con este programa sin errores y sin advertencias el archivo se descargó correctamente
WDholic:

Intento hacer un script GRABWEB

muy simple .. y funciona bien en la construcción 604

He probado, me funciona también.... gracias
 
bennyHanna:


¿Puedo preguntar cómo está superando este error de compilación con v604 para esta línea de código:

Error: 'Buffer' - conversión de parámetros no permitida

Por favor, compruebe su versión de MT4 y vuelva a intentarlo.




puede ser que estés usando el char de u

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

en mi script utilizo una cadena

int InternetReadFile(int, string, int, int& OneInt[]); 
Razón de la queja: