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

 
Alexey Kozitsyn:
Je ne sais pas de quelle interface graphique vous parlez, mais dans l'onglet des paramètres de la fenêtre du testeur , vous pouvez définir les champs de départ et d'arrêt. Et le testeur détermine correctement le nombre de valeurs de paramètres.

Étape sur le terrain.

 
fxsaber:

Étape sur le terrain.

Désolé, je ne l'ai pas lu attentivement.
 
fxsaber:

Champ de l'étape.

La raison en est probablement que les champs d'énumération peuvent recevoir des valeurs propres qui peuvent ne pas être un multiple de n'importe quelle étape.

 
Alexey Kozitsyn:

La raison en est probablement que les champs d'énumération peuvent recevoir des valeurs propres, qui peuvent ne pas être un multiple de n'importe quelle étape.

Oui, ce n'est pas un bug, c'est pourquoi nous avons commencé à en parler dans ce fil. Si nous voulons une étape d'optimisation, elle peut être définie par MQL pour l'enum.

 

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

Bibliothèques : TesterBenchmark

fxsaber, 2017.11.22 16:54

Insertion d'une seule ligne dans chacune des variantes de MT5

#define Comment(A)

Accéléré de 67%, artisanal de 108% !


Mais ce n'est pas le point principal. Nous avons réussi à accélérer nos EAs avec une seule ligne ! Et ce, dans l'Optimiseur où le Commentaire ne joue aucun rôle.

 
// Возвращает true только в случае, если выбран (в тестере) режим по реальным тикам
// Перед использованием должен быть хотя бы один OnTick вызван тестером
bool IsRealTicks( void )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(_Symbol, Tick) && (Tick.volume || !(Tick.flags & TICK_FLAG_LAST)));
}


Exemple d'utilisation

// Советник будет тестироваться только в режиме по реальным тикам
void OnTick()
{
  static bool IsRemove = true;
  
  if (IsRemove)
  {
    IsRemove = MQLInfoInteger(MQL_TESTER) && !IsRealTicks();
    
    if (IsRemove)
    {
      Print("Real ticks mode is needed!");
      
      ExpertRemove();
      
      return;
    }
  }
  
  //........
}
Comment faire cela dans OnInit (sans OnTick) - je ne sais pas.
 

Un extrait du dialogue sur le sujet mentionné.

fxsaber2017.11.24 08:35
N'utilisez pas d'expressions dans les paramètres d'impression (ou de commentaire). Spécifiez les paramètres séparés par des virgules. Alors il est certain que toutes les conversions de chaînes de caractères seront surchargées.

Pourriez-vous expliquer à l'aide d'un exemple comment ces deux chaînes sont différentes en mode Optimisation ?

Print((string)i + (string)d);
Print(i, d);
Équipe de soutien2017.11.24 08:44

Lors de l'optimisation dans le premier cas, une expression de chaîne de caractères sera calculée avant l'impression. L'impression elle-même sera appelée, mais elle ne fonctionnera pas.

Dans le second cas, Print sera appelé, mais cela ne fonctionnera pas. Et la conversion de chaîne i+d ne fonctionnera pas non plus.

Dans un test simple, les résultats du premier et du second appel seront les mêmes en termes de temps et de puissance reçue.

C'est-à-dire qu'il est beaucoup plus économique d'utiliser l'impression avec des virgules pour les modes d'optimisation que de former un seul paramètre d'entrée pour celui-ci sous forme de chaîne.


Par contre, s'il forme tout comme une seule chaîne à l'intérieur de Print, il est facile de désactiver sa formation dans le mode Optimisation via

#define Print(A)

mais une telle construction ne fonctionnera pas si des virgules sont utilisées. De plus, une telle construction le désactivera également en mode Optimisation.

Print(SendOrder()); // SendOrder будет проигнорирован при #define Print(A)


Par conséquent (et pour d'autres raisons), il est préférable de ne pas appeler les fonctions vraiment importantes à l'intérieur de Print. Par conséquent, si vous vous occupez des performances en mode Optimisation, vous devrez toujours faire quelque chose comme ceci

static const bool IsNotOptim = !MQLInfoInteger(MQL_OPTIMIZATION);

if (IsNotOptim)
{
  const string Str = GetString(); // дорогой вызов
  
  Print(Str);
//  Comment(Str); 
//  Alert(Str);
}
 
fxsaber:

Un extrait du dialogue sur le sujet mentionné

C'est-à-dire qu'il est beaucoup plus économique d'utiliser l'impression avec des virgules pour les modes d'optimisation que de former un seul paramètre d'entrée sous forme de chaîne de caractères.


D'un autre côté, si vous formez tout comme une seule ligne à l'intérieur de Print, il est facile de désactiver sa formation dans le mode Optimisation grâce à

mais une telle construction ne fonctionnera pas si des virgules sont utilisées. En outre, une telle construction le désactivera également en mode Optimisation.


Par conséquent (et pour d'autres raisons), il est préférable de ne pas appeler les fonctions vraiment importantes à l'intérieur de Print. En fin de compte, si vous vous souciez des performances en mode Optimisation, vous devrez toujours faire quelque chose comme ceci

Désolé, peut-être que je ne comprends pas, mais pourquoi appeler des fonctions importantes dans le print ?
 
Vladislav Andruschenko:
Désolé, peut-être que je ne comprends pas, pourquoi dois-je appeler des fonctions importantes dans l'impression ?

Ce n'est pas interdit.

 
fxsaber:

Ce n'est pas interdit.

Je suis d'accord.

Je voulais juste savoir quel était le but.

J'ai maintenant rencontré un problème avec plus de 1000 transactions dans l'historique et lorsque j'appelle la fonction de traitement de l'historique, par exemple, pour calculer le bénéfice de l'historique. + Je ne sais pas pourquoi je m'embête avec ce problème. C'est-à-dire que les citations sont accompagnées d'un délai.

Raison: