MQL4 atualizado e código antigo (compartilhamento de experiências de solução de problemas)

 

Acho que este tópico pode ser útil à luz da atualização.

No outro dia, decidi insensatamente atualizar o terminal e testei meus Conselheiros Especialistas sobre ele, mas não os atualizei sobre a conta real.

Eu tenho erros. Não quero dizer que a culpa é dos desenvolvedores, a culpa também é minha. Entretanto, eu gostaria de especificar alguns detalhes onde encontrei problemas:

1. Caracteres ilegíveis em nomes variáveis: É simples porque o compilador mostrou o símbolo $ como inválido. Conserte-a rápida e facilmente. Não houve mais erros na fase de compilação.

Depois disso, tive que encontrar as falhas no Expert Advisor, para as quais o compilador não reclamou.

2. Ao lançar o teste, recebi palavrões de que a biblioteca stdlib.ex4 não foi encontrada. A solução foi encontrada no código fonte stdlib na pasta especificada e foi recompilada.

3. Depois eliminei os bugs associados ao fato de que agora, como entendi NULL e 0 (zero) são coisas diferentes. Funções anteriores como iOpen(NULL,PERIOD_W1,1) funcionavam corretamente como iOpen(0,PERIOD_W1,1), ou seja, tanto 0 como NULL podiam ser especificadas. Não funciona agora, mas o compilador não jura, você só recebe um erro durante o funcionamento do Expert Advisor.

4. Não sei porque usei NormalizeDouble(pr1,Digits) ao definir um preço aberto, nível de parada ou lucro. Agora notei que esta função sempre retorna um valor com 4 casas decimais ao testar USDJPY com 3 casas decimais e, portanto, recebo erros ao abrir um pedido. Substituí Dígitos por Dígitos() e tudo está funcionando.

Isso é tudo que eu enfrentei no momento. Agora estou verificando minha EA em busca de outros possíveis problemas.

A propósito, se não recompilar o código antigo, o ex4 funcionará sem erros.

Minha construção é atualmente 579, eu ainda tenho 509 funcionando no real, vôo está ok, mas estou com medo de atualizar.

Se alguém tiver encontrado problemas com a transição - poste aqui, será útil para outros.

 
Verifique por 583, por favor.
 

Problema semelhante com a variável Ponto. Mudando para Ponto()

Ainda não chegou a 583 construídos. E meu corretor ainda não o tem.

 

Mais uma vez sobre Dígitos e Ponto.

Descobri que o problema com eles ocorre ao testar o mesmo Expert Advisor em símbolos de capacidade de dígitos diferentes. O testador não parece alterar estas variáveis. Por exemplo, primeiro o teste em Yerovdollar e depois troco o símbolo do dólar no testador e o problema ocorre. Ou vice versa.

Portanto, talvez este seja apenas um problema com o testador e isto não acontecerá na vida real. Mas eu estou sempre no caso de mudar de Dígitos em Dígitos () e Ponto em Ponto ()

A atualização ainda não ajuda. Somente o reinício do terminal ajuda.

 
Obrigado, verificaremos e consertaremos isso na segunda-feira.
 

Ah, e eu pensava que meu código estava todo bagunçado...

Também no testador o EA não funciona, se o primeiro teste foi em 4 dígitos, então os pares de ienes não são mais testados, não há posições abertas. Para que o teste passe neles também, tenho que reiniciar o terminal ou recompilar o EA.

Construir 584.

Não, eu não afirmo que meu código é perfeito, mas o mesmo código no build 509 funcionou no testador durante uma mudança do símbolo testado sem reiniciar o terminal, e sem recompilação.


P.S.: Até agora, o problema foi resolvido através de construções do tipo "call type":

   digits = MarketInfo( Symbol(), MODE_DIGITS);
   point = MarketInfo( Symbol(), MODE_POINT);

em vez de simplesmente atribuir valores a essas variáveis, o que parece significar a mesma coisa:

digits = Digits;
point = Point;
 

Ao traduzir para string para Comentário no gráfico, substituo Dígitos (dá 4) pelo número 5. Se eu ligar o "debugging", editar algo, então em "pausa" o gráfico desaparece, e ao concluir o debugging aparece um novo gráfico (todo verde) com o Expert Advisor, mas sem indicadores! Vai ser assim ou é temporário?

Ainda bem que somente o da Demo foi atualizado. O de Real ainda não foi atualizado. Não sei o que fazer, há posições abertas em um pequeno "menos"!

 

A seta verde aponta para a primeira linha no início:

int dígitos = MarketInfo( Symbol(), MODE_DIGITS); E na parte inferior: MQL4\Experts\ "EA name" start and line number Sem erros, mas não compila O que significa? Disseram-me que nada vai acontecer! Poderia explicar, por favor?

 

InternetOpenUrlA() da wininet.dll parou de funcionar

Saídas 0 (zero) em vez de texto de página da Internet.

Aqui está o código completo.

#import "wininet.dll"

int InternetOpenA( string sAgent, int lAccessType, string sProxyName, string sProxyBypass, int lFlags );

int InternetOpenUrlA( int hInternetSession, string sUrl, string sHeaders, int lHeadersLength, int lFlags, int lContext );

int InternetReadFile( int hFile, int& lpvBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[] );

int InternetCloseHandle( int hInet );

int InternetQueryDataAvailable( int hFile, int& lpdwNumberOfBytesAvailable[], int dwFlags, int dwContext );

int HttpQueryInfoA(int hRequest, int dwInfoLevel, int& lpvBuffer[], int& lpdwBufferLength[], int& lpdwReserved[] );

#import


#define INTERNET_OPEN_TYPE_PRECONFIG 0x00000000 // use registry configuration

#define INTERNET_FLAG_RELOAD 0x80000000

#define INTERNET_FLAG_NO_CACHE_WRITE 0x04000000

#define INTERNET_FLAG_PRAGMA_NOCACHE 0x00000100



//+------------------------------------------------------------------+

//| script program start function |

//+------------------------------------------------------------------+

int start()

{

if(!IsDllsAllowed())

{

Alert("Необходимо в настройках разрешить использование DLL");

return(0);

}

int hInternetSession = InternetOpenA("Microsoft Internet Explorer",

0, "", "", 0);

if(hInternetSession <= 0)

{

Alert("Ошибка при вызове InternetOpenA()");

return(0);

}

int hURL = InternetOpenUrlA(hInternetSession,"https://www.mql4.com", "", 0, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0);

if(hURL <= 0)

{

Alert("Ошибка при вызове InternetOpenUrlA()");

InternetCloseHandle(hInternetSession);

return(0);

}

int cBuffer[256];

int dwBytesRead[1];

string TXT = "";

while(!IsStopped())

{

bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead);

if(dwBytesRead[0] == 0)

break;

string text = "";

for(int i = 0; i < 256; i++)

{

text = text + CharToStr(cBuffer[i] & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 8 & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 16 & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 24 & 0x000000FF);

}

TXT = TXT + text;

Sleep(1);

}

if(TXT != "")

{

int h = FileOpen("SavedFromInternet.htm", FILE_CSV|FILE_WRITE);

if(h > 0)

{

FileWrite(h,TXT);

FileClose(h);

Alert("Готово! См. файл .../experts/files/SavedFromInternet.htm");

}

else

{

Alert("Ошибка при вызове FileOpen()");

}

}

else

{

Alert("Нет считанных данных");

}

InternetCloseHandle(hInternetSession);

return(0);

}

 
Devido à mudança para unicdoe strings, você deve agora usar InternetOpenUrlW
 
Renat:
Por causa da mudança para unicdoe strings, agora é necessário usar InternetOpenUrlW

Funcionou de fato! Obrigado!
Razão: