MetaTrader 5 build 2121: nuovo design dello Strategy Tester - pagina 8

 
A100:

I risultati dell'esecuzione mostrano che il compilatore agisce contro la logica:

  • Per una stringa costante, viene allocata più memoria del necessario (la sua lunghezza non può essere aumentata in linea di principio)
  • Non viene allocata ulteriore memoria per una stringa non costante (se la sua lunghezza aumenta, sarà necessaria una nuova allocazione di memoria)
  • Se l'utente inizializza una stringa con StringInitInit, viene allocata più memoria del necessario, perché la dimensione del buffer è impostata esplicitamente dall'utente e nella maggior parte dei casi non sarà aumentata (l'utente ha già pensato di quale buffer finale ha bisogno e ha impostato la sua dimensione esplicitamente)

Per una pura stringa costante, la dimensione del buffer di StringBufferlen=0, il che significa che la stringa è costante:

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


Riassegnare una stringa "presumibilmente" costante non è lavorare con una costante, ma creare esattamente una variabile dinamica con una preassegnazione di 260 caratteri:

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

Per una pura stringa costante, la dimensione del buffer di StringBufferlen=0, il che significa che la stringa è costante:


Riallocare una stringa "presumibilmente" costante non è lavorare con una costante, è creare una variabile dinamica con una preallocazione di 260 caratteri:

è il momento di introdurre gli allocatori )))

 

Un promemoria che c'è un bug con il buffer delle stringhe:

#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 funzione della DLL può essere qualsiasi cosa.
 

Suggerisco di aggiungere una versione estesa della funzioneStringToTime a MQL nel modulo:

bool StringToTime(string timeString, datetime &time);

Perché nella versione attuale la funzione restituisce sempre l'ora valida, anche se la stringa contiene schifezze, e viene restituita la data attuale, il che è particolarmente strano:

StringToTime("aaabbbccc") restituisce "2019.09.05 01:00:00" È normale? In questa implementazione, la funzione è pericolosa per la salute, quindi è necessaria una versione con controlli di correttezza.

Finora dobbiamo fare il parsing con la nostra funzione,ma il problema è che il tempo può essere specificato in diversi formati.E non voglio davvero codificare tutti quei formati reinventando la ruota quando il tempo è già stato implementato in MQL.

Fondamentalmente, questo si applica anche ad altre funzioni di conversione di stringhe: StringToInteger, StringToDouble. Nessun controllo di validità è previsto anche per loro.

p.s. Hmm, si scopre cheGetLastError() genera errori in questi casi. Non lo sapevo. La documentazione di queste funzioni non dice nulla del genere. Questo elimina il problema, anche se sarebbe più facile con un bool.
 
Alexey Navoykov:


Appoggio il suggerimento di Alexey, la gestione sicura delle stringhe è la chiave per evitare errori nascosti.

 
#proprietà tester_no_cache true

errore "la proprietà esiste già con un valore diverso e sarà saltata".

L'ho usato per la prima volta. Nessun altro file ce l'ha. Non dipende dal valore. Costruire 2136.

 

Per favore, riporta la styler vecchio stile.

Ora non riesco a capire cosa dovrebbe funzionare qui:

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

Questo pezzo aveva questo aspetto:

   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:
#proprietà tester_no_cache true

errore "la proprietà esiste già con un valore diverso e sarà saltata".

L'ho usato per la prima volta. Nessun altro file ce l'ha. Non dipende dal valore. Costruire 2136.

Questo errore si verifica mentre si lavora con i progetti se il valore della proprietà specificata nel codice sorgente è in conflitto con il valore nelle impostazioni del progetto.

Proprietà del progetto

Le proprietà del programma nel file di progetto hanno la precedenza sulle proprietà specificate nel codice sorgente. Se si specificano le proprietà sia nel progetto che nel codice sorgente, verranno usate le proprietà del progetto.
Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
  • www.metatrader5.com
MetaEditor позволяет удобно работать над большими проектами: объединять множество файлов в одну структуру, управлять настройками проекта и вести совместную разработку с командой программистов через версионное онлайн-хранилище MQL5 Storage. Что такое проект Проект — это отдельный файл с расширением "MQPROJ", в котором хранятся настройки...
 
Vladimir Karputov:

Per favore, riporta la styler vecchio stile.

Ora non riesco a capire cosa dovrebbe funzionare qui:

Questo pezzo aveva questo aspetto:

Gli if multipli annidati non possono essere salvati da nessun allineamento. Dobbiamo cambiare il codice per renderlo leggibile.

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:

Gli if multipli annidati non possono essere salvati da nessun allineamento. Devi cambiare il codice per renderlo leggibile.

Non c'è annidamento multiplo - il livello superiore è if, poi if else.

Sto chiedendo il vecchio stile, quando tutto il resto assomigliava a questo:

      else if

- Era su una sola riga e non c'era alcun offset del testo successivo a destra.


Ecco un esempio dall'aiuto delladichiarazione condizionale if-else (il vecchio styler)

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

e questo è ciò che fa il nuovo 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
Стилизатор позволяет быстро привести оформление исходного кода к рекомендуемому стандарту. Это делает код легко читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще читать и анализировать в последующем как его автору, так и другим пользователям. Чтобы запустить стилизатор, нажмите " Стилизатор" в меню "Сервис" или...