Обсуждение статьи "Основы программирования на MQL5: Файлы" - страница 2

 
Artyom Trishkin:

Только в справке по mql5 о них ни слова ещё нету...

А для четвёрки будут?

В справке есть уже с 14 числа FileSave

Можете обновить вручную с сайта

 
Andrey F. Zelinsky:

Маленький комментарий по части понятности справки.

Не сразу было понятно положение справки (чувствуется явная недосказанность):

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

void OnStart()
  {
   string  filename=_Symbol+"_ticks.bin";
   MqlTick ticks[];
//---
   int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save);
   if(copied!=-1)
     {
      PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied);
      //--- если тиковая история синхронизирована, то код ошибки равен нулю
      if(!GetLastError()==0)
         PrintFormat("%s: Ticks are not synchronized, error=%d",_Symbol,copied,_LastError);
      //---  запишем тики в файл
      if(!FileSave(filename,ticks,FILE_COMMON))
         PrintFormat("FileSave() failed, error=%d",GetLastError());
     }
 
Andrey F. Zelinsky:

Если угодно, то я могу вообще ничего не писать, кроме восхищений. Только начну восхищаться, скажите что я ёрничаю и т.п. Не угодить.

Если вам понятна фраза:


Понятна

 int          common_flag=0      // файловый флаг, по умолчанию файлы пишутся в папку <каталог_данных>\MQL5\Files\

 
Artyom Trishkin:

Только в справке по mql5 о них ни слова ещё нету...

А для четвёрки будут?

В четверке уже ничего не будет, к сожалению.
 
Напишем полезную функцию для получения списка файлов и папок

К сожалению, полный расклад (включая все подпапки и файлы в них ) функция не дает. Поэтому дополню

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) : "");
}

// Возвращает список всех файлов по фильтру
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 = GetDirectory(Filter);    
    Filter = StringSubstr(Filter, StringLen(Directory));
    
    do
    {
      const string TmpFileName = Directory + FileName;
      
      ArrayResize(FileNames, Pos + 1);      
      FileNames[Pos] = TmpFileName;      
      Pos++;
        
      if (!FileIsExist(TmpFileName, Common_Flag))
        Pos = GetFileNames(FileNames, Pos, TmpFileName + Filter, Common_Flag);
    }
    while (FileFindNext(handle, FileName));  
    
    FileFindClose(handle);
  }
  
  return(Pos);
}

Смысл фильтра такой же, как в статье. Пример применения

// Выводит в лог всю структуру песочницы
void OnStart()
{
  string FileNames[];
  
  const int Amount = GetFileNames(FileNames);
  
  for (int i = 0; i < Amount; i++)
    Print(FileNames[i]);
}
 

Чтобы в одном месте и по теме

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.08.15 17:30

// Перемещение папки. Описание такое же, как у FileMove - https://www.mql5.com/ru/docs/files/filemove
bool FolderMove( const string FolderNameSrc, const string FolderNameDst, const int Common_Flag = 0, const int Mode_Flags = FILE_REWRITE )
{
  if (FolderNameSrc == FolderNameDst)
    return(false);

  string FileName;
  const long handle = ::FileFindFirst(FolderNameSrc + "\\*", FileName, Common_Flag);

  bool Res = false;

  if (handle != INVALID_HANDLE)
  {
    do
    {
      const string TmpFileNameSrc = FolderNameSrc + "\\" + FileName;
      const string TmpFileNameDst = FolderNameDst + "\\" + FileName;

      if (::FileIsExist(TmpFileNameSrc, Common_Flag))
        Res = ::FileMove(TmpFileNameSrc, Common_Flag, TmpFileNameDst, Mode_Flags);
      else
      {
        const string TmpFileNameSrc2 = ::StringSubstr(TmpFileNameSrc, 0, ::StringLen(TmpFileNameSrc) - 1);
        const string TmpFileNameDst2 = ::StringSubstr(TmpFileNameDst, 0, ::StringLen(TmpFileNameDst) - 1);

        if (!FolderMove(TmpFileNameSrc2, TmpFileNameDst2, Common_Flag, Mode_Flags))
          Res = ::FolderCreate(TmpFileNameDst2, Mode_Flags & FILE_COMMON);
      }
    }
    while (::FileFindNext(handle, FileName));

    ::FileFindClose(handle);
  }

  return(::FolderDelete(FolderNameSrc, Common_Flag) && Res);
}
 

В статье опечатка. В описании функции "Чтение файла с разделителями в массив" описание структуры: 

struct SLine{
   string line[];
};

а в должно быть (и в скрипте так):

struct SLine{
   string field[];
};
 
Огромнейшее Вам человеческое СПАСИБО за статью, особенно за  #property tester_file,  без этого ничего бы у меня не получилось и бился бы я головой об стену еще бесконечно долго.
Причина обращения: