Build 216 bug ? isConnected() retorna falso mas metatrader ainda conectado - página 2

 
OK, sim, entendi...bem...veremos se volta ;)
 

Oi Stringo,



infelizmente, este erro persiste.

Ao executar o script de teste por baixo e trocar de uma conta para outra (no meu caso de teste eu usei contas de 2 ou 3 corretores diferentes e troquei de um para outro), você pode ver que depois de algumas trocas de contas (número bastante aleatório) a conexãoState realmente não muda de volta para 1, ela permanece 0 mesmo que o Terminal _ esteja_ conectado.


Aos seus olhos, isto pode não ser um bug crítico. Entretanto, para algumas pessoas que desenvolvem scripts que exibem o connectionState, os resultados dos testes conduzidos são bastante alarmantes.

É por isso que eu estava muito grato se você pudesse dar uma olhada nesta questão novamente.



Aqui está o testScript:


//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
   while(!IsStopped())
   {
      Print("test"+IsConnected());
      Sleep(500);
   }
}




Atenciosamente, o seu,


Daniel.

 
Também posso confirmar que este bug existe no build 216. Parece ocorrer após algum número de 'conexões falhadas' - seqüências de login.
 
Sim, este roteiro é conhecido. Mas devemos reproduzir o ambiente para detectar o problema. No entanto, não podemos reproduzir
 

Devo também confirmar o mesmo erro. No meu EA eu verifico simultaneamente se existe conexão. Caso não exista, meu script sai.

Alguém encontrou uma solução para isso?

 

O roteiro não pode determinar o problema por causa do loop infinito e da independência dos tiquetaques recebidos.

O problema pode mostrar apenas especialistas. Simples especialista com apenas uma linha de código - Print(IsConnected());

Tick income (significa que o terminal está conectado) - a função iniciar é executada - oops! IsConnected() retorna 0 (ou seja, falso)

 

obrigado

sim eu uso

int start()
{
 while(true)
 {
  if(IsConnected())
   {
    ....... i do my work 
   {
   else 
   {return(-1);} // so if connection was lost i break the infiny loop
 }
}

o problema é que quando a conexão está de volta IsConnected() kepps o antigo valor é falso e não muda para verdadeiro! Mas eu estou vendo o preço se mover e o terminal está conectado 100%. Isto é um bug porque o loop infinito foi quebrado e o início foi executado porque nada aconteceu no primeiro tick depois que a conexão foi restaurada. Mas por alguma razão Is Connected() ainda retorna falso. Se eu remover a EA do gráfico e colocar novamente tudo funciona bem até que a próxima conexão seja perdida.



Isto me deixa louco. Por favor, faça algo a respeito disso!

Obrigado

 

Liliput - se acima está o esboço de início() de uso, por que ficar nele com o loop infinito?

Eu pergunto porque normal? a maneira é entrar > quero trabalhar? não:retorno > fazer trabalho > retornar

(normal - é subjetivo, é claro ;o)

não lhe dizer como projetar - esse é o seu negócio, apenas perguntando o seu raciocínio, então eu aprendo mais/ver diferentes maneiras de fazer as coisas!

O que me levou a perguntar?

Não tenho idéia de como o Terminal se comporta se, por exemplo, um EA se recusa a retornar a ele por talvez muitos tiquetaques de dados que, como o EA não retorna - o Término simplesmente não faz a chamada para começar()... ou - ele simplesmente não faz a chamada e eventualmente devido a muitos tiquetaques de dados que passam sem ter sido capaz de chamar o início do EA() o Terminal entra em profundidades desconhecidas e manifesta o problema conectado?

;)

 

Será que isso pode resolver o problema?

string FILE[1];
int MOVE[1];
 
void init() { FILE[0]=Symbol(); }
 
int start()
  {
//---- check connection
   if ( !Connection() ) return(0);
//---- 
   return(0);
  }
 
bool Connection()
  {
   int d;
   bool connect;
   RefreshRates();
   for ( d=0; d<ArraySize(FILE); d++)
    {
     if ( MOVE[d] != MarketInfo(FILE[d],5) )
      {
       MOVE[d] = MarketInfo(FILE[d],5);
       /* if ( !connect ) */
       connect=1;
      }
    }
   return(connect);
  }
 
ukt:

Liliput - se acima está o esboço de início() de uso, por que ficar nele com o loop infinito?

Eu pergunto porque normal? a maneira é entrar > quero trabalhar? não:retorno > fazer trabalho > retornar

(normal - é subjetivo, é claro ;o)

não lhe dizer como projetar - esse é o seu negócio, apenas perguntando o seu raciocínio, então eu aprendo mais/ver diferentes maneiras de fazer as coisas!

O que me levou a perguntar?

Não tenho idéia de como o Terminal se comporta se, por exemplo, um EA se recusa a retornar a ele por talvez muitos tiquetaques de dados que, como o EA não retorna - o Término simplesmente não faz a chamada para começar()... ou - ele simplesmente não faz a chamada e eventualmente devido a muitos tiquetaques de dados que passam sem ter sido capaz de chamar o início do EA() o Terminal entra em profundidades desconhecidas e manifesta o problema conectado?

;)


ukt, não há problema que eu responda. Eu faço loop infinito porque preciso fazer muitas operações e não quero esperar por um novo tick para fazê-las. Portanto, assumo o controle do terminal desta maneira e faço meu trabalho quando preciso e quero. Eu uso RefreshRates() para obter dados reais.

Então é lógico checar se existe conexão com o corretor porque eu envio/fecho/modificar ordens e se não existe conexão então não funciona. simples é que. há também outras verificações para sair do loop que eu uso. por exemplo IsStoped() e assim por diante, mas o problema não está no meu código, está no IsConnected().

Razão: