Build 216 bug ? isConnected() retourne false mais metatrader reste connecté - page 2

 
OK, ouais, je l'ai... bien... on verra si ça revient ;)
 

Salut Stringo,



malheureusement, ce bug persiste.

En exécutant le script de test ci-dessous et en passant d'un compte à l'autre (dans mon cas de test, j'ai utilisé des comptes de 2 ou 3 courtiers différents et je suis passé de l'un à l'autre), vous pouvez constater qu'après quelques accountChanges (nombre assez aléatoire), le connectionState ne revient pas vraiment à 1, il reste à 0 même si le terminal _est_ connecté.


À vos yeux, il ne s'agit peut-être pas d'un bug critique. Cependant, pour certaines personnes développant des scripts qui affichent le connectionState, les résultats des tests effectués sont assez alarmants.

C'est pourquoi je vous serais très reconnaissant de bien vouloir réexaminer ce problème.



Voici le testScript :


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




Sincèrement vôtre,


Daniel.

 
Je peux également confirmer que ce bogue existe dans la version 216. Il semble se produire après un certain nombre de séquences de connexion "connect failed".
 
Oui, ce script est connu. Mais nous devons reproduire l'environnement pour détecter le problème. Cependant nous ne pouvons pas le reproduire
 

Je dois également confirmer le même bug. Dans mon EA, je vérifie simultanément si la connexion existe. Si ce n'est pas le cas, mon script s'arrête.

A-t-on trouvé une solution de contournement ?

 

Le script ne peut pas déterminer le problème à cause de la boucle sans fin et de l'indépendance des ticks entrants.

Le problème ne peut montrer que l'expert. Expert simple avec une seule ligne de code - Print(IsConnected()) ;

Les ticks arrivent (cela signifie que le terminal est connecté) - la fonction de démarrage s'exécute - oops ! IsConnected() retourne 0 (c'est à dire faux)

 

Merci

Oui, j'utilise

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

Le problème est que lorsque la connexion est rétablie, IsConnected() garde l'ancienne valeur false et ne devient pas true ! Mais je vois le prix bouger et le terminal est connecté à 100%. C'est un bug car la boucle infinie a été cassée et le démarrage a été exécuté car rien ne s'est passé sur le premier tick après le rétablissement de la connexion. Mais pour une raison quelconque, Is Connected() renvoie toujours false. Si je supprime l'EA du graphique et que je le remets en place, tout fonctionne bien jusqu'à la prochaine perte de connexion.



Cela me rend fou. S'il vous plaît, faites quelque chose à ce sujet !

Merci

 

Liliput - si ce qui précède est un aperçu de l'utilisation de start(), pourquoi y rester avec une boucle infinie ?

Je demande parce que la manière normale ? est d'entrer > est-ce que je veux travailler ? non:return > faire le travail > return

(normal - est subjectif bien sûr ;o)

je ne vous dis pas comment concevoir - c'est votre affaire, je vous demande juste votre raisonnement, alors j'apprends plus/je vois différentes façons de faire les choses !

Qu'est-ce qui me pousse à demander ?

Je n'ai aucune idée du comportement du Terminal si, par exemple, un EA refuse de revenir vers lui pendant peut-être de nombreux ticks de données et que, puisque l'EA ne revient pas, le Terminal ne fait pas l'appel à start()... ou - ne fait-il pas l'appel et finalement, en raison des nombreux ticks de données qui s'écoulent sans avoir pu appeler start() d'EA, le Terminal entre dans des profondeurs inexplorées et manifeste le problème connecté ?

;)

 

Est-ce que cela pourrait résoudre le problème... ?

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 - si ce qui précède est un aperçu de l'utilisation de start(), pourquoi y rester avec une boucle infinie ?

Je demande parce que la manière normale ? est d'entrer > est-ce que je veux travailler ? non:return > faire le travail > return

(normal - est subjectif bien sûr ;o)

je ne vous dis pas comment concevoir - c'est votre affaire, je vous demande juste votre raisonnement, alors j'apprends plus/je vois différentes façons de faire les choses !

Qu'est-ce qui me pousse à demander ?

Je n'ai aucune idée du comportement du Terminal si, par exemple, un EA refuse de revenir vers lui pendant peut-être de nombreux ticks de données et que, puisque l'EA ne revient pas, le Terminal ne fait pas l'appel à start()... ou - ne fait-il pas l'appel et finalement, en raison des nombreux ticks de données qui s'écoulent sans avoir pu appeler start() d'EA, le Terminal entre dans des profondeurs inexplorées et manifeste le problème connecté ?

;)


ukt, pas de problème je vais répondre. Je fais une boucle infinie parce que j'ai besoin de faire plusieurs opérations et je ne veux pas attendre un nouveau tick pour les faire. Je prends donc le contrôle du terminal de cette façon et je fais mon travail quand j'en ai besoin et quand je le veux. J'utilise RefreshRates() pour obtenir les données réelles.

Il est donc logique de vérifier si la connexion avec le courtier existe parce que j'envoie/ferme/modifie les ordres et si aucune connexion n'existe, alors aucun travail n'est possible. C'est aussi simple que cela. Il y a aussi d'autres vérifications pour sortir de la boucle que j'utilise. par exemple IsStoped() et ainsi de suite mais le problème n'est pas dans mon code mais dans IsConnected().