GrabWeb non funziona su MT4 Build 600 - pagina 3

 
WDholic:


può essere che tu usi u char

nel mio script sto usando una stringa


Sì, questo era il problema. Ora si compila bene con v604. Quindi fondamentalmente dobbiamo usare InternetOpenW e InternetOpenUrlW e concatenare la stringa allo stesso modo di prima .

 
bennyHanna:


Sì, questo era il problema. Ora compila bene con v604. Quindi fondamentalmente dobbiamo usare InternetOpenW e InternetOpenUrlW e concatenare la stringa allo stesso modo di prima.

Ho usato il codice qui sopra, sviluppato da WDHolic, con successo da quando è arrivata la build 600 (grazie mille :-)). Sfortunatamente, quando mi è capitato di ricompilare il codice oggi, sotto la build 830, ho scoperto che non funziona più. Mi chiedo se qualche persona gentile può suggerire una modifica per farlo funzionare di nuovo. Il codice che sto usando è il seguente:

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);
}

Ora sembra restituire solo spazi.

Qualsiasi aiuto sarebbe ricevuto con gratitudine, grazie in anticipo,

Greg

 
C'è qualche ragione per non usare invece WebRequest?
 
ydrol:
Qualche ragione per non usare WebRequest invece?

Solo che Grabweb è il primo metodo in cui mi sono imbattuto qualche anno fa ed è stato più facile attenersi ad esso che indagare su altre opzioni! Darò un'occhiata a WebRequest e vedrò se posso inserirlo nel mio codice. Molte grazie per il suggerimento - posterò le mie esperienze - sperando di avere successo :-)

Grazie,

Greg

 
ydrol:
Qualche ragione per non usare invece WebRequest?

Io uso WebRequest nel mio news alerter, ma WebRequest ha un difetto che non sarà adatto a tutti: può essere usato solo in un EA.

Dalla documentazione di WebRequest:

La funzione WebRequest() è asincrona, il che significa che interrompe l'esecuzione del programma e aspetta la risposta dal server richiesto. Poiché i ritardi nella ricezione di una risposta possono essere grandi, la funzione non è disponibile per le chiamate dagli indicatori, perché gli indicatori vengono eseguiti in un thread comune condiviso da tutti gli indicatori e grafici su un simbolo. Il ritardo delle prestazioni degli indicatori su uno dei grafici di un simbolo può fermare l'aggiornamento di tutti i grafici dello stesso simbolo.

 
honest_knave:

Io uso WebRequest nel mio news alerter, ma WebRequest ha un difetto che non sarà adatto a tutti: può essere usato solo in un EA.

La funzione WebRequest() è asincrona, il che significa che interrompe l'esecuzione del programma e aspetta la risposta dal server richiesto. Poiché i ritardi nella ricezione di una risposta possono essere grandi, la funzione non è disponibile per le chiamate dagli indicatori, perché gli indicatori vengono eseguiti in un thread comune condiviso da tutti gli indicatori e i grafici su un simbolo. Il ritardo di esecuzione dell'indicatore su uno dei grafici di un simbolo può fermare l'aggiornamento di tutti i grafici dello stesso simbolo.

Dovrebbe essere sincrono.
 
angevoyageur:
Dovrebbe essere sincrono.

Il mio attuale requisito è in un EA, quindi WebRequest sarà probabilmente la risposta a breve termine.

Tuttavia, ho una serie di indicatori che accedono alle notizie, il che significa che dovrò cercare di capire cosa cambiare in Grabweb, se voglio che continuino ad essere mantenibili. Mi chiedo se le informazioni in questo articolo forniranno la risposta:https://www.mql5.com/en/articles/73 ?

 
gregspinner:

Il mio attuale requisito è in un EA, quindi WebRequest sarà probabilmente la risposta a breve termine.

Tuttavia, ho una serie di indicatori che accedono alle notizie, il che significa che dovrò cercare di capire cosa cambiare in Grabweb, se voglio che continuino ad essere mantenibili. Mi chiedo se le informazioni in questo articolo forniranno la risposta:https://www.mql5.com/en/articles/73 ?

Penso di aver trovato la risposta - ed era nell'articolo menzionato sopra. Il codice di GrabWeb ora appare come segue:

#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);
}

Fondamentalmente...

1) ho cambiato la definizione di InternetRead per usare un riferimento indiretto a un array uchar per i dati, e anche per usare una variabile int semplice diretta per il conteggio.

2) fatto sì che la funzione InternetRead usi un array uchar, e poi convertito l'array popolato in una stringa.

Non sono troppo sicuro dell'effetto che ha la dimensione dell'array uchar. Sembra che legga l'intera pagina web (FFCal XML per esempio) a prescindere, e questo è più grande di 500 byte. È solo un blatting sui prossimi n byte di memoria, o il sistema è abbastanza intelligente da allocare dinamicamente la memoria? speriamo la seconda!

Grazie,

Greg

 
La risposta era anche nella prima pagina di questo argomento. Grazie per averla condivisa.
 
thili55:

Questo codice ha funzionato perfettamente per me fino a quando l'ho provato in MT4 build 600, dove non verifica più i conti dal mio server.


Ciao ragazzi, per favore, cos'è questo codice, è un indicatore o un EA? Ho provato ad eseguirlo nell'editor di mql4 e ho ottenuto il seguente messaggio di errore:

'Utente - identificatore non dichiarato'

In realtà si riferisce alla seguente linea di codice:


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


Come posso dichiarare l'"Utente" per essere accettato dal programma o con cosa posso sostituire l'"Utente"?

Sto usando Windows 8.1, 64 bit OS, e MT4 versione 4.00, build 1010.

Grazie in anticipo.