Caractéristiques du langage mql5, subtilités et techniques - page 168

 
Slava:

Lorsque vous recevez un message concernant une fuite de mémoire, cela signifie qu'il n'y a pas eu de commande explicite pour libérer cette mémoire.

Lorsque le programme se termine (ce qui correspond au moment où vous recevez ces messages), il libère de toute façon toute la mémoire, y compris la mémoire fuie.

J'ai peut-être utilisé le terme "fuite" trop librement. Le problème est qu'une ressource est laissée en suspens dans la mémoire, dont le nom n'est même pas reconnaissable si l'objet est supprimé. Et si vous connaissez son nom, vous ne pouvez pas le supprimer ailleurs que dans le programme qui a créé la ressource.


Il est maintenant très facile d'écrire un script pour Market qui va suspendre (pas nécessairement de façon préméditée) le terminal sur le VPS, remplissant toute la mémoire avec des ressources qui ne sont pas supprimées après l'exécution du script.

 

Certains serveurs de négociation peuvent contenir plus d'un type de compte à la fois. Par exemple, ECN et standard. Dans ce cas, les symboles peuvent ne pas avoir de préfixe, c'est-à-dire que les noms sont les mêmes.

Dans ce cas, l'historique des barres (y compris la valeur actuelle du bid/ask/last sur le graphique) et l'historique des ticks correspondent toujours à un seul type de compte.

Et les données de Market Watch correspondent à celui qui est connecté.


Pour cette raison, il est facile d'observer que le Market Watch est complètement incohérent avec les graphiques et l'historique des tics.

 

Plusieurs fois, j'ai été confronté à un changement accidentel (manuel) du symbole de la carte où se trouve un conseiller de combat.

Protection contre le changement de symbole.

int OnInit()
{
  static const string Symb = _Symbol;  
  const bool Res = (_Symbol != Symb);
  
  if (Res)
    Alert("Symbol is change!");
  
  return(Res); // Защита от смены символа.
}
 
Lorsque vous lancez un EA, vous devez souvent décider du moment à partir duquel l'historique des prix doit être obtenu. Pour éviter de devoir l'entrer manuellement à chaque fois, j'ai procédé de cette façon.
#define  WEEK (7 * 24 * 3600)
input datetime temp = __DATE__ - WEEK;

En conséquence, je prends l'histoire une semaine avant la compilation. C'est pratique.

 
fxsaber:
Lorsque vous lancez un EA, vous devez souvent décider du moment à partir duquel l'historique des prix doit être obtenu. Pour éviter de devoir l'entrer manuellement à chaque fois, j'ai procédé de cette façon.

En conséquence, je prends l'histoire une semaine avant la compilation. Pratique.

Pourquoi faut-il trop se fier à l'optimiseur ? C'est mieux :

#define WEEK 604800

 

Fonction d'interruption d'urgence, semble fonctionner correctement

#define  EXIT (STD_CExit(__LINE__,__FUNCTION__)).Exit

class STD_CExit{
   string function;
   int line;
public:
   STD_CExit(int _line,string _func):line(_line),function(_func){}
   void Exit(string reason=NULL);
};
//--------------------------------------------------------------------------
void STD_CExit::Exit(string reason=NULL){
   Alert(StringFormat("Abort in line %i, function %s.\nReason: %s.",line,function,reason==NULL||reason==""?"Unknow":reason));
   int a=0;
   int b=1/a;}

void OnStart()
{
   Test();
}

void Test(){
   EXIT("Some reason");
}
 
Vladimir Simakov:

Fonction d'interruption d'urgence, semble fonctionner correctement.

c'est la bonne chose à faire - j'étais heureux de voir cela se produire... nous avons résolu ce problème avec@Victhttps://www.mql5.com/ru/forum/318246/page10#comment_12651569

mais ça :

- pasExit http://www.delphibasics.ru/Exit.php

- pasAbandonner http://www.delphibasics.ru/Abort.php

c'estHalt http://www.delphibasics.ru/Halt.php

UPD : un tel script est vraiment nécessaire

void OnTick()
{
   if(!getData()) EXIT("No data");
}
bool getData()
{
   return(false);
}
 
Igor Makanu:

la chose est nécessaire - j'ai été heureux de voir cela se produire..., voici le problème que nous avons résolu avec@Victhttps://www.mql5.com/ru/forum/318246/page10#comment_12651569

mais ça :

- pasExit http://www.delphibasics.ru/Exit.php

- pasAbandonner http://www.delphibasics.ru/Abort.php

c'estHalt http://www.delphibasics.ru/Halt.php

UPD : un tel script est vraiment nécessaire

Il n'y a aucune chance que ça marche encore((((
 
Vladimir Simakov:
Celui-ci n'a pas encore fonctionné(((.

Je ne vois pas pourquoi j'en ai besoin !

Si les développeurs avaient donné exit / abort en standard, alors il serait possible de terminer correctement le traitement des données, si, par exemple, TF n'est pas prêt - données OHLC, il serait également utile pour le traitement de l'envoi des ordres au serveur .... il serait pratique d'interrompre le code à n'importe quel endroit et de sortir avant le prochain tick sans avoir besoin de return() pour sortir de OnTick().

 
Igor Makanu:

Je ne peux pas être sûr d'en avoir besoin !

Si les développeurs avaient donné exit / abort en standard, alors il serait possible de terminer correctement le traitement des données, si, par exemple, TF n'est pas prêt - données OHLC, il serait également utile pour le traitement de l'envoi des ordres au serveur .... il serait pratique d'interrompre le code à n'importe quel endroit et de sortir avant le prochain tick sans avoir besoin de return() pour sortir de OnTick().

Eh bien, je ne pouvais pas, pas encore...