Código de error 5004 - página 3

 
RaptorUK:

No había ningún archivo adjunto.

¿Has confirmado que el archivo del que intentas leer existe realmente? Por favor, busca en la carpeta correcta y comprueba... otra cosa, ¿por qué tienes una función llamada filewriting() para LEER de un archivo?


Estimado RaptorUK,

Sí, puedo confirmar que el archivo DAT está en la carpeta MQL4/files. De hecho, he informado que puse una condición si el fileopen tiene éxito y tiene éxito la mayoría de las veces (90%) y el 10% falla al abrir y genera un código de error 5004.

La función filewriting() se llama cuando un fileopen falla. Entonces, la función filewriting intentaría crear un archivo (abrir para escribir) y al final de la función, hacer el fileclose.

He adjuntado el archivo de la sentencia Print() de la carpeta MQL4\logs. He pulsado el botón "Choose File" y he podido comprobar que se muestra el nombre del archivo.

Saludos cordiales,

Raisingfire

Archivos adjuntos:
 
raisingfire:


Estimado RaptorUK,

Sí, puedo confirmar que el archivo DAT está en la carpeta MQL4/archivos. De hecho, he informado que puse una condición si el fileopen tiene éxito y tiene éxito la mayoría de las veces (90%) y el 10% falla al abrir y genera un código de error 5004.

La función filewriting() se llama cuando un fileopen falla. Entonces, la función filewriting intentaría crear un archivo (abrir para escribir) y al final de la función, hacer el fileclose.

He adjuntado el archivo de la sentencia Print() de la carpeta MQL4\logs. He pulsado el botón "Choose File" y he podido comprobar que se muestra el nombre del archivo.

Saludos cordiales,

Raisingfire

¿De dónde vienen estos archivos? ¿Qué los escribe?
 
RaptorUK:
¿De dónde vienen estos archivos? ¿Qué los escribe?

Estimado RaptorUK,

Todos los archivos DAT están destinados a ser archivos temporales para mantener los valores iniciales de ciertos indicadores cada vez que abrimos una posición. Los creamos y utilizamos en nuestros programas.

Utilizamos la función estándar para abrir el archivo para escribir:

fhandle=FileOpen(mf, FILE_BIN|FILE_WRITE);

Escritura de array estándar en los archivos temporales (DAT) :

FileWriteArray(fhandle, mpara, 0, maxori); // donde mpara es el array, Maxori es el tamaño máximo del array

Función estándar de cierre de archivos:

FileClose(fhandle);

Gracias por su ayuda.


Saludos,

Raisingfire

 
raisingfire:

Estimado RaptorUK,

Todos los archivos DAT están destinados a ser archivos temporales para mantener los valores iniciales de ciertos indicadores cada vez que abrimos una posición. Los creamos y utilizamos en nuestros programas.

Usamos la función estándar para abrir el archivo para escribir:

fhandle=FileOpen(mf, FILE_BIN|FILE_WRITE);

Escritura de array estándar en los archivos temporales (DAT) :

FileWriteArray(fhandle, mpara, 0, maxori); // donde mpara es el array, Maxori es el tamaño máximo del array

Función estándar de cierre de archivos:

FileClose(fhandle);


Vale, pero no has respondido a mi pregunta... ¿son escritas por el mismo EA que intenta leerlas? o por un EA, Script o Indicador diferente?
 
RaptorUK:

Vale, pero no has respondido a mi pregunta... ¿son escritas por el mismo EA que intenta leerlas? o por un EA, Script o Indicador diferente?


La función de escritura de archivos está en todos en el mismo EA. Cada vez que emitimos un "FILEOPEN", siempre lo seguimos con un "FILECLOSE" después de hacer cierta tarea con él. Por lo tanto, no creo que haya un problema con el archivo bloqueado que se intenta abrir.

Hace mucho tiempo, tuvimos ese tipo de problema donde un archivo bloqueado estaba siendo tratado de ser leído. Y MT4 automáticamente lo reportó en su archivo de registro. Entonces, después de 1 o 2 días, las carpetas de Logs e historial se volvieron enormes en tamaño (cientos de Mbytes), llenas de esos reportes. Entonces, emitimos un FILECLOSE cada vez que hicimos FILEOPEN. El problema se solucionó y las carpetas de logs e historial no volvieron a ser enormes. Ahora, las carpetas de registro e historial combinadas contienen sólo menos de 100 Kbytes (a pesar del código de error 5004 que sigue apareciendo).


Gracias,

Raisingfire

 
raisingfire:

La función de escritura de archivos está en todos en el mismo EA. Cada vez que emitimos un "FILEOPEN", siempre lo seguimos con "FILECLOSE" después de hacer cierta tarea con él. Por lo tanto, no creo que haya un problema con el archivo bloqueado que se intenta abrir.

Hace mucho tiempo, tuvimos ese tipo de problema en el que se intentaba leer un archivo bloqueado. Y MT4 lo reportaba automáticamente en su archivo de registro. Asi que, despues de 1 o 2 dias, las carpetas de Logs e historiales se volvieron enormes en tamaño (cientos de Mbytes), llenas de esos reportes. Entonces, emitimos un FILECLOSE cada vez que hicimos FILEOPEN. El problema se solucionó y las carpetas de logs e historial no volvieron a ser enormes. Ahora, las carpetas de registro e historial combinadas contienen sólo menos de 100 Kbytes (a pesar del código de error 5004 que sigue apareciendo).

OK gracias por la información. Me he quedado sin ideas... todo lo que puedo sugerir ahora es crear un EA de prueba que reproduzca el problema que puedes publicar aquí y enviar a MetaQuotes como parte de un ticket de Service Desk y pedirles que lo investiguen.
 
RaptorUK:
Bien, gracias por la información. Me he quedado sin ideas... todo lo que puedo sugerir ahora es crear un EA de prueba que reproduzca el problema que puedes publicar aquí y enviar a MetaQuotes como parte de un ticket de Service Desk y pedirles que lo investiguen.


Estimado RaptorUK,


Gracias por toda la ayuda e información de todos modos. Intentaré hacer lo que me has dicho.

Una vez más, gracias.


Saludos,

 
//+------------------------------------------------------------------+
//| 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:

Estimado RaptorUK,


Gracias por toda la ayuda e información de todos modos. Intentaré hacer lo que me has dicho.

Una vez más, gracias.


Saludos,



samoye:

¿Hay alguna solución para el error 5004, por favor? Estoy recibiendo el mismo mensaje de error al intentar escribir en un archivo.

//+------------------------------------------------------------------+
//| 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();
}

Estoy en la versión 765.

Su ayuda es muy 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. Se abre el archivo para escribir, ahora es de longitud cero.
  2. Inicio del bucle
  3. Abre el fichero para leer y escribir. Ahora tiene el archivo abierto dos veces y ha perdido el handle original.
  4. ResetLastError es innecesario, sólo mire a GetLastError, cuando tenga un problema
  5. Abres el fichero tres veces y has perdido dos handles.
  6. En el siguiente bucle abres el archivo más veces.