DatabaseExport

테이블 또는 SQL 요청 실행 결과를 CSV 파일로 내보내기. 파일은 UTF-8 인코딩으로 생성됩니다.

long  DatabaseExport(
   int           database,           // DatabaseOpen에서 수신된 데이터베이스 핸들
   const string  table_or_sql,       // 테이블 이름 또는 SQL 요청
   const string  filename,           // 데이터 내보내기를 위한 CSV 파일 이름
   uint          flags,              // 플래그의 조합
   const string  separator           // CSV 파일의 데이터 분리자
   );

매개변수

database

[in] DatabaseOpen()로 수신된 데이터베이스 핸들.

table_or_sql

[in]   지정된 파일로 결과를 내보낼 테이블 또는 SQL 요청 텍스트의 이름.

filename

[in]  데이터 내보내기의 파일 이름. 경로는MQL5\Files 폴더를 기준으로 설정됩니다.

flags

[in]  플래그의 조합 ENUM_DATABASE_EXPORT_FLAGS 열거형에서.

separator

[in]  데이터 분리자. NULL을 지정한 경우 '\t' 표 문자를 분리자로 사용. 빈 문자열 "" 은 유효한 분리자로 간주되지만, 가져온 CSV 파일은 테이블로 읽을 수 없으며, 문자열 집합으로 간주됩니다.

 

반환 값

오류가 발생할 경우 내보낸 항목 수 또는 음수 값을 반환합니다. 오류 코드를 가져오려면 GetLastError()를 사용해야 하며, 가능한 응답은 다음과 같습니다:

  • ERR_INTERNAL_ERROR (4001)                       – 심각한 런타임 오류;
  • ERR_INVALID_PARAMETER (4003)                  – 데이터베이스 파일의 경로에 빈 문자열이 포함되어 있거나 호환되지 않는 플래그 조합이 설정;
  • ERR_NOT_ENOUGH_MEMORY (4004)              - 충분하지 않은 메모리;
  • ERR_FUNCTION_NOT_ALLOWED(4014)           – 지정된 파이프는 허용되지 않음;
  • ERR_PROGRAM_STOPPED(4022)                    – 작업이 취소됨 (MQL 프로그램 중지됨);
  • ERR_WRONG_FILENAME (5002)                     - 유효하지 않은 파일 이름;
  • ERR_TOO_LONG_FILENAME (5003)                 - 파일의 절대 경로가 최대 길이를 초과;
  • ERR_CANNOT_OPEN_FILE(5004)                    – 파일을 쓰기 위해 열 수 없음;
  • ERR_FILE_WRITEERROR(5026)                      – 파일에 쓰기할 수 없음;
  • ERR_DATABASE_INTERNAL (5120)                 – 내부 데이터베이스 오류;
  • ERR_DATABASE_INVALID_HANDLE (5121)      - 유효하지 않은 데이터베이스 핸들;
  • ERR_DATABASE_QUERY_PREPARE(5125)        – 생성 오류 요청;
  • ERR_DATABASE_QUERY_NOT_READONLY       – 읽기 전용 요청이 허용됨.

 

참고

요청 결과를 내보내는 경우 SQL 요청은 "SELECT" 또는 "select"로 시작해야 합니다. 즉, SQL 요청에서 데이터 베이스 상태를 변경할 수 없으며, 그렇지 않으면 DatabaseExport()가 실패하고 오류가 발생합니다.

데이터베이스 문자열 값에는 변환 문자 ('\r' 또는 '\r\n' )와 구분 기호 매개변수에 설정된 값 분리자가 포함될 수 있습니다. 이 경우 'flags' 매개변수에서 DATABASE_EXPORT_QUOTED_STRINGS 플래그를 사용해야 합니다. 이 플래그가 있으면 포시되는 모든 문자열이 double 시세로 묶입니다. 문자열에 double 시세가 포함된 경우, 두 double 시세로 교체됩니다.

ENUM_DATABASE_EXPORT_FLAGS

ID

설명

DATABASE_EXPORT_HEADER

첫 번째 문자열에 필드 이름 표시

DATABASE_EXPORT_INDEX

문자열 인덱스 표시

