GrabWeb non funziona su MT4 Build 600 - pagina 2

 
gchrmt4:
...Tuttavia, quello script dovrebbe ancora funzionare per recuperare brevi risposte del server come i risultati di una query di licenza. Ha problemi solo se la dimensione della risposta del server supera 1KB-ish.

Grazie, ha funzionato perfettamente!
 

Ciao thili55,

Puoi aiutarci e postare la tua soluzione per far funzionare il grabWeb() con la build 600? Penso che molte persone sarebbero interessate ad avere FFCal funzionante con la build 600.

Molte grazie

 
bennyHanna:

Puoi aiutarci e postare la tua soluzione per far funzionare il grabWeb() con la build 600? Penso che molte persone sarebbero interessate ad avere FFCal funzionante con la build 600.

Vedi il post a cui risponde thili55 - ma nota che attualmente sembrano esserci problemi di gestione delle stringhe nella v600 che possono influenzare il download di tanti dati quanto il calendario FF.
 
gchrmt4:
Vedi il post a cui risponde thili55 - ma nota che attualmente sembrano esserci problemi di gestione delle stringhe nella v600 che possono influenzare il download di tanti dati quanto il calendario FF.


Grazie per la risposta. Quindi dovremo aspettare una correzione di v600 prima di escogitare una soluzione per grabWeb, giusto? O è stato fornito un fix nella v603?

 
bennyHanna:


Grazie per la tua risposta. Quindi dovremo aspettare un fix di v600 prima di escogitare una soluzione per grabWeb, giusto? O è stato fornito un fix nella v603?

Sembra che tu non capisca il problema. Il codice deve essere corretto per tenere conto del cambiamento in mql4.
 

Ecco la funzione GrabWeb aggiornata per funzionare su v600. Ora usa InternetOpenW e InternetOpenUrlW e la conversione di unicode. Ottiene i file XML OK ma i file hanno tutti dati NULL. Vedi la dichiarazione di stampa per StrWebPage nel codice. Se guardate i dati in uscita è spazzatura mentre strThisRead ha dati validi. Qualcuno può dare un'occhiata e vedere se può individuare una correzione? Segue la correzione su questo thread: https://www.mql5.com/en/forum/149360

Basta copiare e incollare il codice nel vostro FFCal.mq4 e compilare con v600 MT4 ed eseguire (si prega di modificare le voci che non appartengono alla vostra versione in modo che si compili).

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
 

Ho provato a fare uno script GRABWEB

molto semplice... e funziona bene nella build 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:

Ho provato a fare uno script GRABWEB

molto semplice... e funziona bene nella build 604


Posso chiedere come stai superando questo errore di compilazione con v604 per questa linea di codice:

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

Errore: 'Buffer' - conversione del parametro non consentita

Per favore controlla la tua versione di MT4 e prova di nuovo!



 
bennyHanna:


Posso chiederti come stai superando questo errore di compilazione con v604 per questa linea di codice:

Errore: 'Buffer' - conversione del parametro non consentita

Controlla la tua versione di MT4 e riprova!




Non c'è questo errore sul mio v604 e v600 con questo programma nessun errore e nessun avviso il file è stato scaricato correttamente
WDholic:

Ho provato a fare uno script GRABWEB

molto semplice... e funziona bene nella build 604

Ho provato, funziona anche per me.... grazie
 
bennyHanna:


Posso chiederti come stai superando questo errore di compilazione con la v604 per questa linea di codice:

Errore: 'Buffer' - conversione del parametro non consentita

Controlla la tua versione di MT4 e riprova!




forse stai usando il carattere u

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

nel mio script sto usando una stringa

int InternetReadFile(int, string, int, int& OneInt[]); 
Motivazione: