GrabWeb funktioniert nicht auf MT4 Build 600 - Seite 3

 
WDholic:


vielleicht verwenden Sie u char

in meinem Skript verwende ich string


Ja, das war das Problem. Jetzt kompiliert es gut mit v604. Im Grunde müssen wir also InternetOpenW und InternetOpenUrlW verwendenund die Zeichenfolge auf die gleiche Weise wie zuvor verketten.

 
bennyHanna:


Ja, das war das Problem. Jetzt kompiliert es gut mit v604. Im Grunde müssen wir also InternetOpenW und InternetOpenUrlW verwendenund die Zeichenfolge auf die gleiche Weise wie zuvor verketten.

Ich habe den obigen Code, der von WDHolic entwickelt wurde, seit der Einführung von Build 600 erfolgreich verwendet (vielen Dank :-)). Als ich den Code heute zufällig unter Build 830 neu kompilierte, stellte ich leider fest, dass er nicht mehr funktioniert. Ich frage mich, ob jemand eine Verbesserung vorschlagen kann, damit er wieder funktioniert. Der Code, den ich verwende, lautet wie folgt:

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

Er scheint jetzt nur noch Leerzeichen zurückzugeben.

Für jede Hilfe wäre ich sehr dankbar, vielen Dank im Voraus,

Greg

 
Gibt es einen Grund, stattdessen nicht WebRequest zu verwenden?
 
ydrol:
Gibt es einen Grund, stattdessen nicht WebRequest zu verwenden?

Nur, dass Grabweb die erste Methode ist, auf die ich vor ein paar Jahren gestoßen bin, und es war einfacher, dabei zu bleiben, als andere Optionen zu untersuchen! Ich werde mir WebRequest anschauen und sehen, ob ich es in meinen Code einbauen kann. Vielen Dank für den Vorschlag - ich werde meine Erfahrungen zurückmelden - hoffentlich erfolgreich :-)

Vielen Dank!

Greg

 
ydrol:
Gibt es einen Grund, stattdessen nicht WebRequest zu verwenden?

Ich verwende WebRequest in meinem News Alerter, aber WebRequest hat ein Manko, das nicht jedem gefallen wird: Es kann nur in einem EA verwendet werden.

Aus der WebRequest-Dokumentation:

Die Funktion WebRequest() ist asynchron, d.h. sie unterbricht die Programmausführung und wartet auf die Antwort des angeforderten Servers. Da die Verzögerungen beim Empfang einer Antwort groß sein können, ist die Funktion nicht für Aufrufe von Indikatoren verfügbar, da Indikatoren in einem gemeinsamen Thread laufen, der von allen Indikatoren und Charts auf einem Symbol gemeinsam genutzt wird. Eine Verzögerung der Indikatorleistung auf einem der Charts eines Symbols kann die Aktualisierung aller Charts desselben Symbols stoppen.

 
honest_knave:

Ich verwende WebRequest in meinem News Alerter, aber WebRequest hat einen Nachteil, der nicht jedem gefallen wird: Es kann nur in einem EA verwendet werden.

Die Funktion WebRequest() ist asynchron, das heißt, sie unterbricht die Programmausführung und wartet auf die Antwort des angeforderten Servers. Da die Verzögerungen beim Empfang einer Antwort groß sein können, ist die Funktion nicht für Aufrufe von Indikatoren verfügbar, da Indikatoren in einem gemeinsamen Thread laufen, der von allen Indikatoren und Charts auf einem Symbol gemeinsam genutzt wird. Eine Verzögerung der Indikatorleistung auf einem der Charts eines Symbols kann dazu führen, dass alle Charts desselben Symbols nicht mehr aktualisiert werden.

Sollte synchron sein.
 
angevoyageur:
Sollte synchron sein.

Ich benötige derzeit einen EA, so dass WebRequest wahrscheinlich die kurzfristige Lösung sein wird.

Ich habe jedoch eine Reihe von Indikatoren, die auf die Nachrichten zugreifen, was bedeutet, dass ich versuchen muss, herauszufinden, was ich in Grabweb ändern muss, wenn ich möchte, dass sie weiterhin gewartet werden können. Ich frage mich, ob die Informationen in diesem Artikel die Antwort liefern werden:https://www.mql5.com/en/articles/73 ?

 
gregspinner:

Da ich derzeit einen EA benötige, wird WebRequest wahrscheinlich die kurzfristige Lösung sein.

Ich habe jedoch eine Reihe von Indikatoren, die auf die Nachrichten zugreifen, was bedeutet, dass ich versuchen muss, herauszufinden, was ich in Grabweb ändern muss, wenn ich möchte, dass sie weiterhin wartbar sind. Ich frage mich, ob die Informationen in diesem Artikel die Antwort liefern werden:https://www.mql5.com/en/articles/73 ?

Ich glaube, ich habe die Antwort gefunden - und sie stand in dem oben erwähnten Artikel. Der GrabWeb-Code sieht jetzt wie folgt aus:

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

Im Grunde genommen...

1) änderte ich die Definition von InternetRead, um einen indirekten Verweis auf ein uchar-Array für die Daten zu verwenden, und um eine direkte einfache int-Variable für die Anzahl zu verwenden.

2) habe ich die InternetRead-Funktion dazu gebracht, ein uchar-Array zu verwenden, und dann das gefüllte Array in einen String umgewandelt.

Ich bin mir nicht ganz sicher, wie sich die Größe des uchar-Arrays auswirkt. Es scheint die gesamte Webseite (z.B. FFCal XML) zu lesen, und die ist größer als 500 Bytes. Ist es einfach nur eine Vergeudung der nächsten n Bytes Speicher, oder ist das System schlau genug, um dynamisch Speicher zuzuweisen? hoffentlich letzteres!

Zum Wohl!

Greg

 
Die Antwort stand auch auf der ersten Seite dieses Themas. Danke fürs Teilen.
 
thili55:

Dieser Code hat einwandfrei für mich bis zum Testen es in MT4 build 600, wo es nicht mehr verifiziert Konten von meinem Server gearbeitet.


Hallo Leute, bitte was ist dieser Code alles über, ist es ein Indikator oder EA? Ich habe versucht, ihn im mql4-Editor auszuführen und erhielt folgende Fehlermeldung:

'User - undeklarierter Bezeichner'

Sie bezieht sich eigentlich auf die folgende Codezeile:


(Zeile: 112) GrabWeb("http://www.website.com/query.php?accountnumber="+Kontonummer()+"&login="+Benutzer, Antwort);


Wie kann ich den "User" deklarieren, damit er vom Programm akzeptiert wird, oder durch was kann ich den "User" ersetzen?

Ich verwende Windows 8.1, 64 bit OS, und MT4 Version 4.00, Build 1010.

Ich danke Ihnen im Voraus.