GrabWeb funktioniert nicht auf MT4 Build 600 - Seite 2

 
gchrmt4:
...Das Skript sollte aber immer noch funktionieren, um kurze Serverantworten wie die Ergebnisse einer Lizenzabfrage abzurufen. Es gibt nur dann Probleme, wenn die Größe der Serverantwort 1 KB überschreitet.

Danke, das hat perfekt funktioniert!
 

Hallo thili55,

Kannst du uns helfen und deine Lösung posten, damit grabWeb() mit Build 600 funktioniert? Ich denke, viele Leute wären daran interessiert, dass FFCal mit Build 600 funktioniert.

Vielen Dank!

 
bennyHanna:

Können Sie uns helfen und Ihre Lösung posten, damit grabWeb() mit Build 600 funktioniert? Ich denke, viele Leute wären daran interessiert, dass FFCal mit Build 600 funktioniert.

Siehe den Beitrag, auf den thili55 antwortet - aber beachten Sie, dass es derzeit Probleme bei der Handhabung von Zeichenketten in v600 zu geben scheint, die das Herunterladen von so vielen Daten wie der FF-Kalender beeinträchtigen können.
 
gchrmt4:
Siehe den Beitrag, auf den thili55 antwortet - aber beachten Sie, dass es derzeit Probleme bei der Handhabung von Zeichenketten in v600 zu geben scheint, die das Herunterladen so vieler Daten wie der FF-Kalender beeinträchtigen können.


Vielen Dank für Ihre Antwort. Wir müssen also auf eine Korrektur von v600 warten, bevor wir eine Lösung für grabWeb finden, richtig? Oder wurde ein Fix in v603 bereitgestellt?

 
bennyHanna:


Vielen Dank für Ihre Antwort. Wir müssen also auf einen Fix für v600 warten, bevor wir eine Lösung für grabWeb entwickeln können, richtig? Oder wurde ein Fix in v603 bereitgestellt?

Es scheint, dass Sie das Problem nicht verstehen. Der Code muss korrigiert werden, um die Änderung in mql4 zu berücksichtigen.
 

Hier ist die GrabWeb-Funktion, die aktualisiert wurde, um auf v600 zu laufen. Sie verwendet jetzt InternetOpenW und InternetOpenUrlW und die Umwandlung von Unicode. Sie erhält die XML-Dateien, aber die Dateien haben alle NULL-Daten. Siehe die Print-Anweisung für StrWebPage im Code. Wenn man sich die ausgegebenen Daten ansieht, ist es Müll, während strThisRead gültige Daten hat. Kann jemand einen Blick darauf werfen und sehen, ob er eine Lösung finden kann? Es folgt der Lösung in diesem Thread: https://www.mql5.com/en/forum/149360

Kopieren Sie einfach den Code und fügen Sie ihn in Ihre FFCal.mq4 ein, kompilieren Sie ihn mit v600 MT4 und führen Sie ihn aus (bitte editieren Sie die Elemente, die nicht in Ihre Version gehören, damit er kompiliert).

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
 

Ich versuche, ein GRABWEB-Skript zu erstellen

sehr einfach.. und funktioniert gut in 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:

Ich versuche, ein GRABWEB-Skript zu erstellen

sehr einfach.. und funktioniert gut in Build 604


Darf ich fragen, wie Sie diesen Kompilierungsfehler mit v604 für diese Code-Zeile beheben?

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

Fehler: 'Buffer' - Parameterumwandlung nicht erlaubt

Bitte überprüfen Sie Ihre MT4-Version und versuchen Sie es erneut!



 
bennyHanna:


Darf ich fragen, wie Sie diesen Kompilierungsfehler mit v604 für diese Codezeile überwinden?

Fehler: 'Buffer' - Parameterumwandlung nicht erlaubt

Bitte überprüfen Sie Ihre MT4-Version und versuchen Sie es erneut!




Es gibt keinen solchen Fehler auf meinem v604 und v600 mit diesem Programm keine Fehler und keine Warnungen die Datei wurde korrekt heruntergeladen
WDholic:

Ich versuche, ein GRABWEB-Skript zu erstellen

sehr einfach.. und funktioniert gut in Build 604

Ich habe es versucht, bei mir funktioniert es auch.... Danke
 
bennyHanna:


Darf ich fragen, wie Sie diesen Kompilierungsfehler mit v604 für diese Codezeile beheben?

Fehler: 'Buffer' - Parameterumwandlung nicht erlaubt

Bitte überprüfen Sie Ihre MT4-Version und versuchen Sie es erneut!




vielleicht verwenden Sie u char

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

in meinem Skript verwende ich string

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