IsConnected() - Seite 4

 
7bit:

Wie man diese Schleife beim Starten des Terminals während eines Verbindungsabbruchs startet, ist ein ganz anderes Problem. Sobald Sie Ihre Schleife zum Laufen gebracht haben, wird sie das tun, was erwartet wird.

Ihr Problem hat nichts mit der Funktion IsConnected() zu tun. Mit dem gleichen Argument könnten Sie sich auch über Print() oder Alert() oder jede andere Funktion beschweren, die Sie nicht aufrufen können , weil Sie den gesamten Code aus einem ganz anderen Grund gar nicht erst starten konnten.


ok, lassen Sie mich etwas erklären, weil ich eine Menge Terminlas Alle entlang meiner CPU-Nutzung steigt bis zu 100 Prozent, das ist, warum ich ein paar Terminals abschalten müssen

Und wenn ich sie einschalten (natürlich automatisch) Ich sah ein paar Mal, dass sie nicht verbunden sind & die EA wurde auf sie ausgeführt nicht berichten, dass es keine Verbindung,

das ist y ich dieses Thema gestartet & so weit der einzige Weg, dass ich gefunden ist, wie ich oben mit einem externen Programm sagte

 

Vielleicht hängt es mit der "Funktion" zusammen, die erstmals mit Windows XP SP2 eingeführt wurde, dass es sich weigert, mehr als eine Handvoll halboffener Verbindungen gleichzeitig zu haben, hauptsächlich um Leute zu ärgern, die netzwerkintensive Anwendungen nutzen wollen. AFAIK gibt es Methoden, um dieses lästige "Feature" wegzupatchen und die normale Funktionsfähigkeit wiederherzustellen: http://blog.davidkaspar.com/archives/2005/04/windows-xp-sp2-and-event-id-4226.php

Suchen Sie im Windows-Ereignisprotokoll nach dem Ereignis 4226.

 
7bit:
Dies ist der einzig korrekte Weg, um einen start() aus init() in einem EA zu erzwingen. In einem Indikator dürfen Sie dies nicht tun, da start() dort im GUI-Thread ausgeführt wird.

Das ist zwar schön, funktioniert aber nicht immer, da der Tick schon weg sein kann, bevor initi() zurückgekehrt ist, und in diesem Fall wird der Tick verworfen. Um dies zu verdeutlichen, fügen Sie eine 5ms-Pause nach

PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return

dann wird start() nicht ausgeführt.

Gibt es eine bessere Lösung, damit start() beim Laden des Expert Advisors ausgeführt wird, ohne dass ein echter Tick vom Broker benötigt wird?

 

Ich wenig alt, aberauf der Suche nach einer Lösung für das gleiche Problem, das ich auf dieses Thema bekam .

In der Tat, Behauptung von qjol, dass "der einzige Weg, dies zu tun ist mit einem Skript; das Problem ist, dass es keine Möglichkeit, das Terminal mit einem Skript geladen öffnen" ist teilweise wahr. Mit einem Skript ok, aber es gibt eine Möglichkeit, ein Skript mit dem Client-Terminal zu starten. Dies ist in der Metatrader-Hilfe dokumentiert (F1, Tools, Configuration at Startup). Möglicherweise ist es nicht dasselbe zum Zeitpunkt der dieses Thema gestartet wurde.

Also habe ich ein kleines Skript entwickelt, das diese Aufgabe übernimmt. Verwenden Sie dieses mit einem Startskript, Beispiel :

  ; open chart and run expert and/or script
  Symbol=EURUSD
  Period=H4
  Template=popular.tpl
  Expert=
  ExpertParameters=
  Script=CheckConnection
  ScriptParameters=

Und lauch terminal mit etwas wie :

"...\Metatrader 4\terminal.exe" config\start.ini

Dateien:
 

Hallo Leute,

Kennen Sie jemand von Ihnen, warum nicht funktionieren Skript gefälschte Zecken - https://www.mql5.com/en/forum/128803/page2#373539(Seite 2) diesen Thread für Build 600++?

Mein OS ist Vista. Ich danke Ihnen.

 
endy5:

Hallo Leute,

Kennen Sie jemand von Ihnen, warum nicht funktionieren Skript gefälschte Zecken - https://www.mql5.com/en/forum/128803/page2#373539(Seite 2) diesen Thread für Build 600++?

Mein OS ist Vista. Ich danke euch.

Seit Build > 600 müssen Sie "A" für ansi mit "W" für Unicode ersetzen

int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
int RegisterWindowMessageA(string lpString);
 

Warum werden 2 und 1 als Parameter verwendet?

PostMessageA(hwnd, msg, 2, 1)
 
iamsuman2:

Warum wird 2 und 1 als Parameter verwendet?

Es ist außerhalb des Anwendungsbereichs von MQL, überprüfen Sie die Funktion hier:

 

Für den Fall, dass noch jemand nach Informationen zur IsConnected() Funktion sucht.

Also ja, die Funktion funktioniert nicht unter der start()-Funktion oder der OnTick()-Funktion, denn wenn es keine Verbindung gibt, dann kommt kein neuer Tick an und die Funktion wird sowieso nicht ausgelöst....

Was sollten wir also tun?

Verwenden Sie die Funktion OnTimer(), um regelmäßig auf eine Verbindung zu prüfen, unabhängig von den eingehenden Ticks.

int timer = 60;   //60 seconds, for example
int OnInit()
  {
//--- create timer
   EventSetTimer(timer);  //could use EventSetMillisecondTimer(timer) for millisecond resolution
//---
   return(INIT_SUCCEEDED);
  }

// Metatrader self-triggered function, will be called regularly
void OnTimer()
  {
    if(!IsConnected())
      Alert("Problem, not connection to the server!");
  }

void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
      
 

fridayda13:

Also ja, die Funktion wird nicht unter der start()-Funktion oder der OnTick()-Funktion funktionieren, denn wenn es keine Verbindung gibt, dann wird kein neuer Tick ankommen und die Funktion wird sowieso nicht ausgelöst....

Was sollten wir also tun?

Verwenden Sie die Funktion OnTimer(), um regelmäßig zu prüfen, ob eine Verbindung besteht, unabhängig von den eingehenden Ticks.

Sie sollten nichts tun, weil Sie nichts tun können. Es dauert mehr als 30 Sekunden, bevor das Netzwerk eine Zeitüberschreitung erfährt und die Funktion ihren Wert ändert. Was werden Sie tun, wenn sich nichts geändert hat und Sie keine Verbindung haben?

Es ist nur nützlich, wenn Sie nie von start/OnTick zurückkehren (prüfen Sie es vor einem OrderSend.) Oder nach OrderSend für Wiederholungen innerhalb desselben Ticks.

Wenn OrderSend fehlschlägt, protokollieren Sie es, kehren Sie zurück und versuchen Sie es beim nächsten Tick erneut. Erledigt.