Discusión sobre el artículo "Principios de programación en MQL5: Archivos" - página 2

 
Artyom Trishkin:

Sólo en la ayuda mql5 no hay ninguna palabra sobre ellos todavía....

¿Lo habrá para el 4?

En la ayuda ya aparece desde el día 14 de FileSave.

Se puede actualizar manualmente desde el sitio

 
Andrey F. Zelinsky:

Un pequeño comentario sobre la comprensibilidad de la referencia.

La posición de la referencia no estaba inmediatamente clara (hay un eufemismo evidente):

Deberías leer la ayuda antes de criticar, como de costumbre. Si el ejemplo no ayuda, entonces cualquier referencia es impotente

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);
      //--- si el historial de ticks está sincronizado, el código de error es cero
      if(!GetLastError()==0)
         PrintFormat("%s: Ticks are not synchronized, error=%d",_Symbol,copied,_LastError);
      //--- escribe los ticks en el fichero
      if(!FileSave(filename,ticks,FILE_COMMON))
         PrintFormat("FileSave() failed, error=%d",GetLastError());
     }
 
Andrey F. Zelinsky:

Si quieres, no puedo escribir nada, excepto admiración. Si empiezo a admirar, dirás que estoy siendo sarcástico y así sucesivamente. No puedo estar complacido.

Si entiendes la frase:


Entiendo

intcommon_flag=0// ficheroflag, por defecto los archivos se escriben en la carpeta <catálogo de datos>\MQL5\Files\.

 
Artyom Trishkin:

Sólo en la ayuda mql5 no hay ninguna palabra sobre ellos todavía....

¿Las habrá para la 4?

Lamentablemente, no habrá nada disponible en la cuarta versión.
 
Escribamos una función útil para obtener una lista de archivos y carpetas

Desafortunadamente, la función no proporciona una lista completa (incluyendo todas las subcarpetas y archivos en ellas). Por eso la añadiré

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

// Devuelve la lista de todos los ficheros 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);
}

El significado del filtro es el mismo que en el artículo. Ejemplo de aplicación

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

A un solo lugar y sobre el tema

Foro sobre negociación, sistemas automatizados de negociación y prueba de estrategias de negociación

Características del lenguaje mql5, sutilezas y técnicas de trabajo

fxsaber, 2017.08.15 17:30

// Mover una carpeta. La descripción es la misma que FileMove - https://www.mql5.com/es/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 articulo es genial, muchas gracias por la informacion.

 

Hay un error tipográfico en el artículo. En la descripción de la función "Leer un archivo con delimitadores en una matriz" la descripción de la estructura:

struct SLine{
   string line[];
};

y en debería ser (y en el script así):

struct SLine{
   string field[];
};
 

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

 
Un enorme GRACIAS humano por el artículo, especialmente por #property tester_file, sin él no lo habría conseguido y me habría estado dando cabezazos contra la pared durante mucho tiempo.