Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5 - страница 154

 
fxsaber:
Как по такому логу исполнения узнать, какой mqh-файл имеется в виду?

Ведь может же быть несколько одинаковых по названия файла, но подключенных из разных папок.

А разве двойной тык по строке не открывает файл с этой ошибкой?

Только вчера у меня была проблема, я переменную назвал tp и двойной тык по строке открыл инклюдник и курсор встал на переменную tp.

 
Alexey Viktorov:

А разве двойной тык по строке не открывает файл с этой ошибкой?

Только вчера у меня была проблема, я переменную назвал tp и двойной тык по строке открыл инклюдник и курсор встал на переменную tp.

Это же лог исполнения!

 
fxsaber:

Это же лог исполнения!

Однако, мало мало ошибка давала...

 
Anton:

Исправлено. Правка будет доступна в следующей сборке.

Скажите, имеет ли значение для внимания разработчиков, когда повторяешь несколько раз, что в очередном билде указанная ошибка не исправлена?

Или Вы сразу берете на "карандаш", когда постится воспроизводимый баг?


Вы очень быстро среагировали, когда третий раз повторил об ошибке. Если это не совпадение, то очень сложно напоминать, т.к. совсем не помнится, какие репорты давал. Хоть иногда бывает, что для воспроизведения бага тратил не малое время. Но память - штука индивидуальная. Совсем не помню свои репорты.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5

fxsaber, 2018.12.05 12:46

Некоторые кастомные символы не удалить из Обзора рынка (графики не открыты), пока не перезагрузишь Терминал. Раньше таких проблем не было.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5

fxsaber, 2018.12.05 15:29

В Тестере можно выбирать кастомные символы, которые выключены в Обзоре рынка. Видимо, отсюда ноги растут невозможности удаления некоторых символов - тестер на них когда-то запускался.

Так до сих пор и перезагружаю терминал, чтобы удалить. Решил напомнить.

 
Это баг?
class A
{
private:
  static void f( int = 0 ) {}

public:
  static void f() {}
};

void OnStart()
{
  A::f(); // 'f' - ambiguous call to overloaded function with the same parameters
}
Вроде, все однозначно.
 

В Терминале из вкладки Избранное запускаю (перетаскиваю на чарт) скрипт, который после правки не компилируется.

Вместо отсутствия действия запускается какой-то советник. Это баг, который несложно воспроизвести.

 
Уважаемые разработчики, решал казалось бы рядовую задачу - получить список файлов песочницы (включая подпапки). Код немного громоздкий
class FILE
{
private:
  static int GetFileNames( string &FileNames[], int Pos /*= 0*/, string Filter = "*", const int Common_Flag = 0 )
  {
      string FileName;
      const long handle = ::FileFindFirst(Filter, FileName, Common_Flag);

      if (handle != INVALID_HANDLE)
      {
        const string Directory = FILE::GetDirectory(Filter);
        Filter = ::StringSubstr(Filter, ::StringLen(Directory));

        do
        {
          const string TmpFileName = Directory + FileName;

          if (::FileIsExist(TmpFileName, Common_Flag))
          {
            ::ArrayResize(FileNames, Pos + 1, 30000);
            FileNames[Pos] = TmpFileName;
            Pos++;
          }
        }
        while (::FileFindNext(handle, FileName));

        ::FileFindClose(handle);
      }

    return(Pos);
  }

public:
  static string GetDirectory( const string FileName )
  {
    int Pos = ::StringFind(FileName, "\\");
    int LastPos = Pos;

    while (Pos >= 0)
    {
      LastPos = Pos;

      Pos = ::StringFind(FileName, "\\", Pos + 1);
    }

    return((LastPos >= 0) ? ::StringSubstr(FileName, 0, LastPos + 1) : "");
  }

  static int GetDirectories( string &Directories[], int Pos = 0, string Filter = "*", const int Common_Flag = 0 )
  {
    string FileName;
    const long handle = ::FileFindFirst(Filter, FileName, Common_Flag);

    if (handle != INVALID_HANDLE)
    {
      const string Directory = FILE::GetDirectory(Filter);
      Filter = ::StringSubstr(Filter, ::StringLen(Directory));

      do
      {
        const string TmpFileName = Directory + FileName;

        if (!::FileIsExist(TmpFileName, Common_Flag) && (::GetLastError() == ERR_FILE_IS_DIRECTORY))
        {
          ::ArrayResize(Directories, Pos + 1, 30000);
          Directories[Pos] = TmpFileName;
          Pos++;

          Pos = FILE::GetDirectories(Directories, Pos, TmpFileName + Filter, Common_Flag);
        }
      }
      while (::FileFindNext(handle, FileName));

      ::FileFindClose(handle);
    }

    return(Pos);
  }

  // Возвращает список всех файлов по фильтру
  static int GetFileNames( string &FileNames[], string Filter = "*", const int Common_Flag = 0 )
  {
    int Pos = FILE::GetFileNames(FileNames, 0, Filter, Common_Flag);

    const string Directory = FILE::GetDirectory(Filter);
    Filter = ::StringSubstr(Filter, ::StringLen(Directory));

    string Directories[];

    const int Size = FILE::GetDirectories(Directories, 0, Directory + "*", Common_Flag);

    for (int i = 0; i < Size; i++)
      Pos = FILE::GetFileNames(FileNames, Pos, Directories[i] + Filter, Common_Flag);

    return(Pos);
  }
};

#define BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}  

void OnStart()
{
  string FileNames[];
  
  BENCH(FILE::GetFileNames(FileNames)); // Получаем список всех файлов в песочнике
  Print(ArraySize(FileNames));          // Сколько всего файлов
}


Результат такой

Time[FILE::GetFileNames(FileNames)] = 2550136
28262


Т.е. файлов всего ~28 000 штук, при этом получение этого списка занимает 2.5 секунды (SSD). Профилирование показывает, что >95% времени отнимает вызов FileIsExists.

Могли бы Вы посмотреть реализацию своей функции, чтобы она работала быстрее хотя бы на порядок-два?


Обращаюсь ко всем, существует ли более быстрый способ получить список файлов песочницы? Возможно, написал далеко не оптимальный код.

 
fxsaber:

Скажите, имеет ли значение для внимания разработчиков, когда повторяешь несколько раз, что в очередном билде указанная ошибка не исправлена?

Или Вы сразу берете на "карандаш", когда постится воспроизводимый баг?


Вы очень быстро среагировали, когда третий раз повторил об ошибке. Если это не совпадение, то очень сложно напоминать, т.к. совсем не помнится, какие репорты давал. Хоть иногда бывает, что для воспроизведения бага тратил не малое время. Но память - штука индивидуальная. Совсем не помню свои репорты.

Обычно, на карандаш берётся сразу. Сходу делается проверка. А дальше как получится. Если воспроизвелось, то исправляем без лишних вопросов. Если не воспроизвелось, то оцениваем баг. Насколько он серъёзен и скольких пользователей он может задеть. Априори мы верим всему, что написано. Сказали нам, что есть баг, значит он есть. Если считаем, что баг серьёзный, то связываемся с автором репорта в личке и вытягиваем максимум подробностей.

По-хорошему, нужны воспроизводимые шаги.

Иногда баги проходят мимо. Не увидели, увидели, но забыли.

Про удаление кастомных символов просто руки не дошли. Проверка сходу не показала проблем. Да и у нас есть готовый соответствующий тест.

 
fxsaber:

В Терминале из вкладки Избранное запускаю (перетаскиваю на чарт) скрипт, который после правки не компилируется.

Вместо отсутствия действия запускается какой-то советник. Это баг, который несложно воспроизвести.

Проверим