Discussão do artigo "Fundamentos básicos da programação MQL5: Arrays" - página 3

 
Ernie Gunning:

Ok, vamos tentar a versão em inglês do MQL.


Obrigado por sua postagem de código. Isso me poupou tempo. Tentei usar as matrizes MQL e elas eram confusas. Fiquei muito deprimido por ter de escrever novamente estruturas básicas que deveriam estar lá, MAS, então, encontrei seu código que me poupou algum tempo de pesquisa sobre arrays e como fazê-los crescer\aumentar dinamicamente. Muito obrigado.

Espero poder retribuir a você! O código abaixo funciona para todos os tipos de dados. Ele também funcionará em objetos, mas o método Contains (pesquisa) talvez não funcione. Eu o testei apenas em tipos (double, int, bool). As strings também podem apresentar problemas e o código talvez precise ser ampliado.



Então, você pode declará-lo para todos os tipos de que precisa, assim:




Espero que isso ajude a todos


Não leve em consideração minha sugestão acima de usar a matriz dinâmica para qualquer tipo de dados. Já existe uma CArrayList genérica declarada, portanto, use-a. Encontrei um problema ao usar objetos que foi resolvido neste tópico: 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...
 
Já li alguns bons artigos seus. Este não foi exceção.
 

Parece que há um erro na função arrayResize(). No exemplo, o conteúdo da matriz é 1, 1, 3 na indexação normal, e não 1, 2, 3. Veja este exemplo:

//+------------------------------------------------------------------+
//|false.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
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mapeamento de buffers de indicadores
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizado|
//+------------------------------------------------------------------+
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 a matriz
ar[0]=1; // Definir os valores
ar[1]=2; 
ArraySetAsSeries(ar,true); // Alterar a ordem de indexação
ArrayResize(ar,3); // Aumentar o tamanho da matriz
ar[0]=3; // Definir o valor para o novo elemento do array
Alert(ar[0]," ",ar[1]," ",ar[2]); // Imprimir valores de matriz
ArraySetAsSeries(ar,false);
Alert("Normal indexing: ", ar[0]," ",ar[1]," ",ar[2]); // Imprimir valores de matriz
//--- valor de retorno de prev_calculated para a próxima chamada
   return(rates_total);
  }
//+------------------------------------------------------------------+
Ao adicionar a função arraySetAsSeries(), ela parece ser afetada pela função arrayresieze, veja este exemplo:
//+------------------------------------------------------------------+
//|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
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mapeamento de buffers de indicadores
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizado|
//+------------------------------------------------------------------+
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 a matriz
ar[0]=9; // Definir os valores
ar[1]=8; 
ArrayResize(ar,6); // Aumentar o tamanho da matriz
Alert("Normal resize: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3], " ", ar[4], " ", ar[5]);
ArraySetAsSeries(ar,true); // Alterar a ordem de indexação
ArrayResize(ar,4); // Aumentar o tamanho da matriz
ArraySetAsSeries(ar, false);
Alert("See the random element added: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]);
ArraySetAsSeries(ar,true); // Alterar a ordem de indexação 0
ar[0]=8; // Definir o valor para o novo elemento do array
Alert("Modify the first as serlies: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]); // Imprimir valores de matriz
//--- valor de retorno de prev_calculated para a próxima chamada
   return(rates_total);
  }
//+------------------------------------------------------------------+

Etapas:

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

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

4. Definir como série verdadeira:

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

5. Redimensionar para 4

ar = {0, 0, 8, 0}

6. Definir como série falsa:

ar = {0, 8, 0, 0}

7. Definir como série true:

ar = {0, 0, 8, 0}

8. Modifique o primeiro elemento a[0]

ar = {8, 0, 8, 0}


Não sei qual matriz redimensionar (3 -5) pega os valores e copia nas novas posições, 6 em diante pega valores aleatórios, eu acho. Prefiro redimensionar() primeiro e depois setasseries() assim:

//+------------------------------------------------------------------+
//|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
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mapeamento de buffers de indicadores
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizado|
//+------------------------------------------------------------------+
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 a matriz
ar[0]=1; // Definir os valores
ar[1]=2;
ArrayResize(ar,3); // Aumentar o tamanho da matriz
Alert("Redimension to 3 normal: ", ar[0], " ", ar[1], " ", ar[2]); 
ArraySetAsSeries(ar,true); // Alterar a ordem de indexação
Alert("Redimension to 3 series: ", ar[0], " ", ar[1], " ", ar[2]); 
ar[0]=8; // Definir o valor para o novo elemento do array
Alert("Change the first element: ", ar[0]," ",ar[1]," ",ar[2]); // Imprimir valores de matriz
ArraySetAsSeries(ar, false);
Alert("Normal renew: ", ar[0]," ",ar[1]," ",ar[2]); // Imprimir valores de matriz
//--- valor de retorno de prev_calculated para a próxima chamada
   return(rates_total);
  }
//+------------------------------------------------------------------+