Caractéristiques du langage mql4, subtilités et techniques - page 27

 
Andrey Khatimlianskii:

L'indicateur est appelé avec un mauvais jeu de paramètres

Oui, l'indicateur a beaucoup de paramètres, y a-t-il un moyen de s'assurer que iCustom remplit la mémoire ? Il faut environ 2 heures pour remplir la mémoire, donc tester un iCustom vide et ajouter un paramètre à la fois prendra beaucoup de temps. Des conseils ?
P.S. Je vais également passer en revue tous les paramètres visuellement.

 
Nauris Zukas:

Oui, l'indicateur a beaucoup de paramètres, mais y a-t-il un moyen de s'assurer que iCustom remplit exactement la mémoire ?

Il y aura beaucoup de création d'indicateurs dans les journaux.
 
TheXpert:
Il y aura beaucoup d'indicateurs dans les journaux.

Oui, je sais ce que vous voulez dire, j'ai vu cela dans le testeur de stratégie aussi, quand beaucoup d'indicateurs apparaissent après un test. Mais tout fonctionne bien dans le testeur de stratégie ici. Et tout s'affiche correctement dans les journaux.

 
Nauris Zukas:

Oui, l'indicateur a pas mal de paramètres, y a-t-il un moyen de s'assurer que iCustom remplit la mémoire ? Il faut environ 2 heures pour remplir la mémoire, donc tester un iCustom vide et ajouter un paramètre à la fois prendra beaucoup de temps. Des conseils ?
P.S. Je vais également passer en revue tous les paramètres visuellement.

Laissez l'appel sans paramètres (ils prendront alors les valeurs par défaut), et observez. Si la fuite disparaît, c'est qu'il y a un problème.

 
Nauris Zukas:

L'EA consomme de la mémoire qui s'accumule petit à petit.

C'est combien "un peu" ?

Peut-être que c'est vraiment un peu et que c'est l'histoire des citations qui sont apparues depuis le lancement ?

 
Andrey Khatimlianskii:

"Petit à petit" - combien ?

Peut-être que c'est vraiment juste un peu, et que c'est l'histoire de la citation qui est apparue depuis le début ?

Je démarre MT4 avec plusieurs EAs, j'active l'enregistrement de la mémoire. Là où la flèche indique qu'il y a un crash, "pas assez de mémoire pour le fichier EX4".


 
Andrey Khatimlianskii:

Laissez l'appel sans paramètres (ils prendront alors les valeurs par défaut), et observez. Si la fuite disparaît, c'est qu'il y a un problème.

Ok, je vais le faire comme ça.

 
Nauris Zukas:

Je démarre MT4 avec plusieurs EAs, j'active l'enregistrement de la mémoire. Là où la flèche indique qu'il y a un crash, "pas assez de mémoire pour le fichier EX4".

Combien de 40% de la quantité utilisée ?

Croissance linéaire, ressemble à un appel indicateur courbe, oui.

 
Andrey Khatimlianskii:

40 % de la quantité utilisée ?

Croissance linéaire, ressemble à un appel indicateur courbe, oui.

Il semble y avoir un problème avec les paramètres. Merci !

 

Sur MT4, cette situation est possible (nous ne parlerons pas des raisons) :

  • Un poste est ouvert. Le solde est égal à N.
  • A partir d'un certain moment, les positions disparaissent. L'équité et l'équilibre sont égaux à N. Dans l'historique des transactions, il n'y a aucune information sur la position.
  • La réinitialisation du terminal n'aide pas.
  • Plusieurs heures plus tard, les positions apparaissent dans l'historique des transactions (elles ont été clôturées sous une certaine condition). Le solde et les capitaux propres sont ajustés en conséquence.

Il s'agit d'une situation très rare causée par une confluence de nombreuses circonstances. Mais cela peut se produire, même si la probabilité est à peu près nulle.

Je suggère que tous les robots de combat doivent avoir un mécanisme pour identifier de telles situations.

Pour cela, il est nécessaire de mémoriser les tickets des ordres ouverts et de vérifier leur présence dans l'historique des transactions en cas de disparition. S'ils ne figurent pas dans l'historique des transactions, Alertim !


La fonction de cette protection.

#define  TICKET_TYPE int

// Получаем все текущие тикеты.
int GetTickets( TICKET_TYPE &Tickets[] )
{
  int Amount = ArraySize(Tickets);
    
  for (int i = ArrayResize(Tickets, Amount + OrdersTotal()) - Amount - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      Tickets[Amount++] = OrderTicket();
          
  return(ArrayResize(Tickets, Amount));
}

// Проверяет наличие потерянных тикетов.
int CheckTickets( void )
{
  static const bool IsTester = MQLInfoInteger(MQL_TESTER);
  int Amount = 0;
  
  if (!IsTester)
  {
    static TICKET_TYPE Tickets[];
    TICKET_TYPE BadTickets[];
    
    for (int i = ArrayResize(BadTickets, ArraySize(Tickets)) - 1; i >= 0; i--)
      if (!OrderSelect(Tickets[i], SELECT_BY_TICKET))
      {
        BadTickets[Amount++] = Tickets[i];
        
        Alert("Ticket " + (string)Tickets[i] + " is not found!");
      }
        
    ArrayResize(BadTickets, Amount);    
  
  #ifdef __MQL5__
    ArraySwap(Tickets, BadTickets);
  #else // __MQL5__
    ArrayFree(Tickets);
    
    ArrayCopy(Tickets, BadTickets);  
  #endif // __MQL5__
      
    GetTickets(Tickets);
  }
      
  return(Amount);
}
Appelez CheckTickets() au début de OnTick.