DATABASE_EXPORT_NO_BOM

파일 시작 부분에 BOM 마크를 삽입하지 마십시오(BOM은 기본적으로 삽입됩니다)

DATABASE_EXPORT_CRLF

문자열 나누기에 CRLF 사용(기본값은 LF)

DATABASE_EXPORT_APPEND

기존의 파일 끝에 데이터를 추가합니다(기본적으로 파일을 덮어씁니다). 파일이 없으면 생성됩니다.

DATABASE_EXPORT_QUOTED_STRINGS

큰따옴표로 묶인 문자열 값을 표시합니다.

DATABASE_EXPORT_COMMON_FOLDER

모든 클라이언트 터미널의 \Terminal\Common\File의 공통 폴더에 CSV 파일이 생성됩니다.

 

예:

input int InpRates=100;
/+------------------------------------------------------------------+
//| 프로그램 시작 함수 스크립트                                        |
/+------------------------------------------------------------------+
void OnStart()
 {
  MqlRates rates[];
//--- 바를 받기 전에 시작 시간을 기억
  ulong start=GetMicrosecondCount();
//--- 1시간 주기에서 최근 100개의 바를 요청
  if(CopyRates(Symbol(), PERIOD_H11InpRatesrates)<InpRates)
   {
    Print("CopyRates() failed,, Error "GetLastError());
    return;
   }
  else
   {
 //--- 수신된 바의 수와 수신하는 데 걸린 시간
    PrintFormat("%s: CopyRates received %d bars in %d ms ",
                _SymbolArraySize(rates), (GetMicrosecondCount()-start)/1000);
   }
//--- 데이터 베이스를 저장하기 위해 파일명 설정
  string filename=_Symbol+"_"+EnumToString(PERIOD_H1)+"_"+TimeToString(TimeCurrent())+".sqlite";
  StringReplace(filename":""-"); // ":" character is not allowed in file names
//--- 공통 터미널 폴더에서 데이터베이스 열기/생성
  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");
 
//--- RATES 테이블이 존재하는지 확인
  if(DatabaseTableExists(db"RATES"))
   {
    //--- RATES 테이블 제거
    if(!DatabaseExecute(db"DROP TABLE IF EXISTS RATES"))
     {
      Print("Failed to drop the RATES table with code "GetLastError());
      DatabaseClose(db);
      return;
     }
   }
//--- 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;
   }
//--- 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;
   }
//--- 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)"// 매개변수 요청
  int request=DatabasePrepare(dbsql);
  if(request==INVALID_HANDLE)
   {
    PrintFormat("DatabasePrepare() failed with code=%d"GetLastError());
    Print("SQL request: "sql);
    DatabaseClose(db);
    return;
   }
//--- 첫 번째 요청 매개변수의 값을 설정
  DatabaseBind(request0_Symbol);
//--- RATES 테이블에 막대를 추가하기 전에 시작 시간을 기억하세요
  start=GetMicrosecondCount();
  DatabaseTransactionBegin(db);
  int total=ArraySize(rates);
  bool request_error=false;
  for(int i=0i<totali++)
   {
 //--- 항목을 추가하기 전에 나머지 매개변수의 값을 설정
    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;
     }
 //--- 이전 DatabaseBind() 호출이 성공한 경우 다음 매개변수를 설정
    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;
     }
 
 //--- 항목 삽입 요청을 실행하고 오류를 확인
    if(!request_error && !DatabaseRead(request) && (GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
     {
      PrintFormat("DatabaseRead() failed with code=%d"GetLastError());
      DatabaseFinalize(request);
      request_error=true;
      break;
     }
 //--- 다음 매개변수 업데이트 전에 요청 재설정
    if(!request_error && !DatabaseReset(request))
     {
      PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
      DatabaseFinalize(request);
      request_error=true;
      break;
     }
 } //--- 모든 바를 통과
 
//--- 트랜잭션 상태
  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);
   }
//--- RATES 테이블을 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());
//--- 데이터 베이스 파일을 닫고 알리기
  DatabaseClose(db);
  PrintFormat("Database: %s created and closed"filename);

추가 참조

DatabasePrint, DatabaseImport