Discussão do artigo "MQL5 Programações Básicas: Arquivos" - página 2

 
Artyom Trishkin:

Somente na ajuda do mql5 não há nenhuma palavra sobre eles ainda....

Haverá para o 4?

O FileSave já está na ajuda desde o dia 14 do FileSave.

Você pode atualizar manualmente no site

 
Andrey F. Zelinsky:

Um pequeno comentário sobre a compreensibilidade da referência.

A posição da referência não ficou imediatamente clara (há um eufemismo óbvio):

Você deveria ler a ajuda antes de criticar, como de costume. Se o exemplo não ajudar, então qualquer referência é inútil

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);
      //--- se o histórico de ticks estiver sincronizado, o código de erro será zero
      if(!GetLastError()==0)
         PrintFormat("%s: Ticks are not synchronized, error=%d",_Symbol,copied,_LastError);
      //--- gravar os ticks no arquivo
      if(!FileSave(filename,ticks,FILE_COMMON))
         PrintFormat("FileSave() failed, error=%d",GetLastError());
     }
 
Andrey F. Zelinsky:

Se quiser, posso não escrever nada, exceto admiração. Se eu começar a admirar, você dirá que estou sendo sarcástico e assim por diante. Não posso ficar satisfeito.

Se você entende a frase:


Eu entendo

intcommon_flag=0// arquivo por padrão, os arquivos são gravados na pasta <data catalogue>\MQL5\Files\.

 
Artyom Trishkin:

Somente na ajuda do mql5 não há nenhuma palavra sobre eles ainda....

Haverá na versão 4?

Infelizmente, nada estará disponível na quarta versão.
 
Vamos escrever uma função útil para obter uma lista de arquivos e pastas

Infelizmente, a função não fornece uma lista completa (incluindo todas as subpastas e arquivos nelas contidos). É por isso que vou adicioná-la

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

// Retorna a lista de todos os arquivos por filtro
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);
}

O significado do filtro é o mesmo do artigo. Exemplo de aplicativo

// Registra toda a estrutura da sandbox
void OnStart()
{
  string FileNames[];
  
  const int Amount = GetFileNames(FileNames);
  
  for (int i = 0; i < Amount; i++)
    Print(FileNames[i]);
}
 

Em um só lugar e sobre o tópico

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Recursos da linguagem mql5, sutilezas e técnicas de trabalho

fxsaber, 2017.08.15 17:30

// Mover uma pasta. A descrição é a mesma do FileMove - https://www.mql5.com/pt/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);
}
 

este artigo é excelente, muito obrigado pelas informações.

 

Há um erro de digitação no artigo. Na descrição da função "Read a file with delimiters into an array" (Ler um arquivo com delimitadores em uma matriz), a descrição da estrutura:

struct SLine{
   string line[];
};

e em deveria ser (e no script assim):

struct SLine{
   string field[];
};
 

А как можно уменшить размер файла? Примерно имею какой то BIN файл в которой поддерживаю какие то данни, потом делаю дефрагмент файла и наконец хочу умешнит его длина, потому что сзади уже есть лишное пространство. Как етого сделать? Нужна какая та функция типа FileResize(int newSize).

 
Um enorme OBRIGADO pelo artigo, especialmente pelo #property tester_file, sem ele eu não teria conseguido e teria ficado batendo a cabeça na parede por muito tempo.