Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 185

 

Bon après-midi.

J'ai besoin que l'EA s'arrête après un certain événement.

Je comprends que c'est la fonction deinit(), je dois l'appeler d'une manière ou d'une autre. C'est une citation du tutoriel :

"Lafonction spéciale deinit() est également appelée pour être exécutée par le terminal client lorsque celui-ci est arrêté, lorsque la fenêtre d'instruments financiers est fermée, juste avant de changer d'instrument financier et/ou de période graphique, lorsque le programme est recompilé avec succès dans le MetaEditor, lorsque les paramètres d'entrée sont modifiés et lorsque le compte est modifié. "

Je dois donc fermer le terminal manuellement, par exemple, pour que cette fonction soit appelée ?

J'ai essayé d'appeler cette fonction lorsqu'une condition se déclenche, elle a été exécutée, mais un nouveau tick est arrivé et la fonction de démarrage a été relancée.

int deinit()
  {
  Alert("Закрываем программу"); 
   return(0);
  }

int start()
{
//код
..............
if (OrdersTotal()==0) deinit();
return(0);
}



Comment puis-je encore mettre fin au programme ?

Merci.

 
GygaByte:

Bon après-midi.

J'ai besoin que l'EA s'arrête après un certain événement.

Je comprends que c'est la fonction deinit(), je dois l'appeler d'une manière ou d'une autre. C'est une citation du tutoriel :

"Lafonction spéciale deinit() est également appelée pour être exécutée par le terminal client lorsque celui-ci est arrêté, lorsque la fenêtre des instruments financiers est fermée, juste avant de changer d'instrument financier et/ou de période graphique, lorsque le programme est recompilé avec succès dans le MetaEditor, lorsque les paramètres d'entrée sont modifiés et lorsque le compte est modifié. "

Je dois donc fermer le terminal manuellement, par exemple, pour que cette fonction soit appelée ?

J'ai essayé d'appeler cette fonction lorsqu'une condition se déclenche, elle a été exécutée, mais un nouveau tick est arrivé et la fonction de démarrage a été relancée.

Comment puis-je encore mettre fin au programme ?

Merci.

Pour fermer le terminal de manière programmatique, insérez au tout début du code avant la fonction start() :

//----
#import "user32.dll"
int GetParent(int hWnd);  // вызов API
#import
//----

Dans la fonction start(), lorsque vous devez fermer le terminal, appelez ExitMT4(), que vous déclarez en dehors de la fonction start()

//+----------------------------------------------------------------------------+
void ExitMT4() {  // выгрузить MT4 из памяти

   int hwnd=WindowHandle(Symbol(),Period());
   int hwnd_parent=0;
//----
   while(!IsStopped()) {
      hwnd=GetParent(hwnd);
      if(hwnd==0) break;
      hwnd_parent=hwnd;
      }
   if(hwnd_parent!=0) PostMessageA(hwnd_parent,WM_CLOSE,0,0);
}
//+----------------------------------------------------------------------------+
 
artmedia70:

Pour fermer le terminal de manière programmatique, insérez au tout début du code avant la fonction start() :

Dans la fonction start(), lorsque vous devez fermer le terminal, appelez ExitMT4(), que vous déclarez en dehors de la fonction start()



Merci beaucoup pour votre réponse complète.

En fait, il me suffirait de terminer l'EA, je n'ai pas besoin de fermer le terminal. N'y a-t-il pas un moyen facile de le faire ?

Je pense que deinit() devrait résoudre ce problème, mais je dois faire quelque chose de mal...

 

Je n'arrive pas à supprimer Terminal.exe de Alpari Limited, build 509.

Lorsque vous utilisez le panneau de configuration pour désinstaller, un message "Vous n'avez pas les droits suffisants pour désinstaller. Contactez votre administrateur système !".

Lorsque vous utilisez Uninstall.exe, le message "Server has returned the link" s'affiche.

Le support technique d'Alpari n'a rien pu dire de compréhensible, il m'a juste suggéré de supprimer tout le dossier et d'installer le terminal dans un autre répertoire.

J'ai Win 7, Ultimate. Les droits d'administrateur étant activés, j'ai exécuté Uninstall.exe en tant qu'administrateur.

Je vous serais très reconnaissant de toute aide pour résoudre ce problème.

 
GygaByte:


Merci beaucoup pour cette réponse détaillée.

