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

 
fxsaber:
Les fonctions d'objet* sont très lentes si vous faites glisser le graphique avec la souris.
Ne peuvent-ils pas simplement redessiner ?
 
Nikolai Semko:
Peut-on simplement les redessiner ?

ObjectFind, par exemple, qu'est-ce que cela a à voir avec le redécoupage ?

 
fxsaber:

ObjectFind, par exemple, qu'est-ce que cela a à voir avec le redécoupage ?

Ah, ce n'est pas ce que j'avais à l'esprit.
 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Particularités de mql5, trucs et astuces

fxsaber, 2020.03.04 08:58

J'étais seulement suspicieux avant, maintenant c'est confirmé. Il est facile d'avoir des fuites de mémoire lorsqu'on travaille avec des ressources.

Le script via SB sort un graphique d'un tableau numérique sur le graphique. Vous pouvez alors supprimer manuellement ce graphique (objet), mais la ressource affectée à ce graphique restera à jamais suspendue en mémoire en mode lecture seule. Il ne peut pas être supprimé, car seul le script propriétaire peut le faire (voir la ligne en surbrillance).


Il n'y a pas de fonctionnalité dans MQL pour libérer la mémoire ainsi occupée. Soyez particulièrement prudent avec cela sur les VPS.


Comment puis-je libérer la mémoire dans le Terminal après les scripts qui ne nettoient pas après eux-mêmes (ou après des arrêts anormaux) ?

// После окончания работы скрипта Терминал потребляет дополнительные 4 Gb. Как освободить?
void OnStart()
{
  uint Data[];
  
  ArrayResize(Data, 1 e6);
  
  for (int i = 0; i < 1000; i++)  
    ResourceCreate("::" + (string)i, Data, ArraySize(Data), 1, 0, 0, ArraySize(Data), COLOR_FORMAT_ARGB_NORMALIZE);
}

Dans le TaskManager (F2), la consommation de mémoire est très bien représentée. Maintenant, seul le redémarrage du terminal est utile.

 
fxsaber:

Comment libérer de la mémoire dans le Terminal après l'exécution de scripts qui ne nettoient pas après eux-mêmes (ou après un arrêt anormal) ?

Dans le TaskManager (F2), la consommation de mémoire est parfaitement visible. Pour le moment, seul le redémarrage du terminal est utile.

Normalement, il est nécessaire d 'appeler ResourceFree pour chaque ressource.

En cas d'accident, vous ne pouvez rien faire. La seule façon de le faire est de créer votre propre dll qui sera utilisée pour créer des ressources et les nettoyer après l'arrêt du thread.

 
Vladimir Simakov:

Normalement, vous devez appeler ResourceFree pour chaque ressource.

Il n'y a rien que vous puissiez faire en cas d'arrêt d'urgence. Seulement si vous faites votre propre dll, à travers lequel créer des ressources, qui, lorsque le fil est éteint, les effacera lui-même.

L'arrêt d'urgence comprend également l'interruption du débogage.

 
fxsaber:

Le crash comprend une interruption de débogage.

Par mql standard signifie - fuite de mémoire. Seule votre propre mise en œuvre de tout ceci doit être écrite de manière mature. Étant donné que DllMain avec DLL_THREAD_DETACH n'est pas susceptible d'être appelé lorsqu'un tel thread se termine, ce n'est pas la tâche la plus triviale, mais c'est gérable.

UPD : Ce fil de discussion devrait aller dans le fil de discussion des bugs. IMHO
 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Nouvelle version de MetaTrader 5 build 2650 : Chargement des graphiques en arrière-plan et améliorations dans le profileur de code MQL5

fxsaber, 2020.10.23 18:44

Maintenant, dans la barre de graphique, vous ne pouvez pas voir sur quel graphique le conseiller expert fonctionne et sur lequel il ne fonctionne pas.

Est-il possible d'ajouter un signe distinctif ? Par exemple, si le graphique EURUSD fonctionne avec un EA, ajoutez un astérisque à la fin : EURUSD*. En général, quelque chose qui pourrait être visuellement accrocheur.

Beaucoup de graphiques, certains font tourner des EAs sur certains. Probablement utile pour les indicateurs aussi, mais je ne l'utilise pas. C'est pour ça que je ne sais pas.


Pour une raison quelconque, il n'y a pas de touche de raccourci pour la liste des EA en cours d'exécution. Vous ne pouvez l'ouvrir qu'avec la souris.

F2 maintenant. Appuyez sur ENTER sur un EA - nous passerons à son graphique et un arbre avec son chemin d'accès s'ouvrira dans le Navigateur. Deuxième fois ENTRÉE - source en ME.

 
Auparavant, une erreur interne dans l'EA n'entraînait pas sa fermeture.
2021.03.18 11:41:47.413 zero divide in 'Test9.mq5' (550,5)
2021.03.18 11:42:26.619 array out of range in 'Test9.mq5' (550,8)

Plus récemment, c'est elle qui cause le problème.


Auparavant, un client Market pouvait contourner le problème en redémarrant le terminal. Maintenant, ce n'est plus le cas.

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Nouvelle version de MetaTrader 4 build 1330

fxsaber, 2021.04.03 00:21

// Конструкция обнаружения бесконечных циклов.
class LOOP
{
private:
  static int PrevLine;    
  static uint PrevTime;
  
public:
#define  LOOP_CHECKTIME 100000 // Максимальная длительность (в миллисекундах) выполнения цикла

  static bool CheckFirst( const int Line )
  {
    if (Line != PrevLine)
    {
      LOOP::PrevTime = ::GetTickCount();
      LOOP::PrevLine = Line;
    }
      
    return(!::IsStopped() && ::GetTickCount() - LOOP::PrevTime < LOOP_CHECKTIME);
  }
  
  static bool Description( const string Str )
  {
    if (!::IsStopped() && (::GetTickCount() - LOOP::PrevTime > LOOP_CHECKTIME))
    {
      ::MessageBox("Endless loop:\n" + Str);
  
      LOOP::PrevTime = ::GetTickCount();
    }
    
    return(!::IsStopped());
  }
#undef  LOOP_CHECKTIME
};

static int LOOP::PrevLine = 0;
static uint LOOP::PrevTime = 0;


#define _CS(A) ((LOOP::CheckFirst(__LINE__) || LOOP::Description(__FILE__ + "\n" + (string)__LINE__ + "\n" + __FUNCSIG__ + "\nCondition: " + #A)) && (A))


Exemple d'utilisation.

void OnInit()
{
  for (uint i = 5; _CS(i >= 0); i--)
    ;
}
Raison: