MetaTrader 5 build 2121: Новое оформление тестера стратегий - страница 8

 
A100:

Результаты выполнения показывают, что компилятор действует вопреки логике:

  • Для константной строки памяти выделяется больше чем нужно (ее длину увеличить будет нельзя принципиально )
  • Для неконстантной строки дополнительной памяти не выделяется (при увеличении ее длины, потребуется новое распределение памяти)
  • Если пользователь инициализирует строку через StringInitInit, то памяти выделяется больше, чем нужно, потому что размер буфера пользователем задан явно и в подавляющем большинстве случаев он не будет увеличен (пользователь уже сам подумал какой конечный буфер ему нужен и задал его размер явно)

Для чистой константной строки размер буфера по StringBufferlen=0, что означает константность строки:

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


Перекладка "якобы" константной строки не является работой с константой, а создается именно динамическая переменная с преаллокацией в 260 символов:

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

Для чистой константной строки размер буфера по StringBufferlen=0, что означает константность строки:


Перекладка "якобы" константной строки не является работой с константой, а создается именно динамическая переменная с преаллокацией в 260 символов:

пора вводить аллокаторы )))

 

Напоминаю, что есть баг со строковым буффером:

#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()
  {
  }
//+------------------------------------------------------------------+
Функция  из ДЛЛки может быть любая.
 

Предлагаю добавить в MQL расширенный вариант функции StringToTime в виде:

bool StringToTime(string timeString, datetime &time);

Потому что в нынешнем варианте функция всегда возвращает валидное время, даже если в строке содержится мусор, причём возвращается текущая дата, что особенно странно:

StringToTime("aaabbbccc")  возвращает "2019.09.05 01:00:00"   Разве это нормально?  В таком исполнении функция вообще опасна для здоровья.  Поэтому необходим вариант с проверкой на корректность.

Пока приходится парсить собственной функцией.  Но проблема в том, что время может быть задано в различных форматах. А кодить все эти форматы, изобретая велосипед, не очень хочется, коль оно уже реализовано в MQL.

В принципе это касается и других функций преобразования строк:  StringToInteger, StringToDouble.  Для них тоже не предусмотрено проверки валидности. 

p.s. Хм, оказывается GetLastError() выдаёт ошибки в этих случаях.  Вот уж не не знал.  В документации по этим функциям ничего такого не сказано.  Тогда проблема снимается.  Хотя через bool было бы проще.
 
Alexey Navoykov:


Поддерживаю предложение Алексея, безопасная работа со строками, залог исключения скрытых ошибок.

 
#property tester_no_cache true

ошибка "property already exists with different value and will be skipped".

Использовал впервые. Ни в одном файле еë больше нет. От значения не зависит. Билд 2136.

 

Пожалуйста верните старый стиль стилизатора

Теперь не могу понять, что же здесь должно выполняться:

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

Раньше этот кусок выглядел так:

   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

ошибка "property already exists with different value and will be skipped".

Использовал впервые. Ни в одном файле еë больше нет. От значения не зависит. Билд 2136.

Такая ошибка возникает при работате с проектами - если значения свойства, указанное в исходном коде конфликтует со значением в настройках проекта.

Свойства проекта

Свойства программы в файле проекта имеют приоритет над свойствами, указанными в исходном коде. Если вы укажете свойства и в проекте, и в исходном коде, будут использоваться свойства из проекта.
Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
  • www.metatrader5.com
MetaEditor позволяет удобно работать над большими проектами: объединять множество файлов в одну структуру, управлять настройками проекта и вести совместную разработку с командой программистов через версионное онлайн-хранилище MQL5 Storage. Что такое проект Проект — это отдельный файл с расширением "MQPROJ", в котором хранятся настройки...
 
Vladimir Karputov:

Пожалуйста верните старый стиль стилизатора

Теперь не могу понять, что же здесь должно выполняться:

Раньше этот кусок выглядел так:

Множественные вложенные if не спасти никакими выравниваниями. Нужно код менять, чтобы его можно было читать.

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:

Множественные вложенные if не спасти никакими выравниваниями. Нужно код менять, чтобы его можно было читать.

Нет никаких множественных вложений - на верхнем уровне if, затем if else.

Я прошу вернуть старый стиль, когда if else выглядел так:

      else if

- был в одну строку и не было смещения последующего текста вправо.


Вот пример из справки Условный оператор if-else (старый стилизатор)

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

и вот что творит новый стилизатор:

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