DatabaseExport

Exporta un recuadro o el resultado de la ejecución de una solicitud SQL a un archivo CSV. El archivo se crea en la codificación UTF-8.

long  DatabaseExport(
   int           database,           // manejador de base de datos recibido en DatabaseOpen
   const string  table_or_sql,       // nombre del recuadro o solicitud SQL
   const string  filename,           // nombre del archivo CSV para exportar los datos
   uint          flags,              // combinación de banderas
   const string  separator           // separador de datos en el archivo CSV
   );

Parámetros

database

[in]  Manejador de base de datos recibido en DatabaseOpen().

table_or_sql

[in]  Nombre del recuadro o solicitud SQL cuyos resultados serán exportados al archivo indicado.

filename

[in]  Nombre del archivo para exportar los datos. La ruta se establece con respecto a la carpeta MQL5\Files.

flags

[in]  Combinación de banderas de la enumeración ENUM_DATABASE_EXPORT_FLAGS.

separator

[in]  Separador de datos. Si se indica NULL, se usará como separador el símbolo de tabulación '\t'.  La línea vacía "" se considera un separador permitido, pero el archivo CSV obtenido no puede ser leído como recuadro, se tratará de un conjunto de líneas.

 

Valor retornado

Retorna el número de entradas exportadas o un valor negativo en caso de error. Para obtener el código del error, use GetLastError(), posibles respuestas:

  • ERR_INTERNAL_ERROR (4001)                       — error crítico del sistema de ejecución;
  • ERR_INVALID_PARAMETER (4003)                  — la ruta al archivo de la base de datos contiene una línea vacía o se ha establecido una combinación de banderas incompatible;
  • ERR_NOT_ENOUGH_MEMORY (4004)              - memoria insuficiente;
  • ERR_FUNCTION_NOT_ALLOWED(4014)           — el pipe indicado no está permitido;
  • ERR_PROGRAM_STOPPED(4022)                    — la operación ha sido cancelada (el programa MQL se ha detenido);
  • ERR_WRONG_FILENAME (5002)                     - nombre de archivo incorrecto;
  • ERR_TOO_LONG_FILENAME (5003)                 - la ruta absoluta al archivo ha superado la longitud máxima;
  • ERR_CANNOT_OPEN_FILE(5004)                    — error de apertura del archivo para el registro;
  • ERR_FILE_WRITEERROR(5026)                      — error de escritura en el archivo;
  • ERR_DATABASE_INTERNAL (5120)                 — error interno en la base de datos;
  • ERR_DATABASE_INVALID_HANDLE (5121)      - manejador no válido de la base de datos;
  • ERR_DATABASE_QUERY_PREPARE(5125)        — error al crear la solicitud;
  • ERR_DATABASE_QUERY_NOT_READONLY       — se permite solo la solicitud de lectura.

 

Observación

Si se exportan los resultados de una solicitud, la solicitud SQL deberá comenzar con "SELECT" o "select". En otras palabras, una solicitud SQL no puede modificar la base de datos, en caso contrario, DatabaseExport() se finalizará con error.

Los valores de línea en la base de datos pueden contener el símbolo de conversión ('\r' o '\r\n' ), así como el símbolo de separación de valores establecido en el parámetro separator. En este caso, deberemos usar obligatoriamente la bandera DATABASE_EXPORT_QUOTED_STRINGS en el parámetro flags. Si se da esta bandera, todas las líneas mostradas finalizarán en comillas dobles, y si en una línea se contienen comillas dobles, serán sustituidas por dos comillas dobles.

ENUM_DATABASE_EXPORT_FLAGS

Identificador

Descripción

DATABASE_EXPORT_HEADER

Mostrar los nombres de los campos en la primera línea

DATABASE_EXPORT_INDEX

Mostrar los números de las líneas

DATABASE_EXPORT_NO_BOM

No incorporar la etiqueta BOM al inicio del archivo (por defecto, BOM se incorpora)

DATABASE_EXPORT_CRLF

Para trasladar una línea, se utiliza CRLF (por defecto, LF)

DATABASE_EXPORT_APPEND

Añadir datos al final de un archivo existente (por defecto, el archivo se reescribe). Si el archivo no existe, será creado.

DATABASE_EXPORT_QUOTED_STRINGS

Mostrar los valores de línea entre comillas dobles.

DATABASE_EXPORT_COMMON_FOLDER

El archivo CSV se creará en la carpeta general de todos los terminales de cliente \Terminal\Common\File.

 

Ejemplo:

input int InpRates=100;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  MqlRates rates[];
//--- registrando la hora de inicio antes de recibir las barras
  ulong start=GetMicrosecondCount();
//--- solicitando las últimas 100 barras en el marco temporal H1
  if(CopyRates(Symbol(), PERIOD_H11InpRatesrates)<InpRates)
   {
    Print("CopyRates() failed,, Error "GetLastError());
    return;
   }
  else
   {
    //--- cuántas barras y en qué tiempo las hemos obtenido
    PrintFormat("%s: CopyRates received %d bars in %d ms ",
                _SymbolArraySize(rates), (GetMicrosecondCount()-start)/1000);
   }
//--- comparando el nombre del archivo para guardar la base de datos
  string filename=_Symbol+"_"+EnumToString(PERIOD_H1)+"_"+TimeToString(TimeCurrent())+".sqlite";
  StringReplace(filename":""-"); // el símbolo ":" está prohibido en los nombres de los archivos
//--- abrimos/creamos la base de datos en la carpeta general de los terminales
  int db=DatabaseOpen(filenameDATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE | DATABASE_OPEN_COMMON);
  if(db==INVALID_HANDLE)
   {
    Print("Database: "filename" open failed with code "GetLastError());
    return;
   }
  else
    Print("Database: "filename" opened successfully");
 
//--- comprobamos la presencia del recuadro RATES
  if(DatabaseTableExists(db"RATES"))
   {
    //--- eliminamos el recuadro RATES
    if(!DatabaseExecute(db"DROP TABLE IF EXISTS RATES"))
     {
      Print("Failed to drop the RATES table with code "GetLastError());
      DatabaseClose(db);
      return;
     }
   }
//--- creamos el recuadro RATES
  if(!DatabaseExecute(db"CREATE TABLE RATES("
                      "SYMBOL             CHAR(10),"
                      "TIME               INT NOT NULL,"
                      "OPEN               REAL,"
                      "HIGH               REAL,"
                      "LOW                REAL,"
                      "CLOSE              REAL,"
                      "TICK_VOLUME        INT,"
                      "SPREAD             INT,"
                      "REAL_VOLUME        INT);"))
   {
    Print("DB: "filename" create table RATES with code "GetLastError());
    DatabaseClose(db);
    return;
   }
//--- mostrando la lista de todos los campos en el recuadro RATES
  if(DatabasePrint(db"PRAGMA TABLE_INFO(RATES)"0)<0)
   {
    PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(RATES)\") failed, error code=%d at line %d"GetLastError(), __LINE__);
    DatabaseClose(db);
    return;
   }
//--- creando una solicitud parametrizada de adición de barras al recuadro RATES
  string sql="INSERT INTO RATES (SYMBOL,TIME,OPEN,HIGH,LOW,CLOSE,TICK_VOLUME,SPREAD,REAL_VOLUME)"
             " VALUES (?1,?2,?3,?4,?5,?6,?7,?8,?9)"// parámetros de la solicitud
  int request=DatabasePrepare(dbsql);
  if(request==INVALID_HANDLE)
   {
    PrintFormat("DatabasePrepare() failed with code=%d"GetLastError());
    Print("SQL request: "sql);
    DatabaseClose(db);
    return;
   }
//--- estableciendo el valor del primer parámetro de la solicitud
  DatabaseBind(request0_Symbol);
//--- rellenando la hora de comienzo antes de añadir las barras al recuadro RATES
  start=GetMicrosecondCount();
  DatabaseTransactionBegin(db);
  int total=ArraySize(rates);
  bool request_error=false;
  for(int i=0i<totali++)
   {
    //--- estableciendo los valores del resto de parámetros antes de añadir la entrada
    ResetLastError();
    if(!DatabaseBind(request1rates[i].time))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    //--- si la anterior llamada de DatabaseBind() ha tenido éxito, establecemos el siguiente parámetro
    if(!request_error && !DatabaseBind(request2rates[i].open))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request3rates[i].high))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request4rates[i].low))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request5rates[i].close))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request6rates[i].tick_volume))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request7rates[i].spread))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request8rates[i].real_volume))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
 
    //--- ejecutando la solicitud de inserción de una entrada y comprobando si es errónea
    if(!request_error && !DatabaseRead(request) && (GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
     {
      PrintFormat("DatabaseRead() failed with code=%d"GetLastError());
      DatabaseFinalize(request);
      request_error=true;
      break;
     }
    //--- reseteando la solicitud a su estado inicial antes de la siguiente actualización de parámetros
    if(!request_error && !DatabaseBind(request))
     {
      PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
      DatabaseFinalize(request);
      request_error=true;
      break;
     }
   } //--- ya hemos finalizado, se ha pasado por todas las barras
 
//--- ¿cómo han salido las transacciones?
  if(request_error)
   {
    PrintFormat("Table RATES: failed to add %d bars "ArraySize(rates));
    DatabaseTransactionRollback(db);
    DatabaseClose(db);
    return;
   }
  else
   {
    DatabaseTransactionCommit(db);
    PrintFormat("Table RATES: added %d bars in %d ms",
                ArraySize(rates), (GetMicrosecondCount()-start)/1000);
   }
//--- guardando el recuadro RATES en un archivo CSV
  string csv_filename=Symbol()+".csv";
  long saved=DatabaseExport(db"SELECT * FROM RATES"csv_filenameDATABASE_EXPORT_HEADER|DATABASE_EXPORT_INDEX|DATABASE_EXPORT_COMMON_FOLDER";");
  if(saved>0)
    Print("Table RATES saved in "Symbol(), ".csv");
  else
    Print("DatabaseExport() failed. Error "GetLastError());
//--- cerramos el archivo con la base de datos y comunicamos este hecho
  DatabaseClose(db);
  PrintFormat("Database: %s created and closed"filename);

Ver también

DatabasePrint, DatabaseImport