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-bytes0xff,0xfeé encontrada, o flag de codificação será FILE_UNICODE, mesmo se FILE_ANSI for especificado."
//+------------------------------------------------------------------+//| 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 terminalinputstring InpSymbolName="EURUSD"; // par de moedasinputENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // time frameinputdatetime InpDateStart=D'2013.01.01 00:00'; // data de início da cópia dos dados//--- parâmetros para escrever dados no arquivoinputstring InpFileName="EURUSD.txt"; // nome do arquivoinputstring InpDirectoryName="Data"; // nome do diretório//+------------------------------------------------------------------+//| Estrutura para armazenar dados candlestick |//+------------------------------------------------------------------+struct candlesticks
{
double open; // preço de aberturadouble close; // preço de fechamentodouble high; // preço de máximodouble low; // preço de mínimodatetime date; // data
};
intOnInit()
{
//---//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
{
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 erroResetLastError();
//--- receber o tempo da chegada das barras a partir do intervaloif(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 intervaloif(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 intervaloif(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 intervaloif(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 intervaloif(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 arrayArrayResize(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 bytesuint counter=0;
//--- escrever valores array no loopfor(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 arquivoFileClose(file_handle);
PrintFormat("Os dados são escritos, %s arquivo esta fechado",InpFileName);
}
elsePrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
}
}
//+------------------------------------------------------------------+
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
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,