IsConnected() - page 4

 
7bit:

Il peut être vérifié, il suffit d'exécuter la vérification dans une boucle infinie. La façon de démarrer cette boucle lors du démarrage du terminal pendant une interruption de connexion est un problème complètement distinct. Une fois que vous avez fait tourner votre boucle, elle fera ce qui est attendu.

Votre problème n'a rien à voir avec la fonction IsConnected(). Avec le même argument, vous pourriez également vous plaindre de Print() ou Alert() ou de toute autre fonction que vous ne pouvez pas appeler parce que vous n'avez pas pu lancer le code entier en premier lieu pour une raison complètement différente.


ok, laissez-moi vous expliquer quelque chose Parce que j'utilise beaucoup de terminaux tout au long de mon utilisation du processeur est en hausse jusqu'à 100 pour cent c'est pourquoi j'ai besoin de désactiver quelques terminaux.

Et lorsque je les active (bien sûr automatiquement), j'ai vu à plusieurs reprises qu'ils n'étaient pas connectés et que l'EA qui s'exécutait sur eux ne signalait pas l'absence de connexion,

C'est pourquoi j'ai commencé ce sujet et jusqu'à présent, la seule façon que j'ai trouvée est comme je l'ai dit ci-dessus avec un programme externe.

 

Peut-être est-ce lié à la "fonctionnalité" introduite pour la première fois avec Windows XP SP2, qui refuse d'avoir plus d'une poignée de connexions semi-ouvertes à tout moment, principalement pour ennuyer les personnes qui veulent utiliser des applications nécessitant une mise en réseau intensive. À ma connaissance, il existe des méthodes pour éliminer cette "fonctionnalité" gênante et rétablir un fonctionnement normal : http://blog.davidkaspar.com/archives/2005/04/windows-xp-sp2-and-event-id-4226.php.

Recherchez l'événement 4226 dans le journal des événements de Windows.

 
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 car le start() sera exécuté dans le thread de l'interface graphique.

C'est bien mais cela ne fonctionne pas toujours car le tick peut être parti avant même que initi() ne soit retourné, dans ce cas le tick est écarté. Pour mettre cela en évidence, si vous ajoutez une pause de 5 ms après le retour de initi(), le tick est ignoré.

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

alors start() ne sera pas exécuté.

Existe-t-il une meilleure solution pour que start() s'exécute au chargement du conseiller expert sans exiger un tick réel du courtier ?

 

Je suis un peu vieux mais jecherche une solution au même problème que j'ai rencontré sur ce sujet.

En fait, l'affirmation de qjol que "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é" est partiellement vrai. Avec un script ok, mais il y a un moyen de démarrer un script avec un terminal client. Ceci est documenté dans l'aide de metatrader (F1, Tools, Configuration at Startup). Peut-être que ce n'est pas le cas au moment où ce sujet a été lancé.

J'ai donc développé un petit script pour faire le travail. Utilisez-le avec un script de démarrage, par exemple :

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

Et lancer le terminal avec quelque chose comme :

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

Dossiers :
 

Salut les gars,

Savez-vous l'un d'entre vous, pourquoi ne pas travailler script faux ticks - https://www.mql5.com/en/forum/128803/page2#373539(page 2) ce fil de discussion pour construire 600 + + ?

Mon OS est Vista. Merci.

 
endy5:

Salut les gars,

Savez-vous l'un d'entre vous, pourquoi ne pas travailler script faux ticks - https://www.mql5.com/en/forum/128803/page2#373539(page 2) ce fil de discussion pour construire 600 + + ?

Mon OS est Vista. Merci.

Depuis build > 600 vous devez remplacer "A" pour ansi avec "W" pour unicode

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

pourquoi utilise-t-on 2 et 1 dans le paramètre

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

Pourquoi utilise-t-on 2 et 1 en paramètre ?

C'est hors de la portée de MQL, vérifiez la fonction ici:

 

Au cas où quelqu'un d'autre chercherait des informations concernant la fonction IsConnected().

Donc oui, la fonction ne fonctionnera pas sous la fonction start() ou la fonction OnTick(), car s'il n'y a pas de connexion, alors aucun nouveau tick n'arrivera, et la fonction ne se déclenchera pas de toute façon.....

Alors que devons-nous faire ?

Utiliser la fonction OnTimer(), pour vérifier régulièrement la connexion, indépendamment des ticks entrants.

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:

Donc oui, la fonction ne fonctionnera pas sous la fonction start() ou la fonction OnTick(), car s'il n'y a pas de connexion, alors aucun nouveau tick n'arrivera, et la fonction ne se déclenchera pas de toute façon.....

Alors que devons-nous faire ?

Utilisez la fonction OnTimer(), pour vérifier régulièrement la connexion, indépendamment des ticks entrants.

Vous ne devez rien faire, car il n'y a rien à faire. Il faut plus de 30 secondes avant que le réseau ne s'arrête et que la fonction ne change de valeur. Que ferez-vous si rien n'a changé et que vous n'avez pas de connexion ?

Elle n'est utile que si vous ne revenez jamais de start/OnTick (vérifiez-la avant un OrderSend.) Ou après un OrderSend pour les tentatives dans le même tick.

Au lieu de cela, si OrderSend échoue, enregistrez-le, revenez et testez/essayez au prochain tick. C'est fait.

Raison: