Código de erro 5004 - página 3

 
RaptorUK:

Não havia nenhum arquivo anexado . . .

Você já confirmou que o arquivo do qual você está tentando ler existe de fato ? por favor olhe na pasta correta e verifique . . . uma outra coisa, porque você tem uma função chamada filewriting() para READ de um arquivo ?


Caro RaptorUK,

Sim, eu posso confirmar que o arquivo DAT está na pasta MQL4/files. De fato, informei que coloquei uma condição se o arquivo aberto é bem sucedido e na maioria das vezes (90%) e 10% falha em abrir e gerar um código de erro 5004.

A função filewriting() é chamada quando um fileopen falha. Então, a função filewriting() tenta criar um arquivo (aberto para escrita) e, ao final da função, faz o fechamento do arquivo.

Anexei o arquivo da declaração Print() da pasta MQL4\logs. Cliquei no botão "Choose File" e pude ver que o nome do arquivo era exibido.

Saudações cordiais,

Raisingfire

Arquivos anexados:
 
raisingfire:


Caro RaptorUK,

Sim, eu posso confirmar que o arquivo DAT está na pasta MQL4/files. De fato, informei que coloquei uma condição para que o arquivo aberto seja bem sucedido e na maioria das vezes (90%) e 10% não consegue abrir e gerar um código de erro 5004.

A função filewriting() é chamada quando um fileopen falha. Então, a função filewriting() tenta criar um arquivo (aberto para escrita) e, ao final da função, faz o fechamento do arquivo.

Anexei o arquivo da declaração Print() da pasta MQL4\logs. Cliquei no botão "Choose File" e pude ver que o nome do arquivo era exibido.

Saudações cordiais,

Raisingfire

De onde vêm estes arquivos ? o que os escreve ?
 
RaptorUK:
De onde vêm estes arquivos ? o que os escreve ?

Caro RaptorUK,

Todos os arquivos DAT devem ser um arquivo temporário para manter os valores iniciais de certos indicadores toda vez que abrimos uma posição. Nós os criamos e usamos em nossos programas.

Usamos a função padrão para abrir o arquivo para escrita:

fhandle=FileOpen(mf, FILE_BIN|FILE_WRITE);

Gravação de matriz padrão para os arquivos temporários (DAT) :

FileWriteArray(fhandle, mpara, 0, maxori); // onde mpara é o array, Maxori é o tamanho máximo do array

Função de fechamento de arquivo padrão:

FileClose(fhandle);

Obrigado por sua ajuda.


Cumprimentos,

Raisingfire

 
raisingfire:

Caro RaptorUK,

Todos os arquivos DAT devem ser um arquivo temporário para manter os valores iniciais de certos indicadores toda vez que abrimos uma posição. Nós os criamos e usamos em nossos programas.

Usamos a função padrão para abrir o arquivo para escrita:

fhandle=FileOpen(mf, FILE_BIN|FILE_WRITE);

Gravação de array padrão para os arquivos temporários (DAT) :

FileWriteArray(fhandle, mpara, 0, maxori); // onde mpara é o array, Maxori é o tamanho máximo do array

Função de fechamento de arquivo padrão:

FileClose(fhandle);


OK, mas você não respondeu à minha pergunta . . . eles são escritos pela mesma EA que está tentando lê-los ? ou por uma EA, Roteiro ou Indicador diferente ?
 
RaptorUK:

OK, mas você não respondeu à minha pergunta . . . eles são escritos pela mesma EA que está tentando lê-los ? ou por uma EA, Roteiro ou Indicador diferente ?


A função de redação de arquivos está em todas na mesma EA. Toda vez que emitimos um "FILEOPEN", sempre o seguimos por "FILECLOSE" depois de fazermos determinada tarefa com ele. Portanto, não creio que haja um problema com o arquivo trancado que está sendo tentado para ser aberto.

Há muito tempo atrás, tivemos esse tipo de problema onde um arquivo trancado estava sendo tentado para ser lido. E o MT4 o relatou automaticamente em seu arquivo de registro. Assim, após 1 ou 2 dias, os logs e pastas de histórico se tornaram enormes em tamanho (centenas de Mbytes), cheios desses relatórios. Em seguida, emitimos um FILECLOSE toda vez que fazemos o FILEOPEN. O problema foi resolvido e os logs e as pastas de histórico nunca mais se tornaram enormes. Agora, os logs e as pastas de histórico combinados contêm apenas menos de 100 Kbytes (apesar do código de erro 5004 que continua aparecendo).


Obrigado,

Raisingfire

 
raisingfire:

A função de escrita de arquivos está em todas na mesma EA. Toda vez que emitimos um "FILEOPEN", sempre o seguimos por "FILECLOSE" depois de fazermos determinada tarefa com ele. Portanto, não creio que haja um problema com o arquivo trancado que está sendo tentado para ser aberto.

Há muito tempo atrás, tivemos esse tipo de problema onde um arquivo trancado estava sendo tentado para ser lido. E o MT4 o relatou automaticamente em seu arquivo de registro. Assim, após 1 ou 2 dias, os logs e pastas de histórico se tornaram enormes em tamanho (centenas de Mbytes), cheios desses relatórios. Em seguida, emitimos um FILECLOSE toda vez que fazemos o FILEOPEN. O problema foi resolvido e os logs e as pastas de histórico nunca mais se tornaram enormes. Agora, os logs e as pastas de histórico combinados contêm apenas menos de 100 Kbytes (apesar do código de erro 5004 que continua aparecendo).

