GrabWeb não funciona no MT4 Build 600 - página 3

 
WDholic:


pode ser você usando u char

no meu script eu uso cordel


Sim, essa era a questão. Agora compila bem com a v604. Portanto, basicamente precisamos usar InternetOpenW e InternetOpenUrlW e concatenar a seqüência da mesma forma que antes.

 
bennyHanna:


Sim, essa era a questão. Agora compila bem com a v604. Portanto, basicamente precisamos usar InternetOpenW e InternetOpenUrlW e concatenar a seqüência da mesma forma que antes.

Tenho usado o código acima, desenvolvido pela WDHolic, com sucesso desde o build 600 (muito obrigado :-)). Infelizmente, quando por acaso recompilei o código hoje, sob o build 830, descobri que ele não funciona mais. Pergunto-me se alguma pessoa gentil pode sugerir um ajuste para que ele funcione novamente. O código que estou usando é o seguinte:

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

Agora parece que só devolve espaços.

Qualquer ajuda seria recebida com muita gratidão. Obrigado em antecipação,

Greg

 
Algum motivo para não usar WebRequest em vez disso ?
 
ydrol:
Algum motivo para não usar WebRequest em vez disso ?

Só que Grabweb é o primeiro método que encontrei há alguns anos atrás e tem sido mais fácil de seguir do que investigar outras opções! Vou dar uma olhada no WebRequest e ver se consigo incorporá-lo em meu código. Muito obrigado pela sugestão - vou postar de volta com minhas experiências - espero que bem sucedido :-)

Muito obrigado,

Greg

 
ydrol:
Algum motivo para não usar WebRequest em vez disso ?

Uso o WebRequest em meu alerta de notícias, mas o WebRequest sofre uma falha que não serve para todos: ele só pode ser usado em um EA.

A partir da documentação do WebRequest:

A função WebRequest() é assíncrona, o que significa que ela quebra a execução do programa e aguarda a resposta do servidor solicitado. Como os atrasos no recebimento de uma resposta podem ser grandes, a função não está disponível para chamadas dos indicadores, pois os indicadores funcionam em um fio comum compartilhado por todos os indicadores e gráficos em um único símbolo. O atraso de desempenho dos indicadores em um dos gráficos de um símbolo pode interromper a atualização de todos os gráficos do mesmo símbolo.

 
honest_knave:

Uso o WebRequest em meu alerta de notícias, mas o WebRequest sofre uma falha que não serve para todos: ele só pode ser usado em um EA.

A função WebRequest() é assíncrona, o que significa que ela quebra a execução do programa e aguarda a resposta do servidor solicitado. Como os atrasos no recebimento de uma resposta podem ser grandes, a função não está disponível para chamadas dos indicadores, pois os indicadores funcionam em um fio comum compartilhado por todos os indicadores e gráficos em um único símbolo. O atraso de desempenho dos indicadores em um dos gráficos de um símbolo pode interromper a atualização de todos os gráficos do mesmo símbolo.

Deve ser síncrono.
 
angevoyageur:
Deve ser sincrônico.

Minha exigência atual está em um EA, portanto o WebRequest será provavelmente a resposta a curto prazo.

Tenho, entretanto, uma série de indicadores que acessam as notícias, o que significa que terei que tentar descobrir o que mudar na Grabweb, se eu quiser que elas continuem a ser sustentáveis. Pergunto-me se as informações contidas neste artigo fornecerão a resposta:https://www.mql5.com/en/articles/73 ?

 
gregspinner:

Minha exigência atual está em um EA, portanto o WebRequest será provavelmente a resposta a curto prazo.

Tenho, entretanto, uma série de indicadores que acessam as notícias, o que significa que terei que tentar descobrir o que mudar na Grabweb, se eu quiser que elas continuem a ser sustentáveis. Pergunto-me se as informações contidas neste artigo fornecerão a resposta:https://www.mql5.com/en/articles/73 ?

Acho que encontrei a resposta - e estava no artigo mencionado acima. O código GrabWeb agora parece ser o seguinte:

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

Basicamente...

1) mudou a definição de InternetRead para usar uma referência indireta a uma matriz uchar para os dados, e também para usar uma variável int simples direta para a contagem.

2) fez com que a função InternetRead usasse uma matriz de uchar, e depois converteu a matriz preenchida em uma string.

Não estou muito certo do efeito que o tamanho do array uchar tem. Parece ler toda a página da web (FFCal XML, por exemplo) independentemente, e isso é maior do que 500 bytes. Será que isso está apenas piscando sobre os próximos n bytes de memória, ou o sistema é inteligente o suficiente para alocar dinamicamente o armazenamento? esperemos que este último!

Abraço,

Greg

 
A resposta também estava na primeira página deste tópico. Obrigado por compartilhar.
 
thili55:

Este código funcionou sem falhas para mim até testá-lo no MT4 build 600, onde não verifica mais as contas do meu servidor.


Olá pessoal, por favor, do que se trata este código, ele é um indicador ou EA? Eu tentei executá-lo no editor mql4 e recebi a seguinte mensagem de erro:

'Usuário - identificador não declarado'.

Na verdade, está se referindo à seguinte linha de código:


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


Como posso declarar o "Usuário" para ser aceito pelo programa ou com o que posso substituir o "Usuário"?

Estou usando Windows 8.1, SO 64 bits e MT4 versão 4.00, build 1010.

Agradecemos antecipadamente.