MetaTrader 5 build 2121 : Nouveau design du testeur de stratégie - page 8

 
A100:

Lesrésultats de l'exécution montrent que le compilateur agit contrairement à la logique :

  • Pour une chaîne constante, plus de mémoire est allouée que nécessaire (sa longueur ne peut en principe pas être augmentée).
  • Aucune mémoire supplémentaire n'est allouée pour une chaîne non constante (si sa longueur augmente, une nouvelle allocation de mémoire sera nécessaire)
  • Si l'utilisateur initialise une chaîne avec StringInitInit, plus de mémoire est allouée que nécessaire, parce que la taille du tampon est explicitement fixée par l'utilisateur et dans la plupart des cas, elle ne sera pas augmentée (l'utilisateur a déjà pensé au tampon final dont il a besoin et a fixé sa taille explicitement)

Pour une chaîne constante pure, la taille du tampon par StringBufferlen=0, ce qui signifie que la chaîne est constante :

        string s1 = "_";            // исходное "чистое" присвоение константной строки
        Print(StringBufferLen(s1)); // показывает 0 верно, не должно быть 260


Réaffecter une chaîne de caractères "prétendument" constante ne revient pas à travailler avec une constante, mais plutôt à créer exactement une variable dynamique avec une préaffectation de 260 caractères :

        const string s2 = s1;       // динамическое создание переменной копированием данных из другой переменной (не константной строки)
        Print(StringBufferLen(s2)); // показывает 260 верно
 
Renat Fatkhullin:

Pour une chaîne constante pure, la taille du tampon par StringBufferlen=0, ce qui signifie que la chaîne est constante :


Réallouer une chaîne "supposée" constante, ce n'est pas travailler avec une constante, c'est créer une variable dynamique avec une pré-allocation de 260 caractères :

il est temps d'introduire les allocateurs ;)))

 

Pour rappel, il y a un bug avec le tampon de chaîne :

#import "Shlwapi.dll"
int PathFileExistsW(string &pszPath);
#import

class CTest
{
protected:
   string bufstr;

public:
   CTest()
   {
      StringInit(bufstr, 1000111);
   }
   string getString()
   {
      PathFileExistsW(bufstr);
      Print(StringBufferLen(bufstr), " ", StringLen(bufstr));   
      return bufstr;
   }
};

CTest dll;

int OnInit()
{
   dll.getString(); // 1000111 0 - OK
   dll.getString(); // 260 0 - ???
   dll.getString(); // 260 0 - ???
   return INIT_SUCCEEDED;
}
void OnTick()
  {
  }
//+------------------------------------------------------------------+
La fonction de la DLL peut être n'importe quoi.
 

Je suggère d'ajouter une version étendue de la fonctionStringToTime à MQL dans le formulaire :

bool StringToTime(string timeString, datetime &time);

Parce que dans la version actuelle, la fonction renvoie toujours une heure valide, même si la chaîne contient des déchets, et la date actuelle est renvoyée, ce qui est particulièrement étrange :

StringToTime("aaabbbccc") renvoie "2019.09.05 01:00:00" Est-ce normal ? Dans cette implémentation, la fonction est dangereuse pour la santé du tout. Par conséquent, une version avec des contrôles de correction est nécessaire.

Jusqu'à présent, nous avons analysé avec notre propre fonction,mais le problème est que l'heure peut être spécifiée dans différents formats.Et je n'ai pas vraiment envie de coder tous ces formats en réinventant la roue alors que le temps a déjà été implémenté dans MQL.

En principe, cela s'applique également aux autres fonctions de conversion de chaînes de caractères : StringToInteger, StringToDouble. Aucun contrôle de validité n'est prévu pour elles aussi.

p.s. Hmm, il s'avère queGetLastError() génère des erreurs dans ces cas. Je ne le savais pas. La documentation de ces fonctions ne dit rien de tel. Cela élimine le problème, bien que ce serait plus facile avec un bool.
 
Alexey Navoykov:


Je soutiens la suggestion d'Alexey, une manipulation sûre des chaînes de caractères est essentielle pour éviter les erreurs cachées.

 
#property tester_no_cache true

erreur "la propriété existe déjà avec une valeur différente et sera ignorée".

Je l'ai utilisé pour la première fois. Aucun autre dossier ne l'a. Ne dépend pas de la valeur. Construire 2136.

 

S'il vous plaît, ramenez l'ancien style de styler.

Maintenant je n'arrive pas à comprendre ce qui est censé fonctionner ici :

   int size=ArraySize(prices);
   if(size>1)
     {
      if(size>2)
         return(true);
      if(extrema[1]<0.0 && extrema[0]<0.0)
        {
         if(extrema[1]>extrema[0])
            if(prices[1]<prices[0])
              {
               int d=0;
              }
        }
      else
         if(extrema[1]>0.0 && extrema[0]>0.0)
           {
            if(extrema[1]<extrema[0])
               if(prices[1]>prices[0])
                 {
                  int d=0;
                 }
           }
         else
           {
            return(true);
           }
     }
   else
     {
      int d=0;
     }

Cette pièce ressemblait à ça avant :

   int size=ArraySize(prices);
   if(size>1)
     {
      if(size>2)
         return(true);
      if(extrema[1]<0.0 && extrema[0]<0.0)
        {
         if(extrema[1]>extrema[0])
            if(prices[1]<prices[0])
              {
               int d=0;
              }
        }
      else if(extrema[1]>0.0 && extrema[0]>0.0)
        {
         if(extrema[1]<extrema[0])
            if(prices[1]>prices[0])
              {
               int d=0;
              }
        }
      else
        {
         return(true);
        }
     }
   else
     {
      int d=0;
     }
 
Edgar:
#property tester_no_cache true

erreur "la propriété existe déjà avec une valeur différente et sera ignorée".

Je l'ai utilisé pour la première fois. Aucun autre dossier ne l'a. Ne dépend pas de la valeur. Construire 2136.

Cette erreur se produit lors du travail avec des projets si la valeur de la propriété spécifiée dans le code source est en conflit avec la valeur dans les paramètres du projet.

Propriétés du projet

Les propriétés du programme dans le fichier de projet ont la priorité sur les propriétés spécifiées dans le code source. Si vous spécifiez des propriétés à la fois dans le projet et dans le code source, ce sont les propriétés du projet qui seront utilisées.
Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
  • www.metatrader5.com
MetaEditor позволяет удобно работать над большими проектами: объединять множество файлов в одну структуру, управлять настройками проекта и вести совместную разработку с командой программистов через версионное онлайн-хранилище MQL5 Storage. Что такое проект Проект — это отдельный файл с расширением "MQPROJ", в котором хранятся настройки...
 
Vladimir Karputov:

S'il vous plaît, ramenez l'ancien style de styler.

Maintenant je n'arrive pas à comprendre ce qui est censé fonctionner ici :

Cette pièce ressemblait à ça avant :

Les ifs multiples imbriqués ne peuvent être sauvegardés par aucun alignement. Nous devons modifier le code pour le rendre lisible.

bool Sample()
  {
//---
   double prices[], extrema[];
   int size=ArraySize(prices);
   if(size>2)
      return(true);

   if(size<=1)
     {
      int d=0;
      return(false);
     }

   if(extrema[1]<0.0 && extrema[0]<0.0)
     {
      if(extrema[1]>extrema[0])
         if(prices[1]<prices[0])
           {
            int d=0;
           }
      return(false);
     }

   if(extrema[1]>0.0 && extrema[0]>0.0)
     {
      if(extrema[1]<extrema[0])
         if(prices[1]>prices[0])
           {
            int d=0;
           }
      return(false);
     }
//---     
   return(true);
  }
 
Rashid Umarov:

Les ifs multiples imbriqués ne peuvent être sauvegardés par aucun alignement. Vous devez modifier le code pour le rendre lisible.

Il n'y a pas d'imbrication multiple - le niveau supérieur est if, puis if else.

Je demande l'ancien style de l'époque où tout le monde ressemblait à ça :

      else if

- était sur une seule ligne et il n'y avait pas de décalage du texte suivant vers la droite.


Voici un exemple tiré de l'aide sur lesinstructions conditionnelles if-else (l' ancien stylet)

//--- Вложенные операторы
if(x=='a')
  {
   y=1;
  }
else if(x=='b')
  {
   y=2;
   z=3;
  }
else if(x=='c')
  {   
   y=4;
  }
else Print("ERROR");

et c'est ce que fait le nouveau styler :

//--- Вложенные операторы
   if(x=='a')
     {
      y=1;
     }
   else
      if(x=='b')
        {
         y=2;
         z=3;
        }
      else
         if(x=='c')
           {
            y=4;
           }
         else
            Print("ERROR");
Стилизатор - Разработка программ - MetaTrader 5
Стилизатор - Разработка программ - MetaTrader 5
  • www.metatrader5.com
Стилизатор позволяет быстро привести оформление исходного кода к рекомендуемому стандарту. Это делает код легко читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще читать и анализировать в последующем как его автору, так и другим пользователям. Чтобы запустить стилизатор, нажмите " Стилизатор" в меню "Сервис" или...