GrabWeb ne fonctionne pas sur MT4 Build 600 - page 3

 
WDholic:


peut-être que vous utilisez u char

dans mon script, j'utilise une chaîne de caractères


Oui, c'était le problème. Maintenant, il compile bien avec la v604. Donc, en fait, nous devons utiliser InternetOpenW et InternetOpenUrlW et concaténer la chaîne de la même manière qu'avant.

 
bennyHanna:


Oui, c'était le problème. Maintenant, il compile bien avec la v604. Donc, en fait, nous devons utiliser InternetOpenW et InternetOpenUrlW et concaténer la chaîne de la même manière qu'auparavant.

J'ai utilisé le code ci-dessus, développé par WDHolic, avec succès depuis l'arrivée de la build 600 (merci beaucoup :-)). Malheureusement, lorsque j'ai recompilé le code aujourd'hui, sous la build 830, j'ai constaté qu'il ne fonctionne plus. Je me demande si une personne aimable peut suggérer une modification pour le faire fonctionner à nouveau. Le code que j'utilise est le suivant :

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

Il semble maintenant qu'il ne renvoie que des espaces.

Toute aide serait la bienvenue. Merci d'avance,

Greg

 
Y a-t-il une raison de ne pas utiliser WebRequest à la place ?
 
ydrol:
Y a-t-il une raison de ne pas utiliser WebRequest à la place ?

Seulement, Grabweb est la première méthode que j'ai rencontrée il y a quelques années et il a été plus facile de m'y tenir que d'étudier d'autres options ! Je vais jeter un coup d'œil à WebRequest et voir si je peux l'intégrer dans mon code. Merci beaucoup pour la suggestion - je vous ferai part de mes expériences - si possible réussies :-)

Merci,

Greg

 
ydrol:
Y a-t-il une raison de ne pas utiliser WebRequest à la place ?

J'utilise WebRequest dans mon alerteur de nouvelles, mais WebRequest souffre d'un défaut qui ne conviendra pas à tout le monde : il ne peut être utilisé que dans un EA.

Extrait de la documentation de WebRequest:

La fonction WebRequest() est asynchrone, ce qui signifie qu'elle interrompt l'exécution du programme et attend la réponse du serveur demandé. Comme les délais de réception d'une réponse peuvent être importants, la fonction n'est pas disponible pour les appels des indicateurs, car les indicateurs s'exécutent dans un thread commun partagé par tous les indicateurs et graphiques sur un symbole. Un retard de performance d'un indicateur sur l'un des graphiques d'un symbole peut arrêter la mise à jour de tous les graphiques du même symbole.

 
honest_knave:

J'utilise WebRequest dans mon alerte de nouvelles, mais WebRequest souffre d'un défaut qui ne conviendra pas à tout le monde : il ne peut être utilisé que dans un EA.

La fonction WebRequest() est asynchrone, ce qui signifie qu'elle interrompt l'exécution du programme et attend la réponse du serveur demandé. Comme les délais de réception d'une réponse peuvent être importants, la fonction n'est pas disponible pour les appels des indicateurs, car les indicateurs s'exécutent dans un thread commun partagé par tous les indicateurs et graphiques sur un symbole. Un retard de performance d'un indicateur sur l'un des graphiques d'un symbole peut arrêter la mise à jour de tous les graphiques du même symbole.

Devrait être synchrone.
 
angevoyageur:
Devrait être synchrone.

Mon besoin actuel est dans un EA, donc WebRequest sera probablement la réponse à court terme.

Cependant, j'ai un certain nombre d'indicateurs qui accèdent aux nouvelles, ce qui signifie que je vais devoir essayer de trouver ce qu'il faut changer dans Grabweb, si je veux qu'ils continuent à être maintenables. Je me demande si les informations contenues dans cet article fourniront la réponse: https://www.mql5.com/en/articles/73 ?

 
gregspinner:

Mon besoin actuel est dans un EA, donc WebRequest sera probablement la réponse à court terme.

Cependant, j'ai un certain nombre d'indicateurs qui accèdent aux nouvelles, ce qui signifie que je vais devoir essayer de trouver ce qu'il faut changer dans Grabweb, si je veux qu'ils continuent à être maintenables. Je me demande si les informations contenues dans cet article apporteront la réponse: https://www.mql5.com/en/articles/73 ?

Je pense avoir trouvé la réponse - et elle était dans l'article mentionné ci-dessus. Le code de GrabWeb ressemble maintenant à ceci :

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

En gros...

1) j'ai changé la définition de InternetRead pour utiliser une référence indirecte à un tableau uchar pour les données, et aussi pour utiliser une simple variable int directe pour le compte.

2) j'ai fait en sorte que la fonction InternetRead utilise un tableau uchar, puis a converti le tableau rempli en une chaîne de caractères.

Je ne suis pas trop sûr de l'effet de la taille du tableau uchar. Il semble que la page web entière (FFCal XML par exemple) soit lue quoi qu'il en soit, et c'est plus grand que 500 octets. Est-ce qu'il se contente d'utiliser les n octets de mémoire suivants, ou est-ce que le système est assez intelligent pour allouer dynamiquement de l'espace ?

Merci,

Greg

 
La réponse se trouvait également sur la première page de ce sujet. Merci de partager.
 
thili55:

Ce code a fonctionné parfaitement pour moi jusqu'à ce que je le teste dans MT4 build 600, où il ne vérifie plus les comptes de mon serveur.


Bonjour les gars, s'il vous plaît, à quoi sert ce code, est-ce un indicateur ou un EA ? J'ai essayé de l'exécuter dans l'éditeur mql4 et j'ai obtenu le message d'erreur suivant :

'User - undeclared identifier' (Utilisateur - identifiant non déclaré)

Il s'agit en fait de la ligne de code suivante :


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


Comment déclarer le "User" pour qu'il soit accepté par le programme ou par quoi puis-je remplacer le "User" ?

J'utilise Windows 8.1, OS 64 bit, et MT4 version 4.00, build 1010.

Merci d'avance.