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.
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"!
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);
}
Por causa da mudança para unicdoe strings, agora é necessário usar InternetOpenUrlW
Funcionou de fato! Obrigado!
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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.