En principe, il me suffirait de terminer l'EA, il n'est pas nécessaire de fermer le terminal. N'y a-t-il pas un moyen facile ?

Je pense que deinit() devrait résoudre ce problème, mais je dois faire quelque chose de mal...

Pas deinit(), mais return(0) ;
 
artmedia70:
Pas deinit() mais return(0) ;


Si je ne me trompe pas, return(0) mettra simplement fin à la fonction actuelle start() et attendra le prochain tick, alors que j'ai besoin que l'EA termine son travail, comme si je l'avais détaché manuellement du graphique.

Je l'ai vérifié dans la pratique et il continue à afficher l'alerte "0 ordres ouverts" à chaque tick.

Je n'ai pas attendu le cher "Au revoir".

int start()
  {
  if (OrdersTotal()==0) 
   {
   Alert("Открытых ордеров - ", OrdersTotal());
   return(0);
   }  
  }
//+------------------------------------------------------------------+
int deinit()
  {
 Alert("Пока");  
   return(0);
  }
 
polycomp:

Impossible de supprimer Terminal.exe de Alpari Limited, build 509.

Lorsque vous utilisez le panneau de configuration pour désinstaller, un message "Vous n'avez pas les droits suffisants pour désinstaller. Contactez votre administrateur système !".

Lorsque vous utilisez Uninstall.exe, le message "Server has returned the link" s'affiche.

Le support technique d'Alpari n'a rien pu dire de compréhensible, il m'a juste suggéré de supprimer tout le dossier et d'installer le terminal dans un autre répertoire.

J'ai Win 7, Ultimate. Droits d'administrateur activés, uninstall.exe exécuté en tant qu'administrateur.

Je vous serais très reconnaissant de tout conseil pour résoudre ce problème.

Certains programmes malveillants (mail.ru, je l'ai eu) redistribuent les droits d'accès, de sorte que vous avec des privilèges d'administrateur n'avez pas accès à leur suppression.

Le problème a été résolu par la méthode du poke scientifique dans la redistribution des permissions (cliquer sur le dossier, propriétés, sécurité, modifier, ajouter, optionnel, types d'objets, recherche.......).

Mais ensuite j'ai fait connaissance avec "Revo uninstaller" et tous les tracas de la suppression de quelque chose ont disparu + la certitude que le registre a été nettoyé de leurs activités.

 
GygaByte:


Si je ne me trompe pas, return(0) terminera simplement la fonction actuelle start() et attendra le prochain tick. J'ai besoin que l'EA termine son travail comme si je l'avais détaché manuellement du graphique.

J'ai vérifié en pratique - à chaque tick, l'alerte "Ordres ouverts - 0" s'affiche sans cesse.

Je n'ai pas attendu le cher "Au revoir".

Votre souhait fait penser à la blague des "dames". Si vous voulez que l'EA s'arrête de trader, alors en activant le drapeau (global) (après certaines conditions), l'interruption de la fonction start() (sortie par retour) donnera le résultat attendu.
 
ALXIMIKS:

Certains programmes malveillants (mail.ru que j'ai eu) redistribuent les droits d'accès et font en sorte que vous avec des droits d'administrateur n'ayez pas accès à leur suppression.

Le problème a été résolu par la méthode scientifique de redistribution des permissions ( PCM sur le dossier, propriétés, sécurité, modification, ajout, optionnel, types d'objets, recherche.......).

Mais ensuite, j'ai fait connaissance avec "Revo uninstaller" et tous les tracas de la suppression de quelque chose ont disparu, + la certitude que le registre a été nettoyé DE leurs activités.

Merci beaucoup ! Je vais me familiariser avec Revo uninstaller.
 
TarasBY:
Votre souhait rappelle la blague du "dessinateur". Si vous souhaitez que le conseiller arrête de négocier, l'activation de l'indicateur (global) (après certaines conditions), l'interruption de la fonction start() (sortie par retour) donnera le résultat escompté.

C'est à peu près ce à quoi ça ressemble :

bool GlobalFlag;
int init()
{
   GlobalFlag = true;
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   if ( GlobalFlag )
      if (OrdersTotal() == 0) 
      {
         GlobalFlag = false;
         Alert("Открытых ордеров - ", OrdersTotal());
         Alert("Пока");  
      }  
   return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+------------------------------------------------------------------+