Discusión sobre el artículo "Fundamentos de programación en MQL5 - Arrays" - página 3

 
Ernie Gunning:

Bien, probemos la versión inglesa de MQL.


Gracias por su código post. Me ahorró tiempo. Traté de usar las matrices MQL y eran confusas. Entonces yo estaba muy deprimido que necesito una vez más la necesidad de escribir las estructuras básicas que se suponía que debía estar allí, pero luego me encontré con su código que me salvó algún tiempo de investigación sobre las matrices y cómo hacer que crecen\incrementar dinámicamente. AWESOME gracias.

El código de abajo funciona para todos los tipos de datos. Funcionará en objetos también pero el método Contains (search) podría no funcionar. Sólo lo he probado en los tipos (double, int, bool). String podría dar problemas también y el código podría necesitar ser extendido.



Entonces puedes declararlo para todos los tipos que necesites así:




Espero que esto ayude a nadie


Por favor, ignore mi sugerencia de arriba para utilizar la matriz dinámica para cualquier tipo de datos. Ya hay un genérico CArrayList declarado. por favor, utilice este. Me encontré con un problema usando objetos que se resolvió en este hilo: https: //www.mql5.com/en/forum/358432

Using CArrayList gives error
Using CArrayList gives error
  • 2020.12.20
  • www.mql5.com
Hi Guys, Thanks for your time. I'm struggling to use the CArrayList in the generics folder. Are these interfaces and classes complete...
 
Ya he leído algunos buenos artículos suyos. Este no ha sido una excepción.
 

Parece un error en la función arrayResize(), en el ejemplo el contenido del array es 1, 1, 3 en indexación normal no 1, 2, 3. Ver este ejemplo:

//+------------------------------------------------------------------+
//|falso.mq5
//|Copyright 2024, MetaQuotes Ltd. |
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Función de inicialización del indicador personalizada |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- asignación de búferes indicadores
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Función personalizada de iteración del indicador|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   double ar[]; // Matriz
ArrayResize(ar,2); // Preparar la matriz
ar[0]=1; // Establecer los valores
ar[1]=2; 
ArraySetAsSeries(ar,true); // Cambiar el orden de indexación
ArrayResize(ar,3); // Aumentar el tamaño del array
ar[0]=3; // Establecer el valor del nuevo elemento del array
Alert(ar[0]," ",ar[1]," ",ar[2]); // Imprimir los valores de la matriz
ArraySetAsSeries(ar,false);
Alert("Normal indexing: ", ar[0]," ",ar[1]," ",ar[2]); // Imprimir los valores de la matriz
//--- valor de retorno de prev_calculado para la siguiente llamada
   return(rates_total);
  }
//+------------------------------------------------------------------+
En la función arraySetAsSeries() parece estar afectada por la función arrayresieze, ver este ejemplo:
//+------------------------------------------------------------------+
//|errorindex.mq5
//|Copyright 2024, MetaQuotes Ltd. |
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Función de inicialización del indicador personalizada |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- asignación de búferes indicadores
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Función personalizada de iteración del indicador|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   double ar[]; // Matriz
ArrayResize(ar,2); // Preparar la matriz
ar[0]=9; // Establecer los valores
ar[1]=8; 
ArrayResize(ar,6); // Aumentar el tamaño del array
Alert("Normal resize: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3], " ", ar[4], " ", ar[5]);
ArraySetAsSeries(ar,true); // Cambiar el orden de indexación
ArrayResize(ar,4); // Aumentar el tamaño del array
ArraySetAsSeries(ar, false);
Alert("See the random element added: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]);
ArraySetAsSeries(ar,true); // Cambiar el orden de indexación 0
ar[0]=8; // Establecer el valor del nuevo elemento del array
Alert("Modify the first as serlies: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]); // Imprimir los valores de la matriz
//--- valor de retorno de prev_calculado para la siguiente llamada
   return(rates_total);
  }
//+------------------------------------------------------------------+

Pasos:

1. ar = {}
2. ar = {9, 8}

3. ar = {9, 8, 0, 8, 0, 0}

4. Establecer como serie true:

ar = {0, 0, 8, 0, 8, 9}

5. Cambia el tamaño a 4

ar = {0, 0, 8, 0}

6. Establecer como serie false:

ar = {0, 8, 0, 0}

7. Establecer como serie verdadero:

ar = {0, 0, 8, 0}

8. Modificar el primer elemento a[0]

ar = {8, 0, 8, 0}


No se que array redimensionar (3 -5) toma los valores y copia en las nuevas posiciones, 6 en adelante toma valores aleatorios, creo. Prefiero primero resize() y luego setasseries() así:

//+------------------------------------------------------------------+
//|indexingarraytest.mq5
//|Copyright 2024, MetaQuotes Ltd. |
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Función de inicialización del indicador personalizada |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- asignación de búferes indicadores
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Función personalizada de iteración del indicador|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   double ar[]; // Matriz
ArrayResize(ar,2); // Preparar la matriz
ar[0]=1; // Establecer los valores
ar[1]=2;
ArrayResize(ar,3); // Aumentar el tamaño del array
Alert("Redimension to 3 normal: ", ar[0], " ", ar[1], " ", ar[2]); 
ArraySetAsSeries(ar,true); // Cambiar el orden de indexación
Alert("Redimension to 3 series: ", ar[0], " ", ar[1], " ", ar[2]); 
ar[0]=8; // Establecer el valor del nuevo elemento del array
Alert("Change the first element: ", ar[0]," ",ar[1]," ",ar[2]); // Imprimir los valores de la matriz
ArraySetAsSeries(ar, false);
Alert("Normal renew: ", ar[0]," ",ar[1]," ",ar[2]); // Imprimir los valores de la matriz
//--- valor de retorno de prev_calculado para la siguiente llamada
   return(rates_total);
  }
//+------------------------------------------------------------------+