Impossible d'écrire dans un fichier lorsque la commande est ouverte - page 2

 

WHRoeder:

Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE,";");//File opening
Handle=FileOpen(File_Name,FILE_CSV|FILE_READ|FILE_WRITE,";");//File opening

Dernier argument non valide - pas un int

Pourriez-vous préciser ce que vous voulez dire ?

Alors que la documentation (voir FileOpen()) montre que le délimiteur est placé entre guillemets simples, le livre (voir File Operations) est incohérent quant à l'utilisation des guillemets simples : certains exemples de code montrent l'utilisation des guillemets doubles.

De plus, le code suivant :

int handle=FileOpen("testing.csv", FILE_CSV|FILE_WRITE|FILE_READ, ";");
if(handle > 0) {
   FileSeek(handle, 0, SEEK_END);
   FileWrite(handle, "test1", "test2", "test3", "test4");
   FileClose(handle);
}
else
   Print ("FileOpen failed. Error # ", GetLastError());

a été compilé, n'a pas eu d'erreur d'exécution et a produit la sortie suivante dans le fichier :

Test du dossier n° 1

 
RaptorUK: Vous avez " ;" et non " ;"... le message d'erreur que vous avez reçu parlait du paramètre 1, n'est-ce pas le handle du fichier ?
Le premier est une chaîne de caractères, le second est un int (comme requis.) L'erreur mentionnait p 1. Plusieurs problèmes ?
 
RaptorUK:
Désolé, "parties" ... avez-vous le message **** END TICK USDCHF **** ? ou se termine-t-il avant ?


Oui, le fichier est complet.
 
RaptorUK:

Vous avez " ;" et non ';'... le message d'erreur que vous avez reçu parlait du paramètre 1, n'est-ce pas le handle du fichier ?

Oui, quelqu'un d'autre parlait du dernier paramètre invalide, je ne sais pas pourquoi. J'ai quand même remplacé " ;" par ';' mais j'ai eu le même problème.
 
Thirteen:

Pourriez-vous préciser ce que vous voulez dire ?

Alors que la documentation (voir FileOpen()) montre que le délimiteur est placé entre guillemets simples, le livre (voir File Operations) est incohérent quant à l'utilisation des guillemets simples : certains exemples de code montrent l'utilisation des guillemets doubles.

De plus, le code suivant :

s'est compilé, n'a pas eu d'erreur d'exécution et a produit la sortie suivante dans le fichier :



J'ai essayé " ;" et " ;" mais j'ai eu le même problème.

Mon code s'exécute et fonctionne très bien, le fichier est créé et à chaque tick le fichier est ouvert, toutes les infos sont écrites dedans puis le fichier est fermé. Tout fonctionne bien jusqu'à ce que l'EA ouvre un ordre, alors rien n'est écrit dans le fichier.

 
WHRoeder:
Le premier est une chaîne, le second est un int (comme requis.) L'erreur mentionnée p 1. Problèmes multiples ?


L'erreur est le handle du fichier, le handle est toujours 1 et fonctionne toujours, mais lorsque l'EA ouvre un ordre, le tick suivant indique Handle is invalid même s'il est à nouveau 1 et a fonctionné pendant les dernières centaines de ticks. La dernière fois que j'ai essayé, le handle a commencé à augmenter lorsque l'ordre s'est ouvert, il est devenu 2, 3, 4, etc.

C'est exactement le même code, je ne sais pas pourquoi il ne reste pas à 1, et même quand il est toujours à 1, il donne toujours l'erreur.

 
Une idée, les gars ?
 
favosys:
Une idée ?

Je ne vois pas de problème avec le code que vous avez posté.

Je vois donc 2 options :

  • poster tout votre code pour que nous puissions l'essayer par nous-mêmes et tenter de le corriger
  • créer un court script/EA qui reproduit le problème et le poster.

 
RaptorUK:

Je ne vois pas de problème avec le code que vous avez posté.

Je vois donc 2 options :

  • poster tout votre code pour que nous puissions l'essayer par nous-mêmes et tenter de le corriger
  • créer un court script/EA qui reproduit le problème et le poster.


Merci RaptorUK, j'ai déjà créé un EA qui reproduit exactement le problème pour essayer de le résoudre. En gros, ça démarre, il crée le fichier et à chaque tick, il écrit sur le fichier en comptant les ticks. Donc le fichier est comme tick 1, tick 2, etc.

Au tick 15, il ouvre un ordre, les informations de l'ordre apparaissent dans le fichier et la fin (******) apparaît également. Ensuite, il est censé écrire à chaque tick le numéro du tick (16, 17, etc.) et le statut de l'ordre, c'est-à-dire si l'ordre est toujours ouvert ou non. Pour une raison quelconque, après le tick 15, l'EA n'écrit pas dans le fichier.

Au tick 50, il est censé fermer l'ordre mais ce n'est pas important, ce qui est important c'est qu'il continue à écrire sur le fichier quand il ouvre l'ordre.

Sur mon ordinateur Windows 7, les fichiers sont créés dans C:\Users\{username}\AppData\Local\VirtualStore\Program Files (x86)\SIGTrader 4\experts\files.

Appdata est un dossier caché.

Merci d'avance

Code :

//+------------------------------------------------------------------+
//|                                                          log.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern string     Nombre_archivo="log";
extern int        Take_Profit=6;
extern int        Stop_Loss=35;
extern int        Deslizamiento=4;
extern double     vol=1;
int               Handle, Qnt_Symb, ticket, err, abierta = 0;
string            File_Name, larcor;


int cont=1;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   File_Name = StringConcatenate(Nombre_archivo, " - ", Symbol(), " - ", TimeToStr(TimeLocal(),TIME_DATE), " - ", TimeHour(TimeLocal()), ".", TimeMinute(TimeLocal()), ".", TimeSeconds(TimeLocal()), ".txt");
   Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE,';');//File opening
   if(Handle==-1)                      // File opening fails
     {
      Alert("An error while opening the file. ",// Error message
              "May be the file is busy by the other applictiom");
      PlaySound("Bzrrr.wav");          // Sound accompaniment
      return;                          // Exir start()      
     }
     FileClose( Handle );
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   double op, cl;
   
   Print("Order open: ", abierta);
   //Print("File: ", File_Name);

    Handle=FileOpen(File_Name,FILE_CSV|FILE_READ|FILE_WRITE,';');//File opening
    Print("Handle: ", Handle);
   if(Handle==-1)                      // File opening fails
     {
      Alert("An error while opening the file. ",// Error message
              "May be the file is busy by the other applictiom");
      PlaySound("Bzrrr.wav");          // Sound accompaniment
      return;                          // Exir start()      
     }
   FileSeek(Handle, 0, SEEK_END);
   
   Qnt_Symb=FileWrite(Handle,"**** INICIANDO TICK PAR ", Symbol(), ": ", TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS), " ****");
   Qnt_Symb=FileWrite(Handle,"************************************************************");   
   
   Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","Este es el tick num: ", cont);
   if(cont == 15){
      op = iOpen(NULL, 0, 0);
      cl = iClose(NULL, 0, 0);
      
      if(op < cl){
         Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","Estamos en LARGO, se abre compra");
         ticket = OrderSend(Symbol(),OP_BUY,vol,Ask,Deslizamiento,Ask-Stop_Loss*Point,Ask+Take_Profit*Point);
         if(ticket == -1){
            err = GetLastError();
            Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - "," Error No. ", err, " al tratar de abrir la orden");
         }
         else{
            Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - "," Abierta orden ", ticket, ", hora: ", TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
            abierta = 1;
         }
       }
       else{
         Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","Estamos en CORTO, se abre venta");
         ticket = OrderSend(Symbol(),OP_SELL,vol,Bid,Deslizamiento,Bid+Stop_Loss*Point,Bid-Take_Profit*Point);
         if(ticket == -1){
            err = GetLastError();
            Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - "," Error No. ", err, " al tratar de abrir la orden");
         }
         else{
            Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - "," Abierta orden ", ticket, ", hora: ", TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
            abierta = 1;
         }
       }
   }
   
   if((cont > 15) && (cont < 50)){
      if(ticket != -1){
         if(OrderSelect(ticket, SELECT_BY_TICKET) == true){
            datetime horacierre = OrderCloseTime();
            if(horacierre == 0){
               Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","Orden ", ticket, " en par ". Symbol(), " sigue abierta.");   
            }
            else{
               Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","La orden ", ticket, " se cerro automaticamente a las ", TimeToStr(horacierre,TIME_DATE|TIME_SECONDS));
            }
          }
      }
   }
   
   if(cont == 50){
      if(abierta == 1){
         if(larcor == "LARGO"){
            if(OrderClose(ticket,OrderLots(),Ask,3)){
               Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","Se cerro la orden ", ticket, " en LARGO");
            }
            else{
               Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","No se pudo cerrar la orden ", ticket, " en LARGO");
            }
         }
         else{
            if(OrderClose(ticket,OrderLots(),Bid,3)){
               Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","Se cerro la orden en CORTO");
            }
            else{
               Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","No se pudo cerrar la orden ", ticket, " en CORTO");
            }
         }
      }
   }
   
   if(cont > 50){
      Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","Fin de EA");
   }
   
   Qnt_Symb=FileWrite(Handle,"***************************");      
   Qnt_Symb=FileWrite(Handle,"**** FIN TICK PAR ", Symbol(), " ****");        
   FileClose( Handle );
   cont++;   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
favosys:


Merci RaptorUK, j'avais déjà créé une EA qui reproduit exactement le problème pour essayer de le résoudre. En gros, il démarre, il crée le fichier et à chaque tick, il écrit sur le fichier en comptant les ticks. Donc le fichier est comme tick 1, tick 2, etc.

Au tick 15, il ouvre un ordre, les informations de l'ordre apparaissent dans le fichier et la fin (******) apparaît également. Ensuite, il est censé écrire à chaque tick le numéro du tick (16, 17, etc) et le statut de l'ordre, c'est-à-dire si l'ordre est toujours ouvert ou non. Pour une raison quelconque, après le tick 15, l'EA n'écrit pas dans le fichier.

Au tick 50 il est censé fermer l'ordre mais ce n'est pas important, ce qui est important c'est qu'il continue à écrire sur le fichier quand il ouvre l'ordre.

Sur mon ordinateur Windows 7, les fichiers sont créés dans C:\Users\{username}\AppData\Local\VirtualStore\Program Files (x86)\SIGTrader 4\experts\files.

Appdata est un dossier caché.

Merci d'avance

Code :

Votre code n'effectuera pas de transactions avec le courtier que j'utilise pour les tests, c'est un courtier ECN de "type". Je vais ajuster et mettre le TP et SL à 0.0.