Codice di errore 5004 - pagina 3

 
RaptorUK:

Non c'era nessun file allegato . . .

Hai confermato che il file che stai cercando di leggere esiste davvero? Per favore, guarda nella cartella corretta e controlla... un'altra cosa, perché hai una funzione chiamata filewriting() per LEGGERE da un file?


Caro RaptorUK,

Sì, posso confermare che il file DAT è nella cartella MQL4/files. Infatti, ho informato che ho messo una condizione se il fileopen riesce e riesce la maggior parte delle volte (90%) e il 10% non riesce ad aprire e genera un codice di errore 5004.

La funzione filewriting() viene chiamata quando un fileopen fallisce. Quindi, la funzione filewriting cercherebbe di creare un file (aperto per la scrittura) e alla fine della funzione, fare il fileclose.

Ho allegato il file dell'istruzione Print() dalla cartella MQL4\logs. Ho cliccato sul pulsante "Choose File" e ho potuto vedere che il nome del file è stato visualizzato.

Cordiali saluti,

Raisingfire

File:
 
raisingfire:


Caro RaptorUK,

Sì, posso confermare che il file DAT si trova nella cartella MQL4/files. Infatti, ho informato che ho messo una condizione se l'apertura del file riesce e riesce la maggior parte delle volte (90%) e il 10% non riesce ad aprirsi e genera un codice di errore 5004.

La funzione filewriting() viene chiamata quando un fileopen fallisce. Quindi, la funzione filewriting cercherebbe di creare un file (aperto per la scrittura) e alla fine della funzione, fare il fileclose.

Ho allegato il file dell'istruzione Print() dalla cartella MQL4\logs. Ho cliccato sul pulsante "Choose File" e ho potuto vedere che il nome del file è stato visualizzato.

Cordiali saluti,

Raisingfire

Da dove vengono questi file? Cosa li scrive?
 
RaptorUK:
Da dove vengono questi file? Cosa li scrive?

Caro RaptorUK,

Tutti i file DAT sono da intendersi come file temporanei per tenere i valori iniziali di certi indicatori ogni volta che apriamo una posizione. Li abbiamo creati e utilizzati nei nostri programmi.

Usiamo la funzione standard per aprire il file per la scrittura:

fhandle=FileOpen(mf, FILE_BIN|FILE_WRITE);

Scrittura standard di array nei file temporanei (DAT) :

FileWriteArray(fhandle, mpara, 0, maxori); // dove mpara è l'array, Maxori è la dimensione massima dell'array

Funzione standard di chiusura dei file:

FileClose(fhandle);

Grazie per il vostro aiuto.


Saluti,

Raisingfire

 
raisingfire:

Caro RaptorUK,

Tutti i file DAT sono destinati ad essere un file temporaneo per tenere i valori iniziali di alcuni indicatori ogni volta che apriamo una posizione. Li abbiamo creati e utilizzati nei nostri programmi.

Usiamo la funzione standard per aprire il file per la scrittura:

fhandle=FileOpen(mf, FILE_BIN|FILE_WRITE);

Scrittura standard di array nei file temporanei (DAT) :

FileWriteArray(fhandle, mpara, 0, maxori); // dove mpara è l'array, Maxori è la dimensione massima dell'array

Funzione standard di chiusura dei file:

FileClose(fhandle);


Ok, ma non hai risposto alla mia domanda... sono scritti dallo stesso EA che sta cercando di leggerli o da un altro EA, script o indicatore?
 
RaptorUK:

Ok, ma non hai risposto alla mia domanda... sono scritti dallo stesso EA che sta cercando di leggerli o da un altro EA, script o indicatore?


La funzione di scrittura dei file è presente in tutti gli EA. Ogni volta che emettiamo un "FILEOPEN", lo seguiamo sempre con un "FILECLOSE" dopo aver fatto certi compiti con esso. Quindi, non credo che ci sia un problema con il file bloccato che si cerca di aprire.

Molto tempo fa, abbiamo avuto questo tipo di problema in cui si cercava di leggere un file bloccato. E MT4 lo segnalava automaticamente nel suo file di log. Così, dopo 1 o 2 giorni, le cartelle Logs e history diventavano di dimensioni enormi (centinaia di Mbyte), piene di queste segnalazioni. Poi, abbiamo emesso un FILECLOSE ogni volta che abbiamo fatto FILEOPEN. Il problema è stato risolto e le cartelle dei log e della cronologia non sono più diventate enormi. Ora, le cartelle log e history combinate contengono solo meno di 100 Kbyte (nonostante il codice di errore 5004 che continua a spuntare).


Grazie,

Raisingfire

 
raisingfire:

La funzione di scrittura dei file è in tutto nella stessa EA. Ogni volta che emettiamo un "FILEOPEN", lo seguiamo sempre con "FILECLOSE" dopo aver fatto certi compiti con esso. Quindi, non credo che ci sia un problema con il file bloccato che si cerca di aprire.

Molto tempo fa, abbiamo avuto questo tipo di problema in cui si cercava di leggere un file bloccato. E MT4 lo segnalava automaticamente nel suo file di log. Così, dopo 1 o 2 giorni, le cartelle Logs e history diventavano di dimensioni enormi (centinaia di Mbyte), piene di queste segnalazioni. Poi, abbiamo emesso un FILECLOSE ogni volta che abbiamo fatto FILEOPEN. Il problema è stato risolto e le cartelle dei log e della cronologia non sono più diventate enormi. Ora, le cartelle log e history combinate contengono solo meno di 100 Kbyte (nonostante il codice di errore 5004 che continua a spuntare).

OK grazie per le informazioni. Sono a corto di idee . . . tutto quello che posso suggerire ora è di creare un test EA che riproduca il problema che puoi postare qui e inviare a MetaQuotes come parte di un ticket di Service Desk e chiedere loro di indagare.
 
RaptorUK:
OK grazie per le informazioni. Sono a corto di idee . . . tutto quello che posso suggerire ora è di creare un EA di prova che riproduca il problema che puoi postare qui e inviare a MetaQuotes come parte di un ticket di Service Desk e chiedere loro di indagare.


Caro RaptorUK,


Grazie comunque per tutto l'aiuto e le informazioni. Cercherò di fare quello che mi hai detto.

Ancora una volta, grazie.


Saluti,

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


Grazie comunque per tutto l'aiuto e le informazioni. Proverò a fare quello che mi hai detto.

Ancora una volta, grazie.


Saluti,



samoye:

C'è una soluzione all'errore 5004 per favore? Sto ricevendo lo stesso messaggio di errore cercando di scrivere su un file.

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

Sono sulla build 765.

Il tuo aiuto è molto apprezzato.

 
   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. Si apre il file per la scrittura, ora è di lunghezza zero.
  2. Iniziare il ciclo
  3. Aprite il file per leggere e scrivere. Ora avete il file aperto due volte e avete perso l'handle originale.
  4. ResetLastError inutile, guardate solo GetLastError, quando avete un problema
  5. Avete aperto il file tre volte e avete perso due handle.
  6. Nel prossimo ciclo aprite il file più volte.
Motivazione: