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

 
WDholic:


puede ser que usted use u char

en mi script estoy usando una cadena


Sí, ese era el problema. Ahora compila bien con la v604. Así que básicamente tenemos que utilizar InternetOpenW e InternetOpenUrlW y concatenar la cadena de la misma manera que antes.

 
bennyHanna:


Sí, ese era el problema. Ahora compila bien con la v604. Así que básicamente tenemos que usar InternetOpenW e InternetOpenUrlW y concatenar la cadena de la misma manera que antes.

He estado usando el código de arriba, desarrollado por WDHolic, con éxito desde que apareció la build 600 (muchas gracias :-)). Desgraciadamente, cuando hoy he recompilado el código, bajo la build 830, me he encontrado con que ya no funciona. Me pregunto si alguna persona amable puede sugerir un ajuste para que vuelva a funcionar. El código que estoy utilizando es el siguiente:

string secData="";
   
if (!GrabWeb(secURL, secData))
{
   showDebug("Unable to access user file");
   return(1);  
}
.
.
.
.
#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
 
bool GrabWeb(string strUrl, string& strWebPage)
{
  
    int HttpOpen = InternetOpenW(" ", 0, " "," ",0 ); 
    int HttpConnect = InternetConnectW(HttpOpen, "", 80, "", "", 3, 0, 1); 
    int HttpRequest = InternetOpenUrlW(HttpOpen,strUrl, NULL, 0, 0, 0);
   
   int read[1];
   string Buffer = " ";
 
   while (true)
   {
      InternetReadFile(HttpRequest, Buffer, StringLen(Buffer), read);
      if (read[0] > 0) strWebPage = strWebPage + StringSubstr(Buffer, 0, read[0]);
      else             break;
   }
   
   if (HttpRequest > 0) InternetCloseHandle(HttpRequest); 
   if (HttpConnect > 0) InternetCloseHandle(HttpConnect); 
   if (HttpOpen > 0) InternetCloseHandle(HttpOpen);  
 
   return(true);
}

Ahora parece que sólo devuelve espacios.

Cualquier ayuda será muy agradecida. Gracias de antemano,

Greg

 
¿Hay alguna razón para no utilizar WebRequest en su lugar?
 
ydrol:
¿Hay alguna razón para no utilizar WebRequest?

Sólo que Grabweb es el primer método que conocí hace unos años y me ha resultado más fácil seguir con él que investigar otras opciones. Echaré un vistazo a WebRequest y veré si puedo incorporarlo a mi código. Muchas gracias por la sugerencia; volveré a publicar mis experiencias, espero que con éxito :-)

Gracias,

Greg

 
ydrol:
¿Hay alguna razón para no utilizar WebRequest en su lugar?

Yo utilizo WebRequest en mi avisador de noticias, pero WebRequest tiene una carencia que no le conviene a todo el mundo: sólo se puede utilizar en un EA.

De la documentación de WebRequest:

La función WebRequest() es asíncrona, lo que significa que interrumpe la ejecución del programa y espera la respuesta del servidor solicitado. Dado que los retrasos en la recepción de una respuesta pueden ser grandes, la función no está disponible para las llamadas de los indicadores, porque los indicadores se ejecutan en un hilo común compartido por todos los indicadores y gráficos de un símbolo. El retraso en la ejecución de los indicadores en uno de los gráficos de un símbolo puede detener la actualización de todos los gráficos del mismo símbolo.

 
honest_knave:

Yo utilizo WebRequest en mi alertador de noticias, pero WebRequest tiene un defecto que no le conviene a todo el mundo: sólo se puede utilizar en un EA.

La función WebRequest() es asíncrona, lo que significa que interrumpe la ejecución del programa y espera la respuesta del servidor solicitado. Dado que los retrasos en la recepción de una respuesta pueden ser grandes, la función no está disponible para las llamadas de los indicadores, porque los indicadores se ejecutan en un hilo común compartido por todos los indicadores y los gráficos de un símbolo. El retraso en la ejecución del indicador en uno de los gráficos de un símbolo puede detener la actualización de todos los gráficos del mismo símbolo.

