A criação de um arquivo externo gera caracteres que não entendo.(UNICODE, ANSI).

 

Boa noite,

Estou criando um bot e preciso extrair algumas informações para analise, para tanto estou tentando criar um arquivo do tipo txt, ou csv, ou até bin, qualquer que eu consiga fazer funcionar para receber essas informações;

tudo parece funcionar bem, conforme o informado na documentação, entretanto o arquivo gerado apresenta caracteres que não entendo.

acredito que o erro esteja nas flags do comando FileOpen(), o arquivo gerado me parece estar em unicode, entretanto, mesmo especificando nas flags  FILE_ANSI o problema persiste.

Utilizei então um codigo de exemplo da documentação para testar a situação, e da mesma forma o resultado foi um arquivo ilegível.

na aba sobre "flags de abertura de arquivo " da documentação, há uma ressalva, 

" Se um arquivo é aberto para leitura como um arquivo de texto (FILE_TXT ou FILE_CSV), e no início do arquivo uma indicação de dois-bytes 0xff,0xfe é encontrada, o flag de codificação será FILE_UNICODE, mesmo se FILE_ANSI for especificado."

https://www.mql5.com/pt/docs/constants/io_constants/fileflags

Acredito que esse seja o problema essa "indicação de dois bytes" impede que eu codifique para ANSI, entretanto nao sei como reagir a isso.

aqui abaixo deixo o exemplo que adaptei da documentação que mesmo especificando FILE_ANSI, acredito que ainda me devolve uma escrita em UNICODE.

Referencia do exemplo na documentação:https://www.mql5.com/pt/docs/files/filewritestruct

Agradeço a atenção de todos,


//+------------------------------------------------------------------+
//|                                          Demo_FileWiteStruct.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- mostrar a janela de parâmetros de entrada quando do lançamento do script
#property script_show_inputs
//--- parâmetros para a recepção de dados a partir do terminal
input string          InpSymbolName="EURUSD";           // par de moedas
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1;        // time frame
input datetime        InpDateStart=D'2013.01.01 00:00'; // data de início da cópia dos dados
//--- parâmetros para escrever dados no arquivo
input string          InpFileName="EURUSD.txt";         // nome do arquivo
input string          InpDirectoryName="Data";          // nome do diretório
//+------------------------------------------------------------------+
//| Estrutura para armazenar dados candlestick                       |
//+------------------------------------------------------------------+
struct candlesticks
  {
   double            open;  // preço de abertura
   double            close; // preço de fechamento
   double            high;  // preço de máximo
   double            low;   // preço de mínimo
   datetime          date;  // data
  };
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  {
   datetime     date_finish=TimeCurrent();
   int          size;
   datetime     time_buff[];
   double       open_buff[];
   double       close_buff[];
   double       high_buff[];
   double       low_buff[];
   candlesticks cand_buff[];
//--- redefine o valor de erro
   ResetLastError();
//--- receber o tempo da chegada das barras a partir do intervalo
   if(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,time_buff)==-1)
     {
      PrintFormat("Falha para copiar valores de tempo. Código de erro = %d",GetLastError());
      return;
     }
//--- receber os preços de máximo das barras a partir do intervalo
   if(CopyHigh(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,high_buff)==-1)
     {
      PrintFormat("Falha ao copiar os valores dos preços de máximo. Código de erro = %d",GetLastError());
      return;
     }
//--- receber os preços de mínimo das barras a partir do intervalo
   if(CopyLow(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,low_buff)==-1)
     {
      PrintFormat("Falha ao copiar os valores dos preços de mínimo. Código de erro = %d",GetLastError());
      return;
     }
//--- receber os preços de abertura das barras a partir do intervalo
   if(CopyOpen(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,open_buff)==-1)
     {
      PrintFormat("Falha ao copiar os valores dos preços de abertura. Código de erro = %d",GetLastError());
      return;
     }
//--- receber os preços de fechamento das barras a partir do intervalo
   if(CopyClose(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,close_buff)==-1)
     {
      PrintFormat("Falha ao copiar os valores dos preços de fechamento. Código de erro = %d",GetLastError());
      return;
     }
//--- definir o tamanho de arrays
   size=ArraySize(time_buff);
//--- salvar todos os dados na estrutura array
   ArrayResize(cand_buff,size);
   for(int i=0;i<size;i++)
     {
      cand_buff[i].open=open_buff[i];
      cand_buff[i].close=close_buff[i];
      cand_buff[i].high=high_buff[i];
      cand_buff[i].low=low_buff[i];
      cand_buff[i].date=time_buff[i];
     }
 
//--- abrir o arquivo para escrever a estrutura array para o arquivo (se o arquivo estiver ausente, ele será criado automaticamente)
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN|FILE_COMMON|FILE_ANSI);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("%s arquivo está aberto para escrita",InpFileName);
      PrintFormat("File path: %s\\Files\\",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
      //--- preparar o contador do número de bytes
      uint counter=0;
      //--- escrever valores array no loop
      for(int i=0;i<size;i++)
         counter+=FileWriteStruct(file_handle,cand_buff[i]);
      PrintFormat("%d bytes de informação está escrito para %s arquivo",InpFileName,counter);
      PrintFormat("Número total de bytes: %d * %d * %d = %d, %s",size,5,8,size*5*8,size*5*8==counter ? "Correto" : "Erro");
      //--- fechar o arquivo
      FileClose(file_handle);
      PrintFormat("Os dados são escritos, %s arquivo esta fechado",InpFileName);
     }
   else
      PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
  }
   
  }
//+------------------------------------------------------------------+
Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Constantes de Entrada/Saída / Flags de Abertura de Arquivo
Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Constantes de Entrada/Saída / Flags de Abertura de Arquivo
  • www.mql5.com
Flags de Abertura de Arquivo - Constantes de Entrada/Saída - Constantes, Enumeradores e Estruturas - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
cassiosantos:

FileWriteStruct

The function writes into a bin-file contents of a structure passed as a parameter, starting from the current position of the file pointer.


Portanto, os dados serão binários, não importa o tipo de arquivo.

Por quê você precisa de um Struct?

Razão: