Build 216 Bug ? isConnected() gibt false zurück, aber Metatrader ist immer noch verbunden - Seite 2

 
OK, ja, ich hab's... naja... wir werden sehen, ob es zurückkommt ;)
 

Hallo Stringo,



leider bleibt dieser Fehler bestehen.

Wenn man das Testskript von unten ausführt und von einem Konto zum anderen wechselt (in meinem Testfall habe ich Konten von 2 oder 3 verschiedenen Brokern verwendet und von einem zum anderen gewechselt), kann man sehen, dass nach einigen AccountChanges (eine ziemlich zufällige Anzahl) der connectionState nicht wirklich auf 1 zurückwechselt, sondern 0 bleibt, obwohl das Terminal _verbunden_ ist.


In Ihren Augen mag dies kein kritischer Fehler sein. Aber für einige Leute, die Skripte entwickeln, die den connectionState anzeigen, sind die Ergebnisse der durchgeführten Tests ziemlich alarmierend.

Deshalb wäre ich Ihnen sehr dankbar, wenn Sie sich dieses Problem noch einmal ansehen könnten.



Hier ist das TestScript:


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




Mit freundlichen Grüßen,


Daniel.

 
Ich kann auch bestätigen, dass dieser Fehler in Build 216 existiert. Er scheint nach einer gewissen Anzahl von "Connect failed"-Login-Sequenzen aufzutreten.
 
Ja, dieses Skript ist bekannt. Aber wir sollten die Umgebung reproduzieren, um das Problem zu erkennen. Wir können es jedoch nicht reproduzieren
 

Ich muss auch den gleichen Fehler bestätigen. In meinem EA prüfe ich gleichzeitig ob eine Verbindung besteht. Wenn nicht, wird mein Skript beendet.

Hat jemand einen Workaround für dieses Problem gefunden?

 

Das Skript kann das Problem wegen der Endlosschleife und der Unabhängigkeit von eingehenden Ticks nicht feststellen.

Das Problem kann nur der Experte anzeigen. Einfacher Experte mit nur einer Codezeile - Print(IsConnected());

Tick kommt an (das bedeutet, dass das Terminal verbunden ist) - Startfunktion läuft - oops! IsConnected() gibt 0 zurück (d.h. falsch)

 

Danke

ja ich benutze

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

das Problem ist, dass Brief, wenn die Verbindung zurück IsConnected() kepps den alten Wert false und nicht auf true ändern! Aber ich sehe den Preis bewegt und Terminal ist 100% verbunden. Dies ist ein Fehler, weil Endlosschleife war gebrochen und Start ausgeführt wurde, wie nichts auf den ersten Tick passiert war, nachdem die Verbindung wiederhergestellt wurde. Aber aus irgendeinem Grund gibt Is Connected() immer noch false zurück. Wenn ich den EA aus dem Chart entferne und wieder einsetze, funktioniert alles wieder bis zum nächsten Verbindungsabbruch.



Das macht mich verrückt. Bitte tun Sie etwas dagegen!

Danke

 

Liliput - wenn die obige Skizze die Verwendung von start() ist, warum bleiben Sie dann mit einer Endlosschleife darin?

Ich frage, weil der normale Weg darin besteht, einzugeben > will ich arbeiten? nein:return > Arbeit machen > return

(normal - ist natürlich subjektiv ;o)

Ich will dir nicht sagen, wie du gestalten sollst - das ist deine Sache, ich frage nur nach deiner Argumentation, dann lerne ich mehr/sehe andere Wege, Dinge zu tun!

Was hat mich zu dieser Frage veranlasst?

Ich habe keine Ahnung, wie sich das Terminal verhält, wenn z.B. ein EA sich weigert, zu ihm zurückzukehren, und zwar für vielleicht viele Datenticks, die, da der EA nicht zurückkehrt, das Terminal einfach nicht den Aufruf von start() macht... oder - macht es den Aufruf einfach nicht und schließlich, weil viele Datenticks verstrichen sind, ohne dass EAs start() aufgerufen werden konnte, geht das Terminal in unerforschte Tiefen und manifestiert das damit verbundene Problem?

;)

 

Könnte dies das Problem lösen...?

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 - wenn die obige Skizze die Verwendung von start() ist, warum bleiben Sie dann mit einer Endlosschleife darin?

Ich frage, weil der normale Weg darin besteht, einzugeben > will ich arbeiten? nein:return > Arbeit machen > return

(normal - ist natürlich subjektiv ;o)

Ich will dir nicht sagen, wie du gestalten sollst - das ist deine Sache, ich frage nur nach deiner Argumentation, dann lerne ich mehr/sehe andere Wege, Dinge zu tun!

Was hat mich zu dieser Frage veranlasst?

Ich habe keine Ahnung, wie sich das Terminal verhält, wenn z.B. ein EA sich weigert, zu ihm zurückzukehren, und zwar für vielleicht viele Datenticks, die, da der EA nicht zurückkehrt, das Terminal den Aufruf von start() einfach nicht macht... oder - macht es den Aufruf einfach nicht und schließlich, weil viele Datenticks verstrichen sind, ohne dass EAs start() aufgerufen werden konnte, geht das Terminal in unerforschte Tiefen und manifestiert das damit verbundene Problem?

;)


ukt, kein Problem, ich werde antworten. Ich mache eine Endlosschleife, weil ich viele Operationen ausführen muss und nicht auf einen neuen Tick warten will, um sie auszuführen. Auf diese Weise übernehme ich die Kontrolle vom Terminal und führe meine Arbeit aus, wenn ich sie brauche und will. Ich verwende RefreshRates(), um aktuelle Daten zu erhalten.

So ist es logisch zu prüfen, ob die Verbindung zum Broker existieren, weil ich senden/schließen/ändern Aufträge und wenn keine Verbindung dann keine Arbeit. einfach ist das. es gibt auch andere Prüfungen, um die Schleife, die ich verwenden zu beenden. zum Beispiel IsStoped() und so weiter, aber das Problem ist nicht in meinem Code ist es in der IsConnected().