OK, obrigado pela informação. Estou sem idéias . . . tudo que posso sugerir agora é criar um teste EA que reproduza o assunto que você pode postar aqui e enviar para MetaQuotes como parte de um ticket do Service Desk e pedir-lhes para investigar.
 
RaptorUK:
OK, obrigado pela informação. Estou sem idéias . . . tudo que posso sugerir agora é criar um teste EA que reproduza o assunto que você pode postar aqui e enviar para MetaQuotes como parte de um ticket do Service Desk e pedir-lhes para investigar.


Caro RaptorUK,


Obrigado por toda a sua ajuda e informações de qualquer forma. Vou tentar fazer o que você me disse.

Mais uma vez, obrigado.


Cumprimentos,

 
//+------------------------------------------------------------------+
//| expert count strategy open position function  (closedPos)          |
//+------------------------------------------------------------------+
void closedPos() {  

   int file=FileOpen("hist0935.csv",FILE_WRITE|FILE_CSV);
   
  
      
for(int i=OrdersHistoryTotal()-1; i>=0; i--) {

int file=FileOpen("hist0935.csv",FILE_READ|FILE_WRITE|FILE_CSV);

ResetLastError();
file=FileOpen("hist0935.csv",FILE_READ|FILE_WRITE|FILE_CSV);


      OrderSelect(i, SELECT_BY_POS, MODE_HISTORY); 

  if (file != INVALID_HANDLE){    

   PrintFormat("%s file is available for writing",file);
  
  
     
      FileWrite(file,OrderTicket(),OrderClosePrice(),OrderCloseTime());
      
      //--- close the file
     Print("error="+GetLastError());
      FileClose(file);
      PrintFormat("%s file is closed",file);
       
  }else{
      Alert("hist0935 Events File Error.",GetLastError());
   }
  
   }        
 // return();
}
 
raisingfire:

Caro RaptorUK,


Obrigado por toda a sua ajuda e informações de qualquer forma. Vou tentar fazer o que você me disse.

Mais uma vez, obrigado.


Cumprimentos,



samoye:

Existe uma solução para o erro 5004, por favor? Estou recebendo a mesma mensagem de erro ao tentar escrever em um arquivo.

//+------------------------------------------------------------------+
//| expert count strategy open position function  (openPos)          |
//+------------------------------------------------------------------+
void closedPos() {  

   int file=FileOpen("hist0935.csv",FILE_WRITE|FILE_CSV);
   
  
      
for(int i=OrdersHistoryTotal()-1; i>=0; i--) {

int file=FileOpen("hist0935.csv",FILE_READ|FILE_WRITE|FILE_CSV);

ResetLastError();
file=FileOpen("hist0935.csv",FILE_READ|FILE_WRITE|FILE_CSV);


      OrderSelect(i, SELECT_BY_POS, MODE_HISTORY); 
//Print("OrderClosePrice()= " +OrderClosePrice()+"OrderCloseTime()= " + OrderCloseTime()+"OrderComment()= " + OrderComment()+ "OrderCommission()= " +OrderCommission()+ "OrderExpiration()= " +OrderExpiration()+ "OrderLots()= " +OrderLots()+ "OrderMagicNumber()= " +OrderMagicNumber()+ "OrderOpenPrice()= " +OrderOpenPrice()+ "OrderOpenTime()= " +OrderOpenTime()+ "OrderProfit()= " +OrderProfit()+ "OrderStopLoss()= " +OrderStopLoss()+ "OrderSwap()= " +OrderSwap()+ "OrderSymbol()= " +OrderSymbol()+ "OrderTakeProfit()= " +OrderTakeProfit()+ "OrderTicket()= " +OrderTicket()+ "OrderType()= " +OrderType() ); 
 

  if (file != INVALID_HANDLE){    

   PrintFormat("%s file is available for writing",file);
  
   
      //FileWrite(file,OrderClosePrice(),OrderCloseTime(), OrderComment(),OrderCommission(),OrderExpiration(),OrderLots(),OrderMagicNumber(),OrderOpenPrice(),OrderOpenTime(),OrderProfit(),OrderStopLoss(),OrderSwap(),OrderSymbol(),OrderTakeProfit(),OrderTicket(),OrderType());
     
      FileWrite(file,OrderTicket(),OrderClosePrice(),OrderCloseTime());
      
      //--- close the file
     Print("error="+GetLastError());
      FileClose(file);
      PrintFormat("%s file is closed",file);
       
  }else{
      Alert("hist0935 Events File Error.",GetLastError());
   }
  
   }        
 // return();
}

Estou no build 765.

Sua ajuda é muito apreciada.

 
   int file=FileOpen("hist0935.csv",FILE_WRITE|FILE_CSV);  
      
for(int i=OrdersHistoryTotal()-1; i>=0; i--) {

int file=FileOpen("hist0935.csv",FILE_READ|FILE_WRITE|FILE_CSV);
                                                                
ResetLastError();                                               
file=FileOpen("hist0935.csv",FILE_READ|FILE_WRITE|FILE_CSV);    

  1. Você abre o arquivo para escrita, agora o comprimento é zero.
  2. Iniciar o loop
  3. Você abre o arquivo para leitura e escrita. Agora você tem o arquivo aberto duas vezes e perdeu o cabo original.
  4. ResetLastError desnecessário, basta olhar para GetLastError, quando você tiver um problema
  5. Você abre o arquivo três vezes e perdeu duas alças.
  6. Na próxima etapa, você abre o arquivo mais vezes.
Razão: