Code d'erreur 5004 - page 3

 
RaptorUK:

Il n'y avait pas de fichier attaché...

Avez-vous confirmé que le fichier que vous essayez de lire existe bien ? Regardez dans le bon dossier et vérifiez... Autre chose, pourquoi avez-vous une fonction appelée filewriting() pour lire un fichier ?


Cher RaptorUK,

Oui, je peux confirmer que le fichier DAT se trouve dans le dossier MQL4/files. En fait, j'ai informé que j'ai mis une condition pour que l'ouverture du fichier réussisse et qu'elle réussisse la plupart du temps (90%) et que 10% ne réussissent pas à s'ouvrir et génèrent un code d'erreur 5004.

La fonction filewriting() est appelée lorsqu'un fileopen échoue. Ensuite, la fonction filewriting essaie de créer un fichier (ouvert pour l'écriture) et à la fin de la fonction, fait le fileclose.

J'ai joint le fichier de l'instruction Print() du dossier MQL4\logs. J'ai cliqué sur le bouton "Choose File" et j'ai pu constater que le nom du fichier était affiché.

Chaleureuses salutations,

Raisingfire

Dossiers :
 
raisingfire:


Cher RaptorUK,

Oui, je peux confirmer que le fichier DAT se trouve dans le dossier MQL4/files. En fait, j'ai informé que j'ai mis une condition si le fileopen réussit et il réussit la plupart du temps (90%) et 10% échoue à ouvrir et génère un code d'erreur 5004.

La fonction filewriting() est appelée lorsqu'un fileopen échoue. Ensuite, la fonction filewriting essaie de créer un fichier (ouvert pour l'écriture) et à la fin de la fonction, fait le fileclose.

J'ai joint le fichier de l'instruction Print() du dossier MQL4\logs. J'ai cliqué sur le bouton "Choose File" et j'ai pu constater que le nom du fichier était affiché.

Salutations chaleureuses,

Raisingfire

D'où viennent ces fichiers ? Qu'est-ce qui les écrit ?
 
RaptorUK:
D'où viennent ces fichiers ? Qu'est-ce qui les écrit ?

Cher RaptorUK,

Tous les fichiers DAT sont censés être des fichiers temporaires pour contenir les valeurs initiales de certains indicateurs chaque fois que nous ouvrons une position. Nous les avons créés et utilisés dans nos programmes.

Nous utilisons la fonction standard pour ouvrir le fichier pour l'écriture :

fhandle=FileOpen(mf, FILE_BIN|FILE_WRITE) ;

Écriture du tableau standard dans les fichiers temporaires (DAT) :

FileWriteArray(fhandle, mpara, 0, maxori) ; // où mpara est le tableau, Maxori est la taille maximale du tableau.

Fonction standard de fermeture de fichier :

FileClose(fhandle) ;

Merci pour votre aide.


Salutations,

Raisingfire

 
raisingfire:

Cher RaptorUK,

Tous les fichiers DAT sont censés être des fichiers temporaires pour contenir les valeurs initiales de certains indicateurs chaque fois que nous ouvrons une position. Nous les avons créés et utilisés dans nos programmes.

Nous utilisons la fonction standard pour ouvrir le fichier pour l'écriture :

fhandle=FileOpen(mf, FILE_BIN|FILE_WRITE) ;

Écriture du tableau standard dans les fichiers temporaires (DAT) :

FileWriteArray(fhandle, mpara, 0, maxori) ; // où mpara est le tableau, Maxori est la taille maximale du tableau.

Fonction standard de fermeture de fichier :

FileClose(fhandle) ;


OK, mais vous n'avez pas répondu à ma question... sont-ils écrits par le même EA qui essaie de les lire ? ou par un EA, script ou indicateur différent ?
 
RaptorUK:

OK, mais vous n'avez pas répondu à ma question... sont-ils écrits par le même EA qui essaie de les lire ? ou par un EA, un script ou un indicateur différent ?


