No se puede escribir en el archivo cuando la orden está abierta - página 2

 

WHRoeder:

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

Último argumento inválido - no es un int

¿Podría explicar con más detalle lo que quiere decir?

Mientras que la documentación (ver FileOpen()) muestra el delimitador entre comillas simples, el libro (ver File Operations) es inconsistente en cuanto al uso de comillas simples: algunos de los ejemplos de código muestran el uso de las comillas dobles.

Además, el siguiente código

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());

se compiló, no tuvo ningún error de ejecución, y produjo la siguiente salida en el archivo:

Archivo Prueba #1

 
RaptorUK: Tienes ";" no ';'... el mensaje de error que recibiste hablaba del parámetro 1, ¿no es ese el manejador del archivo?
El primero es una cadena, el segundo es un int (como se requiere.) El error mencionado p 1. ¿Problemas múltiples?
 
RaptorUK:
Lo siento, "partes"... ¿se recibe el mensaje **** END TICK USDCHF **** o termina antes?


Sí, el archivo está completo.
 
RaptorUK:

Tienes ";" no ';'... el mensaje de error que recibiste hablaba del parámetro 1, ¿no es ese el manejador del archivo?

Sí, alguien más hablaba de un último parámetro no válido, no sé por qué. Igual cambié ";" por ';' pero tuve el mismo problema.
 
Thirteen:

¿Podría explicar con más detalle lo que quiere decir?

Mientras que la documentación (ver FileOpen()) muestra el delimitador entre comillas simples, el libro (ver File Operations) es inconsistente en cuanto al uso de comillas simples: algunos de los ejemplos de código muestran el uso de las comillas dobles.

Además, el siguiente código

se compiló, no tuvo ningún error de ejecución, y produjo la siguiente salida en el archivo:



Probé con ";" y ';' y obtuve el mismo problema.

Mi código se ejecuta y funciona muy bien, el archivo se crea y cada vez que se abre el archivo, se escribe toda la información en él y luego se cierra el archivo. Todo funciona muy bien hasta que el EA abre una orden, entonces no se escribe nada en el archivo.

 
WHRoeder:
El primero es una cadena, el segundo es un int (como se requiere.) El error mencionado p 1. ¿Problemas múltiples?


El error es el handle del archivo, el handle siempre es 1 y siempre funciona, pero cuando el EA abre una orden, al siguiente tick dice Handle is invalid aunque vuelva a ser 1 y haya funcionado durante los últimos cientos de ticks. La última vez que lo probé el handle empezó a subir cuando la orden se abrió, pasó a ser 2, 3, 4, etc.

Es exactamente el mismo código, no sé por qué no se queda como 1, e incluso cuando sigue siendo 1 sigue dando el error.

 
¿Alguna idea, chicos?
 
favosys:
¿Alguna idea, chicos?

No veo ningún problema con el código que has publicado.

Así que veo 2 opciones :

  • publicar todo el código para que podamos probarlo por nosotros mismos y tratar de arreglarlo
  • crear un pequeño script/EA que reproduzca el problema y publicarlo

 
RaptorUK:

No veo ningún problema con el código que has publicado.

Así que veo 2 opciones :

  • publicar todo el código para que podamos probarlo por nosotros mismos y tratar de arreglarlo
  • crear un pequeño script/EA que reproduzca el problema y publicarlo


Gracias RaptorUK, ya había creado un EA que replica el problema exactamente para tratar de solucionar el problema. Básicamente se inicia, se crea el archivo de ellos cada garrapata que escribe en el archivo de contar las garrapatas. Así que el archivo es como tick 1, tick 2, etc.

En el tick 15 abre una orden, la información de la orden aparece en el archivo y el final (******) también aparece. Después se supone que escribe en cada tick el número de tick (16, 17, etc) y el estado de la orden, es decir, si la orden sigue abierta o no. Por alguna razón después del tick 15 el EA no escribe en el archivo.

En el tick 50 se supone que cierra la orden pero eso no es importante, lo importante es que sigue escribiendo en el archivo cuando abre la orden.

En mi máquina de Windows 7, los archivos se crean en C:\ ~ usuarios\ ~ AppData\ ~ Local\ ~ VirtualStore\ ~ Archivos de programa (x86)\ ~ SIGTrader 4\ ~ archivos de expertos

Appdata es una carpeta oculta.

Gracias de antemano

Código:

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


Gracias RaptorUK, ya había creado un EA que replica el problema exactamente para intentar solucionar el problema. Básicamente arranca, crea el archivo ellos cada tick escribe en el archivo contando los ticks. Así que el archivo es como la garrapata 1, garrapata 2, etc.

En el tick 15 abre una orden, la información de la orden aparece en el archivo y el final (******) también aparece. Después se supone que escribe en cada tick el número de tick (16, 17, etc) y el estado de la orden, es decir, si la orden sigue abierta o no. Por alguna razón después del tick 15 el EA no escribe en el archivo.

En el tick 50 se supone que cierra la orden pero eso no es importante, lo importante es que sigue escribiendo en el archivo cuando abre la orden.

En mi máquina de Windows 7, los archivos se crean en C:\ ~ usuarios\ ~ AppData\ ~ Local\ ~ VirtualStore\ ~ Archivos de programa (x86)\ ~ SIGTrader 4\ ~ archivos de expertos

Appdata es una carpeta oculta.

Gracias de antemano

Código:

El código no colocará operaciones con el Broker que uso para las pruebas, es un Broker "tipo" ECN. Voy a ajustar y establecer el TP y SL a 0.0