¿por qué este código que me funciona bien en mql4 no funciona bien en mql5?

ricardofelipesch
74

Esta función es parte de mi EA, y pasa los datos de dos archivos csv a arrays. En mql4 funciona bien, pero en mql5 no va. FileOpen funciona bien, porque el handle es correcto. Pero a partir de While(!FileIsEnding) ya no busca el texto por toda la csv.  En las hojas csv la primera columna tiene en cada fila el texto que coincide con el nombre y ya en las siguientes columnas otros datos, luego después de While(!FileIsEnding) el contador cont debería contar todas las filas con datos, pero este contador cont se queda igual a 1. Por favor si alguien me ayuda lo agradecería, en mql4 me manejo bien pero estoy empezando en mql5.

Supongo que la razón de que no funcione en mql5 debe ser por el uso de  FileIsEnding o FileReadString(handle), que no es exactamente igual en mql5, pero no logro averiguar que he de cambiar.

Gracias


bool Inicializamos_arrays_seniales(string archivo, string &array[][])

   { 
      int cont=0;
      string nombre;
      
      if(archivo=="weakness.csv")
         nombre="WEAKNESS";
      if(archivo=="strenght.csv")
         nombre="STRENGHT";
      if(archivo!="weakness.csv" && archivo!="strenght.csv")
         {
            Alert("Nos salimos porque los archivos no son ",archivo);
            return false;
         }

      int handle=FileOpen(archivo,FILE_CSV|FILE_READ);
           
      if(handle<0)
         Alert("ERROR HANDLE ",archivo);
       
      while(!FileIsEnding(handle))
         {
            // Rellenamos los datos de los ficheros en los arrays
            
            string x=FileReadString(handle);    
            cont++;
 
            if(x==nombre)
               {
                  cont++;
                  Alert("cont= ",cont);
                  if(nombre=="WEAKNESS" || nombre=="STRENGHT")
                     {
                           ArrayResize(array,cont);       
                           array[cont-1,0]=x;               //escribimos cont-1  porque el array debe comenzar desde el cero
                           for(int i=1;i<=75;i++)
                           array[cont-1,i]=FileReadString(handle);   //ponemos los datos de las cabeceras de la excel en el array en su primera                                                        //dimension las filas y en su segunda dimension las columnas
                     }
               }
         }   
      FileClose(handle);
      
      return true;
   }
Documentación para MQL5: Operaciones con archivos / FileIsEnding
Documentación para MQL5: Operaciones con archivos / FileIsEnding
  • www.mql5.com
FileIsEnding - Operaciones con archivos - Manual de referencia de MQL5 - manual de usuario para el lenguaje del trading algorítmico/automático para MetaTrader 5
Miguel Antonio Rojas Martinez
3853
Adjunta el csv de prueba, de esa manera, entendemos si hacemos pruebas en ambos lenguajes, cual es la diferencia
ricardofelipesch
74
ricardofelipesch  
Adjunto una muestra del archivo csv strenght, para que se pueda ver el formato. Gracias.
Archivos adjuntos:
strenght.csv  2 kb
Enrique Enguix Vino
11117
ricardofelipesch:
Adjunto una muestra del archivo csv strenght, para que se pueda ver el formato. Gracias.

Yo no termino de entender al 100% el Excel, pero lo poco que entiendo se puede hacer sin un archivo, no sé realmente la necesidad de hacerlo así. Yo no te puedo ayudar en este caso, disculpa.

Es o muy difícil para mi, o muy diferente a los que yo estoy acostumbrado a hacer.

Miguel Antonio Rojas Martinez
3853
En Mql5 


   int handle=FileOpen(archivo,FILE_CSV|FILE_READ|FILE_ANSI);
ricardofelipesch
74
ricardofelipesch  
void OnStart()
  {
//---
   
      int cont=0;
      string archivo="ejemplo.csv";
      int handle=FileOpen(archivo,FILE_CSV|FILE_READ|FILE_ANSI);
      
      if(handle<0)
         Alert("ERROR HANDLE ",archivo);

      while(!FileIsEnding(handle))
         {
            string x=FileReadString(handle);
            if(FileIsLineEnding(handle))
               {
                  cont++;                         //cont va contando el número de filas
                  Alert("cont= ",cont, " x= ",x); //el resultado de alert es el siguiente
                                                  //cont=1 x=A;B;C;D;E;
                                                  //cont=2 x=F;G;H;I;J;
                                                  //cont=3 x=K;L;M;N;O;    
                                                            
               }
         }   
       
      FileClose(handle);
   }

Miguel Antonio gracias por contestarme. Efectivamente he añadido FILE_ANSI y ahora sí lee los datos, pero de otra manera: después de x=FileReadString(handle); en mql4, x daba un valor por cada celda de la csv, en cambio en mql5, añadiendo FILE_ANSI, x da un valor igual a las celdas de toda la fila separadas por punto y coma.

Añadiendo if(FileIsLineEnding(handle) estoy viendo cada valor de x. 

El ejemplo sería:

valor de x después de leer la primera fila: x=A;B;C;D;E; //el número de columnas es 5, y es un dato fijo que conozco

valor de x después de leer la segunda fila: x=F;G;H;I;J;

valor de x después de leer la tercera fila; x=K;L;M;N;O;

usando un contador cont++ puedo saber que son 3 filas a pasar al array. Por tanto tengo tres valores de x para formar un array[3][5].

¿Cómo puedo hacerlo?. Gracias.

Documentación para MQL5: Operaciones con archivos / FileIsLineEnding
Documentación para MQL5: Operaciones con archivos / FileIsLineEnding
  • www.mql5.com
FileIsLineEnding - Operaciones con archivos - Manual de referencia de MQL5 - manual de usuario para el lenguaje del trading algorítmico/automático para MetaTrader 5
Archivos adjuntos:
ejemplo.csv  1 kb
Miguel Antonio Rojas Martinez
3853
ricardofelipesch:

Miguel Antonio gracias por contestarme. Efectivamente he añadido FILE_ANSI y ahora sí lee los datos, pero de otra manera: después de x=FileReadString(handle); en mql4, x daba un valor por cada celda de la csv, en cambio en mql5, añadiendo FILE_ANSI, x da un valor igual a las celdas de toda la fila separadas por punto y coma.

Añadiendo if(FileIsLineEnding(handle) estoy viendo cada valor de x. 

El ejemplo sería:

valor de x después de leer la primera fila: x=A;B;C;D;E; //el número de columnas es 5, y es un dato fijo que conozco

valor de x después de leer la segunda fila: x=F;G;H;I;J;

valor de x después de leer la tercera fila; x=K;L;M;N;O;

usando un contador cont++ puedo saber que son 3 filas a pasar al array. Por tanto tengo tres valores de x para formar un array[3][5].

¿Cómo puedo hacerlo?. Gracias.

Debes entonces, "cortar" o "separar" los valores, entiendo que tienes como separador el ";". y con esos valores separados, ponerlos donde debes, para ello te puede ayudar la funcion "StringSplit()"

La informacion que obtienes es diferente,(Pero al menos ya la tienes), así que debes reajustarla para ponerla en los arrays bidimensionales.

Espero puedas avanzar, saludos!!!

ricardofelipesch
74
ricardofelipesch  
Miguel Antonio he seguido tus indicaciones, he usado la función StringSplit() y me ha funcionado perfecto. Muchas gracias ya lo tengo resuelto.