MetaTrader 5 build 2121: Neues Design des Strategietesters - Seite 8

 
A100:

Die Ausführungsergebnisse zeigen, dass der Compiler entgegen der Logik handelt:

  • Bei einer konstanten Zeichenkette wird mehr Speicher zugewiesen als benötigt (ihre Länge kann im Prinzip nicht erhöht werden).
  • Für eine nicht konstante Zeichenkette wird kein zusätzlicher Speicher zugewiesen (wenn sich ihre Länge erhöht, ist eine neue Speicherzuweisung erforderlich).
  • Wenn der Benutzer eine Zeichenkette mit StringInitInit initialisiert, wird mehr Speicher als nötig zugewiesen, da die Puffergröße explizit vom Benutzer festgelegt wird und in den meisten Fällen nicht vergrößert wird (der Benutzer hat sich bereits Gedanken darüber gemacht, welchen Endpuffer er benötigt und dessen Größe explizit festgelegt)

Bei einer rein konstanten Zeichenkette ist die Größe des Puffers durch StringBufferlen=0, was bedeutet, dass die Zeichenkette konstant ist:

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


Die Neuzuweisung einer "vermeintlich" konstanten Zeichenkette ist keine Arbeit mit einer Konstanten, sondern die Erstellung einer dynamischen Variablen mit einer Vorbelegung von 260 Zeichen:

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

Bei einer rein konstanten Zeichenkette ist die Puffergröße mit StringBufferlen=0, was bedeutet, dass die Zeichenkette konstant ist:


Die Neuzuweisung einer "vermeintlich" konstanten Zeichenkette ist keine Arbeit mit einer Konstanten, sondern die Erstellung einer dynamischen Variablen mit einer Vorzuweisung von 260 Zeichen:

es ist an der Zeit, Allokatoren einzuführen )))

 

Eine Erinnerung daran, dass es einen Fehler mit dem String-Puffer gibt:

#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()
  {
  }
//+------------------------------------------------------------------+
Die Funktion aus der DLL kann alles sein.
 

Ich schlage vor, eine erweiterte Version derStringToTime-Funktion zu MQL in der Form hinzuzufügen:

bool StringToTime(string timeString, datetime &time);

Denn in der aktuellen Version gibt die Funktion immer eine gültige Zeit zurück, auch wenn die Zeichenkette Unsinn enthält, und es wird das aktuelle Datum zurückgegeben, was besonders seltsam ist:

StringToTime("aaabbbccc") liefert "2019.09.05 01:00:00" Ist das normal? In dieser Implementierung ist die Funktion gesundheitsgefährdend. Daher wird eine Version mit Korrektheitsprüfungen benötigt.

Bisher müssen wir mit unserer eigenen Funktion parsen,aber das Problem ist, dass die Zeit in verschiedenen Formaten angegeben werden kann.Und ich möchte nicht wirklich all diese Formate programmieren und das Rad neu erfinden, wenn die Zeit bereits in MQL implementiert wurde.

Dies gilt im Grunde auch für andere Funktionen zur Umwandlung von Zeichenketten: StringToInteger, StringToDouble, für die ebenfalls keine Gültigkeitsprüfung vorgesehen ist.

p.s. Hmm, es stellt sich heraus, dassGetLastError() in diesen Fällen Fehler erzeugt. Das wusste ich nicht. Die Dokumentation für diese Funktionen sagt nichts dergleichen. Das beseitigt das Problem, obwohl es mit einem bool einfacher wäre.
 
Alexey Navoykov:


Ich unterstütze Alexeys Vorschlag, denn der sichere Umgang mit Zeichenketten ist der Schlüssel zur Vermeidung von versteckten Fehlern.

 
#property tester_no_cache true

Fehler "Eigenschaft existiert bereits mit anderem Wert und wird übersprungen".

Ich habe es zum ersten Mal benutzt. In keiner anderen Datei ist sie enthalten. Hängt nicht vom Wert ab. Build 2136.

 

Bitte bringen Sie den Styler im alten Stil zurück.

Jetzt weiß ich nicht, was hier laufen soll:

   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;
     }

Dieses Stück sah früher so aus:

   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

Fehler "Eigenschaft existiert bereits mit anderem Wert und wird übersprungen".

Ich habe es zum ersten Mal benutzt. In keiner anderen Datei ist sie enthalten. Hängt nicht vom Wert ab. Build 2136.

Dieser Fehler tritt bei der Arbeit mit Projekten auf, wenn der Wert der im Quellcode angegebenen Eigenschaft nicht mit dem Wert in den Projekteinstellungen übereinstimmt.

Projekt-Eigenschaften

Die Programmeigenschaften in der Projektdatei haben Vorrang vor den im Quellcode angegebenen Eigenschaften. Wenn Sie Eigenschaften sowohl im Projekt als auch im Quellcode angeben, werden die Eigenschaften aus dem Projekt verwendet.
Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
  • www.metatrader5.com
MetaEditor позволяет удобно работать над большими проектами: объединять множество файлов в одну структуру, управлять настройками проекта и вести совместную разработку с командой программистов через версионное онлайн-хранилище MQL5 Storage. Что такое проект Проект — это отдельный файл с расширением "MQPROJ", в котором хранятся настройки...
 
Vladimir Karputov:

Bitte bringen Sie den Styler im alten Stil zurück.

Jetzt weiß ich nicht, was hier laufen soll:

Dieses Stück sah früher so aus:

Mehrfach verschachtelte ifs können nicht durch eine Ausrichtung gespeichert werden. Wir müssen den Code ändern, um ihn lesbar zu machen.

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:

Mehrfach verschachtelte ifs können von keiner Ausrichtung gespeichert werden. Sie müssen den Code ändern, um ihn lesbar zu machen.

Es gibt keine Mehrfachverschachtelung - die oberste Ebene ist if, then if else.

Ich frage nach dem alten Stil, als alles andere so aussah:

      else if

- stand in einer einzigen Zeile und der nachfolgende Text war nicht nach rechts versetzt.


Hier ist ein Beispiel aus der Hilfezur bedingten if-else-Anweisung (der alte Styler)

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

und das ist es, was der neue Styler tut:

//--- Вложенные операторы
   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
Стилизатор позволяет быстро привести оформление исходного кода к рекомендуемому стандарту. Это делает код легко читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще читать и анализировать в последующем как его автору, так и другим пользователям. Чтобы запустить стилизатор, нажмите " Стилизатор" в меню "Сервис" или...