La fonction d'écriture de fichier est dans tous les cas dans le même EA. Chaque fois que nous émettons un "FILEOPEN", nous le suivons toujours par "FILECLOSE" après avoir effectué certaines tâches avec lui. Je ne pense donc pas qu'il y ait un problème avec le fichier verrouillé que l'on essaie d'ouvrir.

Il y a longtemps, nous avons eu ce genre de problème où un fichier verrouillé était tenté d'être lu. Et MT4 le signalait automatiquement dans son fichier journal. Ainsi, après 1 ou 2 jours, les dossiers Logs et History sont devenus très volumineux (des centaines de Mbytes), remplis de ces rapports. Ensuite, nous émettons un FILECLOSE à chaque fois que nous faisons un FILEOPEN. Le problème a été résolu et les dossiers des journaux et de l'historique ne sont plus jamais devenus énormes. Aujourd'hui, les dossiers journaux et historique combinés ne contiennent que moins de 100 Ko (malgré le code d'erreur 5004 qui ne cesse de s'afficher).


Merci,

Raisingfire

 
raisingfire:

La fonction d'écriture de fichiers est dans tous les cas dans le même EA. Chaque fois que nous émettons un "FILEOPEN", nous le suivons toujours par "FILECLOSE" après avoir effectué certaines tâches. Je ne pense donc pas qu'il y ait un problème avec le fichier verrouillé que l'on essaie d'ouvrir.

Il y a longtemps, nous avons eu ce genre de problème où un fichier verrouillé était tenté d'être lu. Et MT4 le signalait automatiquement dans son fichier journal. Ainsi, après 1 ou 2 jours, les dossiers Logs et History sont devenus très volumineux (des centaines de Mbytes), remplis de ces rapports. Ensuite, nous émettons un FILECLOSE à chaque fois que nous faisons un FILEOPEN. Le problème a été résolu et les dossiers des journaux et de l'historique ne sont plus jamais devenus énormes. Aujourd'hui, les dossiers journaux et historique combinés ne contiennent que moins de 100 Ko (malgré le code d'erreur 5004 qui ne cesse de s'afficher).

Merci pour ces informations. Je suis à court d'idées... tout ce que je peux suggérer maintenant est de créer un test EA qui reproduit le problème que vous pouvez poster ici et envoyer à MetaQuotes dans le cadre d'un ticket de Service Desk et leur demander d'enquêter.
 
RaptorUK:
Merci pour ces informations. Je suis à court d'idées ... tout ce que je peux vous suggérer maintenant est de créer un test EA qui reproduit le problème que vous pouvez poster ici et envoyer à MetaQuotes dans le cadre d'un ticket de Service Desk et leur demander d'enquêter.


Cher RaptorUK,


Merci pour votre aide et vos informations. Je vais essayer de faire ce que vous m'avez dit.

Encore une fois, je vous remercie.


Salutations,

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

Cher RaptorUK,


Merci de toute façon pour votre aide et vos informations. Je vais essayer de faire ce que vous m'avez dit.

Encore une fois, je vous remercie.


Salutations,



samoye:

Existe-t-il une solution à l'erreur 5004 ? Je reçois le même message d'erreur en essayant d'écrire dans un fichier.

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

Je suis sur la version 765.

Votre aide est très appréciée.

 
   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. Vous ouvrez le fichier pour l'écriture, il est maintenant de longueur zéro.
  2. Début de la boucle
  3. Vous ouvrez le fichier en lecture et en écriture. Le fichier est maintenant ouvert deux fois et vous avez perdu l'identifiant original.
  4. ResetLastError inutile, ne regardez GetLastError que lorsque vous avez un problème.
  5. Vous ouvrez le fichier trois fois et vous avez perdu deux handles.
  6. Dans la boucle suivante, vous ouvrez le fichier encore une fois.