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

 
Artyom Trishkin:

Il y avait donc déjà une solution en quelque sorte dans le KB :

Mais pas pour le scénario. Et c'est assez difficile pour EA, car il propose de se planter en dehors de OnTick en cas de situation non définie. Et cette situation peut se produire quelque part dans le conseiller expert. Et non seulement il faudra sortir de là, sortir de OnTick, mais il faudra peut-être ouvrir, par exemple, deux positions à la fois (à la charrette). Mais le second ne doit être ouvert que si le premier a été ouvert avec succès. Dans ce cas, se faire éjecter de OnTick après le premier OrderSend, pour ne pas dire plus, n'est pas bon.

 
fxsaber:

Mais pas pour le scénario. Et c'est assez difficile pour l'EA, car il est suggéré de se planter hors de OnTick dans une situation non définie. Et cette situation pourrait se produire quelque part dans les entrailles de l'Expert Advisor. Et non seulement il faudra sortir de là, sortir de OnTick, mais il faudra peut-être ouvrir, par exemple, deux positions à la fois (à la charrette). Mais la seconde ne doit être ouverte que si la première a été menée à bien. Dans ce cas, se faire éjecter de OnTick après le premier OrderSend, pour ne pas dire plus, n'est pas bon.

Le script peut ralentir jusqu'au nombre explicite de positions.

Conseiller expert... Dans un EA, nous devons en tenir compte dans la logique des fonctions d'ouverture de position - elles sont appelées depuis l'EA avec retour du résultat de leur travail. Le résultat de l'ordre de marché est renvoyé à false. Et alors l'EA fonctionnera avec la logique qui lui est inhérente. Oui, je suis d'accord pour dire qu'il est plus difficile d'implémenter dans certains EAs prêts à l'emploi que de considérer immédiatement ces probabilités. Mais c'est la raison pour laquelle la branche est là - pour que d'autres puissent connaître et utiliser les connaissances.

 
Artyom Trishkin:

Le script peut être ralenti jusqu'à ce qu'un nombre explicite de positions soit reçu.

L'EA peut également être ralentie.

Le conseiller expert... Dans l'Expert Advisor, nous devrons considérer ceci dans la logique de la fonction d'ouverture de position - ils sont appelés depuis l'EA avec le retour du résultat de leur travail. Le résultat est retourné faux s'il y a un ordre de marché. Et alors l'EA fonctionnera avec la logique qui lui est inhérente. Oui, je suis d'accord pour dire qu'il est plus difficile d'implémenter dans certains EAs prêts à l'emploi que de considérer immédiatement ces probabilités. Mais c'est à cela que sert la branche - faire savoir aux autres et utiliser ces connaissances.

Vous devez juste attendre un peu jusqu'à ce que le commerce passe. Quitter le TS jusqu'au prochain tick est une décision terrible.

 
fxsaber:

Vous pouvez également ralentir le conseiller.

Il suffit d'attendre un peu que l'échange soit passé. Sortir du TS jusqu'au prochain tick est une décision qui fait froid dans le dos.

Eh bien, dans ce code, l'attente de l'heure fixée est juste faite. Mais vous ne pouvez pas attendre des heures - il attend pendant un certain temps un nombre donné de tentatives pour obtenir un environnement valide, puis se retire avec le résultat. Sinon, si vous attendez longtemps, l'environnement commercial peut changer beaucoup, et il est trop tard pour boire le borjomi :)

//+------------------------------------------------------------------+
//| Заполняет массивы тикетов позиций                                |
//+------------------------------------------------------------------+
bool FillingListTickets(const uint number_of_attempts)
  {
//--- Проверка состояния окружения
   int n=0,attempts=int(number_of_attempts<1 ? 1 : number_of_attempts);
   while(IsUncertainStateEnv(symb,InpMagic) && n<attempts && !IsStopped())
     {
      n++;
      Sleep(sleep);
     }
   if(n>=attempts && IsUncertainStateEnv(symb,InpMagic))
     {
      Print(__FUNCTION__,": Uncertain state of the environment. Please try again.");
      return false;
     }
//---
 
Artyom Trishkin:

Eh bien, ce code attend effectivement pendant un temps déterminé, mais pas pendant des heures - il attend un nombre déterminé de tentatives pour obtenir un environnement valide. Mais vous ne pouvez pas attendre pendant des heures - il attend pendant un certain temps le nombre spécifié de tentatives pour obtenir un environnement valide, puis il donne le résultat. Sinon, si vous attendez longtemps, l'environnement commercial peut changer beaucoup, et il est trop tard pour boire le borjomi :)

Oui, je n'ai pas remarqué l'attente. Cela fera l'affaire. J'étais beaucoup plus attentif à l'époque.

 

A mon avis, se concentrer surPositionsTotal() est de toute façon une mauvaise décision. Pendant le traitement de votre requête, une autre position pourrait s'ouvrir/se fermer sur le compte, par exemple, si plusieurs EAs fonctionnent. Qu'est-ce qui vous empêche de vérifier la réponse du serveur, telle qu'elle est conçue par les développeurs ?

En fait, je ne vois pas l'intérêt de PositionsTotal, sauf pour le contrôle général. Un EA devrait clairement contrôler les ticks de ses positions et ne travailler que sur eux.

 

Après avoir utilisé ChartIndicatorGet(), la fonction IndicatorRelease(handle) doit nécessairement être appelée. Il est écrit à ce sujet dans l'exemple de la fonction ChartIndicatorGet(), mais pas dans la note de la fonction ! Les développeurs voulaient corriger la documentation, mais ne l'ont pas fait. En raison de la fermeture du SD, cela ne sera probablement jamais fait.

J'ai personnellement rencontré le problème d'un indicateur "suspendu". En parlant au SD :

Ah, c'est-à-dire que lorsque je lance l'indicateur X sur le graphique, il a cherché dans tous les indicateurs et a trouvé une copie de celui-ci en utilisant lafonctionChartIndicatorGet()- il a incrémenté le compteur. J'ai supprimé le premier indicateur X - le compteur s'est décrémenté, mais j'ai oublié le second - il a un indicateur "accroché", parce que sa poignée n'a pas été nettoyée ?

Oui. C'est exactement comme ça que ça marche. Par conséquent, OnDeinit ne fonctionne pas.

 

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

Comment importer des données historiques en csv vers des symboles personnalisés en utilisant CustomRatesUpdate ?

fxsaber, 2018.08.19 12:01

// Sets the maximum size of an array.
template <typename T>
int ArrayResize( T &Array[] )
{
  int MinSize = ArraySize(Array);
  int MaxSize = INT_MAX;
  int AvgSize;
  
  while ((MinSize < MaxSize - 1) && !IsStopped())
  {
    AvgSize = (int)((MinSize + (long)MaxSize) >> 1);        
    
//    ArrayFree(Array);
    
    if (ArrayResize(Array, (int)AvgSize) == AvgSize)
      MinSize = AvgSize;
    else
      MaxSize = AvgSize;
  }
  
  return(ArrayResize(Array, MinSize));
}
 
La partie anglaise du forum a montré
// Обмен значениями между двумя числовыми переменными
#define  SWAP(A, B) { A += B; B = A - B; A -= B; }
 
fxsaber:
La partie anglaise du forum a montré

Quel est l'intérêt de sauver quelques octets de mémoire ? De plus, avec le double, vous obtenez des nombres différents (== sera faux) et les entiers peuvent déborder.