IsConnected() - Seite 2

 
Matutin:

Rufen Sie einfach start() von init () aus auf ...und Sie werden in start() sein, auch wenn kein Tick kommt!

danke 2
 
Viffer:

Erweiternd zu meinem Link oben... Ich führe einen separaten EA, um den Verbindungsstatus zu überwachen. Es hat im Grunde alle den Code für meinen Test innerhalb Start mit einem Schlaf am Ende codiert. Start ist im Grunde eine große Schleife, wenn es endet, geht es zurück zum Anfang. Aber anstatt auf einen Tick zu warten, um den Start auszulösen, rufe ich start() innerhalb von init() auf. Auf diese Weise setzt start() die Schleife mit dem sleep fort und init() endet nie, so dass der Code auf der Grundlage von Zeitintervallen von sleep läuft, anstatt auf einen Tick zu warten... der Link oben zeigt das Prinzip...

hth

V


Matutin:

Rufen Sie einfach start() von init () aus auf ...und Sie werden in start() sein, auch wenn kein Tick kommt!


beides löst das Problem nicht, da init() auch nicht startet, wenn keine Verbindung besteht

Der einzige Weg, dies zu tun, ist mit einem Skript; das Problem ist, dass es keine Möglichkeit gibt, das Terminal mit einem geladenen Skript zu öffnen

 
qjol:


beides löst das Problem nicht, da init() auch nicht startet, wenn keine Verbindung besteht

Die einzige Möglichkeit, dies zu tun, ist mit einem Skript; das Problem ist, dass es keine Möglichkeit gibt, das Terminal mit einem geladenen Skript zu öffnen


Werfen wir einen Blick auf die MT4i.com Tools. Ich benutze sie zu monitot Verbindung und senden Sie Alarm per E-Mail oder SMS.

http://www.mt4i.com/mtdashboard.aspx

 
Matutin:

Rufen Sie einfach start() aus init () auf ... und Sie werden in start() sein, auch wenn kein Tick kommt!

NEIN! Das ist nicht erlaubt. init() sollte nach 2 Sekunden zurückkehren. Init darf nicht blockieren! Daraus können (und werden) alle möglichen Probleme entstehen.

Führen Sie einfach die Schleife in start aus und erwarten Sie, dass start automatisch beim nächsten verfügbaren Tick nach dem Laden des EA aufgerufen wird. Es gab Ticks , bevor die Verbindung abbrach, so dass Ihre Schleife bereits ausgeführt wird, wenn dieses Ereignis eintritt.


Wenn Sie wirklich ein start() aus init() heraus auslösen müssen, weil es am Wochenende laufen soll, dann ist der einzig richtige Weg, den PostMessage()-Trick zu verwenden, um einen Tick zu erzwingen. Sie posten die Nachricht und lassen dann init zurückkehren! MT4 ruft dann start() auf die normale Weise auf und init() blockiert nicht.


Im nächsten Beitrag finden Sie ein Beispiel.

 
// this is an EA

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return
   return(0);
}


int start(){
   while (!IsStopped()){
      // do your stuff here
      Sleep(1000);
   }
   return(0);
}
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.
 
/**
* MT4/experts/scripts/ticks.mq4
* send a fake tick every 200 ms to the chart and
* all its indicators and EA until this script is removed.
*/

#property copyright "© Bernd Kreuss"

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int start(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   while(!IsStopped()){
      PostMessageA(hwnd, msg, 2, 1);
      Sleep(200);
   }
}
Der Vollständigkeit halber: Das obige Skript verwende ich, um am Wochenende gefälschte Ticks zu simulieren. Sie brauchen es nicht, es ist nur ein Beispiel. Dies ist vor allem nützlich für die Fehlersuche in anderen EAs und Indikatoren.
 
/**
* this is a variation of the above script meant to be run as an EA.
* Send a fake tick every 200 ms to the chart and
* all its indicators until this EA is removed.
*/

#property copyright "© Bernd Kreuss"

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue the first fake tick
}

int start(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   while(!IsStopped()){
      PostMessageA(hwnd, msg, 2, 1);  // produce more fake ticks
      Sleep(200);
   }
}

Dies ist das gleiche Skript wie oben, aber als EA implementiert, um beide Konzepte in einem EA zu demonstrieren.

In init() wird der allererste Tick in die Warteschlange gestellt, um das erste start() auszulösen, und dann werden in start() weitere Ticks in einer Endlosschleife erzeugt, die dann von allen Indikatoren auf demselben Chart aufgegriffen werden.

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

// this is an EA

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return
   return(0);
}


int start(){
   while (!IsStopped()){
      // do your stuff here
      Sleep(1000);
   }
   return(0);
}

Versuchen Sie, diesen EA auf einem Chart zu platzieren, schließen Sie das Terminal, deaktivieren Sie die Internetverbindung und schalten Sie das Terminal ein (während die Internetverbindung ausgeschaltet ist), und Sie werden sehen, dass es nicht funktioniert.

 
qjol:


Versuchen Sie, diese Ea auf ein Diagramm zu setzen, schließen Sie das Terminal, deaktivieren Sie Ihre Internetverbindung und schalten Sie Ihr Terminal ein (während die Internetverbindung ausgeschaltet ist). Sie werden sehen, dass es nicht funktioniert.

Aber es sollte weiterlaufen, sobald es unter normalen Bedingungen gestartet wurde (was der normale Anwendungsfall sein sollte). Versuchen Sie, die Verbindung zu trennen, nachdem sie gestartet wurde.


Und es dient als Beispiel dafür, wie man ein blockierendes init() vermeiden und es als EA statt als Skript ausführen kann.

 
7bit:

Aber es sollte weiterlaufen, sobald es unter normalen Bedingungen gestartet wurde (was der normale Anwendungsfall sein sollte). Versuchen Sie, die Verbindung zu trennen, nachdem sie gestartet wurde.


Und es dient als Beispiel dafür, wie man ein blockierendes init() vermeiden und es als EA statt als Skript ausführen kann.


Sie haben Recht, aber ich suche nicht nach einer Lösung für die von Ihnen beschriebene Situation, sondern nach einer Lösung für die von mir beschriebene Situation, und im Moment ist die einzige Lösung, die ich gefunden habe, die, externe Software, ein Skript ausführt