IsConnected() - page 2

 
Matutin:

Il suffit d'appeler start() à partir de init () ...et vous serez dans start() même si aucun tick ne vient !

Merci à vous 2
 
Viffer:

En développant mon lien ci-dessus... J'exécute un EA séparé pour surveiller l'état de la connexion. Il a essentiellement tout le code pour mon test codé à l'intérieur de start avec un sleep à la fin. Start est essentiellement une grande boucle, quand elle se termine, elle retourne au début. Mais plutôt que d'attendre un tick pour déclencher le démarrage, j'appelle start() dans init(). De cette façon, start() continue à boucler avec le sleep et init() ne se termine jamais, donc le code s'exécute en fonction des intervalles de temps du sleep plutôt que d'attendre un tick... le lien ci-dessus montre le principe...

hth

V


Matutin:

Appelez simplement start() à partir de init () ...et vous serez dans start() même si aucun tick n'arrive !


Aucune de ces méthodes ne résout le problème car init() ne démarre pas non plus s'il n'y a pas de connexion.

le seul moyen de faire cela est avec un script ; le problème est qu'il n'y a aucun moyen d'ouvrir le terminal avec un script chargé.

 
qjol:


Aucune de ces méthodes ne résout le problème car init() ne démarre pas non plus s'il n'y a pas de connexion.

la seule façon de le faire est avec un script ; le problème est qu'il n'y a aucun moyen d'ouvrir le terminal avec un script Chargé


Jetons un coup d'oeil aux outils de MT4i.com. Je les utilise pour surveiller la connexion et envoyer des alertes par mail ou sms.

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

 
Matutin:

Il suffit d'appeler start() à partir de init () ...et vous serez dans start() même si aucun tick ne vient !

NON ! Ceci n'est pas autorisé. init() est censé revenir après 2 secondes. Init n'est pas autorisé à bloquer ! Toutes sortes de problèmes peuvent (et vont) en découler.

Faites simplement la boucle dans start et attendez que start soit appelé automatiquement au prochain tick disponible après le chargement de l'EA. Il y avait des ticks avant que la connexion ne soit coupée, donc votre boucle sera déjà en cours d'exécution lorsque cet événement se produira.


Si vous avez vraiment besoin de déclencher un start() à partir de init() parce que vous avez besoin qu'il fonctionne le week-end, alors la seule façon correcte est d'utiliser l'astuce PostMessage() pour imposer un tick. Vous postez le message et ensuite vous laissez init revenir! MT4 appellera alors start() de façon normale et init() ne bloquera pas.


Voir le prochain message pour un exemple.

 
// 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);
}
C'est la seule façon correcte de forcer un start() à partir de init() dans un EA. Vous n'êtes pas autorisé à le faire dans un indicateur puisque le start() sera exécuté dans le thread de l'interface graphique.
 
/**
* 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);
   }
}
Pour être complet, le script ci-dessus est un script que j'utilise pour simuler de faux ticks le week-end. Vous n'en avez pas besoin, c'est seulement un exemple. C'est surtout utile pour déboguer d'autres EAs et indicateurs.
 
/**
* 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);
   }
}

Et ceci est le même que le script ci-dessus mais implémenté comme un EA, démontrant les deux concepts dans un EA.

Dans init(), il mettra en file d'attente le tout premier tick pour déclencher le premier start(), puis dans start(), il produira d'autres ticks dans une boucle infinie, qui seront ensuite repris par tous les indicateurs sur le même graphique.

 
7bit:
C'est la seule façon correcte de forcer un start() à partir de init() dans un EA. Vous n'êtes pas autorisé à le faire dans un indicateur puisque le start() sera exécuté dans le thread de l'interface graphique.

// 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);
}

Essayez de placer cet EA sur un graphique, fermez le terminal, puis désactivez votre connexion Internet et rallumez votre terminal (pendant que la connexion à Internet est désactivée) et vous verrez que cela ne fonctionne pas.

 
qjol:


essayez de mettre cette ea sur un graphique fermez le terminal puis désactivez votre connexion internet & allumez votre terminal (pendant que la connexion internet est désactivée) & vous verrez que cela ne fonctionne pas.

Mais il devrait continuer à fonctionner une fois qu'il a été lancé dans des conditions normales (ce qui devrait être le cas d'utilisation normal). Essayez de vous déconnecter après son démarrage.


Et il sert d'exemple pour éviter un init() bloquant et l'exécuter comme une EA au lieu d'un script.

 
7bit:

Mais il devrait continuer à fonctionner une fois qu'il a été lancé dans des conditions normales (ce qui devrait être le cas d'utilisation normal). Essayez de vous déconnecter après qu'il ait été lancé.


Et cela sert d'exemple pour éviter un init() bloquant et l'exécuter comme une EA au lieu d'un script.


Vous avez raison, mais je ne cherche pas une solution à la situation que vous décrivez, je cherche une solution à la situation que je décris, et pour l'instant la seule solution que j'ai trouvé, qui, logiciel externe, va exécuter un script