Debería ser sincrónico.
 
angevoyageur:
Debería ser sincrónico.

Mi necesidad actual está en un EA, por lo que WebRequest será probablemente la respuesta a corto plazo.

Sin embargo, tengo una serie de indicadores que acceden a las noticias, lo que significa que tendré que intentar averiguar qué cambiar en Grabweb, si quiero que sigan siendo mantenibles. Me pregunto si la información de este artículo me dará la respuesta:https://www.mql5.com/en/articles/73 ?

 
gregspinner:

Mi necesidad actual es en un EA, por lo que WebRequest será probablemente la respuesta a corto plazo.

Sin embargo, tengo una serie de indicadores que acceden a las noticias, lo que significa que tendré que intentar averiguar qué cambiar en Grabweb, si quiero que sigan siendo mantenibles. Me pregunto si la información de este artículo dará la respuesta:https://www.mql5.com/en/articles/73 ?

Creo que he encontrado la respuesta - y estaba en el artículo mencionado anteriormente. El código de GrabWeb ahora tiene el siguiente aspecto:

#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 InternetReadFile(int, uchar &sBuffer[], int, int& OneInt);
   int InternetCloseHandle(int); 
   
#import
 
bool GrabWeb(string strUrl, string& strWebPage)
{
  
    int HttpOpen = InternetOpenW(" ", 0, " "," ",0 ); 
    int HttpConnect = InternetConnectW(HttpOpen, "", 80, "", "", 3, 0, 1); 
    int HttpRequest = InternetOpenUrlW(HttpOpen,strUrl, NULL, 0, 0, 0);
   
   /*int read[1];
   string Buffer = " ";
 
   while (true)
   {
      InternetReadFile(HttpRequest, Buffer, StringLen(Buffer), read);
      if (read[0] > 0) strWebPage = strWebPage + StringSubstr(Buffer, 0, read[0]);
      else             break;
   }*/
   
   uchar ch[500];
   string toStr="";
   int dwBytes,h;
   while(InternetReadFile(HttpRequest,ch,500,dwBytes))
   {
      if(dwBytes<=0) break;
      toStr=toStr+CharArrayToString(ch,0,dwBytes);
   }
   
   strWebPage=toStr;   
   
   if (HttpRequest > 0) InternetCloseHandle(HttpRequest); 
   if (HttpConnect > 0) InternetCloseHandle(HttpConnect); 
   if (HttpOpen > 0) InternetCloseHandle(HttpOpen);  
 
   return(true);
}

Básicamente...

1) he cambiado la definición de InternetRead para utilizar una referencia indirecta a un array uchar para los datos, y también para utilizar una variable int simple directa para el recuento.

2) hice que la función InternetRead usara un array uchar, y luego convertí el array poblado en una cadena.

No estoy muy seguro del efecto que tiene el tamaño de la matriz uchar. Parece que lee toda la página web (FFCal XML por ejemplo) sin tener en cuenta el tamaño, y eso es mayor de 500 bytes. ¿Es sólo un desperdicio de los próximos n bytes de memoria, o es el sistema lo suficientemente inteligente como para asignar dinámicamente el almacenamiento?

Saludos,

Greg

 
La respuesta también estaba en la primera página de este tema. Gracias por compartirla.
 
thili55:

Este código me ha funcionado perfectamente hasta que lo he probado en MT4 build 600, donde ya no verifica las cuentas de mi servidor.


Hola chicos, por favor, ¿de qué se trata este código, es un indicador o EA? He probado a ejecutarlo en el editor de mql4 y me sale el siguiente mensaje de error:

'Usuario - identificador no declarado'

En realidad se refiere a la siguiente línea de código:


(Línea: 112) GrabWeb("http://www.website.com/query.php?accountnumber="+AccountNumber()+"&login="+User, answer);


¿Cómo puedo declarar el "Usuario" para que sea aceptado por el programa o con qué puedo reemplazar el "Usuario"?

Estoy usando Windows 8.1, 64 bit OS, y MT4 versión 4.00, build 1010.

Gracias de antemano.