Discussion de l'article "Les bases de la programmation MQL5 : Tableaux" - page 3

 
Ernie Gunning:

Ok, essayons la version anglaise de MQL.


Merci pour votre code. Cela m'a fait gagner du temps. J'ai essayé d'utiliser les tableaux de MQL et ils étaient confus. J'étais alors très déprimé de devoir à nouveau écrire des structures de base qui étaient censées exister MAIS j'ai trouvé votre code qui m'a fait gagner du temps dans mes recherches sur les tableaux et sur la façon de les faire croître dynamiquement. AWESOME merci.

J'espère pouvoir vous rendre la pareille ! Le code ci-dessous fonctionne pour tous les types de données. Il fonctionnera également avec les objets, mais la méthode Contains (recherche) risque de ne pas fonctionner. Je ne l'ai testé que pour les types (double, int, bool). Les chaînes de caractères peuvent également poser problème et le code doit être étendu.



Vous pouvez alors le déclarer pour tous les types dont vous avez besoin, comme suit :




J'espère que cela aidera quelqu'un


Ne tenez pas compte de ma suggestion d'utiliser le tableau dynamique pour n'importe quel type de données. Il existe déjà un CArrayList générique déclaré, veuillez l'utiliser. J'ai rencontré un problème d'utilisation d'objets qui a été résolu dans ce fil de discussion : 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'ai déjà lu quelques bons articles de toi. Celui-ci n'a pas fait exception.
 

Il semble qu'il y ait une erreur dans la fonction arrayResize(), dans l'exemple le contenu du tableau est 1, 1, 3 en indexation normale et non 1, 2, 3. Voir cet exemple :

//+------------------------------------------------------------------+
//|faux.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
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé
//+------------------------------------------------------------------+
int OnInit()
  {
//--- cartographie des tampons d'indicateurs
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Fonction d'itération de l'indicateur personnalisée|
//+------------------------------------------------------------------+
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[]; // Tableau
ArrayResize(ar,2); // Préparer le tableau
ar[0]=1; // Définir les valeurs
ar[1]=2; 
ArraySetAsSeries(ar,true); // Modifier l'ordre d'indexation
ArrayResize(ar,3); // Augmenter la taille du tableau
ar[0]=3; // Fixer la valeur du nouvel élément du tableau
Alert(ar[0]," ",ar[1]," ",ar[2]); // Imprimer les valeurs du tableau
ArraySetAsSeries(ar,false);
Alert("Normal indexing: ", ar[0]," ",ar[1]," ",ar[2]); // Imprimer les valeurs du tableau
//--- valeur de retour de prev_calculated pour l'appel suivant
   return(rates_total);
  }
//+------------------------------------------------------------------+
En ajoutant la fonction arraySetAsSeries() il semble être affecté par la fonction arrayresieze, voir cet exemple :
//+------------------------------------------------------------------+
//|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
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé
//+------------------------------------------------------------------+
int OnInit()
  {
//--- cartographie des tampons d'indicateurs
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Fonction d'itération de l'indicateur personnalisée|
//+------------------------------------------------------------------+
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[]; // Tableau
ArrayResize(ar,2); // Préparer le tableau
ar[0]=9; // Définir les valeurs
ar[1]=8; 
ArrayResize(ar,6); // Augmenter la taille du tableau
Alert("Normal resize: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3], " ", ar[4], " ", ar[5]);
ArraySetAsSeries(ar,true); // Modifier l'ordre d'indexation
ArrayResize(ar,4); // Augmenter la taille du tableau
ArraySetAsSeries(ar, false);
Alert("See the random element added: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]);
ArraySetAsSeries(ar,true); // Modifier l'ordre d'indexation 0
ar[0]=8; // Fixer la valeur du nouvel élément du tableau
Alert("Modify the first as serlies: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]); // Imprimer les valeurs du tableau
//--- valeur de retour de prev_calculated pour l'appel suivant
   return(rates_total);
  }
//+------------------------------------------------------------------+

Etapes :

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

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

4. Définir comme série true :

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

5. Redimensionner à 4

ar = {0, 0, 8, 0}

6. Définir comme série false :

ar = {0, 8, 0, 0}

7. Définir comme série true :

ar = {0, 0, 8, 0}

8. Modifier le premier élément a[0]

ar = {8, 0, 8, 0}


Je ne sais pas quel tableau redimensionner (3 -5) prend les valeurs et les copie dans les nouvelles positions, 6 en avant prend des valeurs aléatoires, je pense. Je préfère resize() d'abord et ensuite setasseries() comme ceci :

//+------------------------------------------------------------------+
//|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
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé
//+------------------------------------------------------------------+
int OnInit()
  {
//--- cartographie des tampons d'indicateurs
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Fonction d'itération de l'indicateur personnalisée|
//+------------------------------------------------------------------+
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[]; // Tableau
ArrayResize(ar,2); // Préparer le tableau
ar[0]=1; // Définir les valeurs
ar[1]=2;
ArrayResize(ar,3); // Augmenter la taille du tableau
Alert("Redimension to 3 normal: ", ar[0], " ", ar[1], " ", ar[2]); 
ArraySetAsSeries(ar,true); // Modifier l'ordre d'indexation
Alert("Redimension to 3 series: ", ar[0], " ", ar[1], " ", ar[2]); 
ar[0]=8; // Fixer la valeur du nouvel élément du tableau
Alert("Change the first element: ", ar[0]," ",ar[1]," ",ar[2]); // Imprimer les valeurs du tableau
ArraySetAsSeries(ar, false);
Alert("Normal renew: ", ar[0]," ",ar[1]," ",ar[2]); // Imprimer les valeurs du tableau
//--- valeur de retour de prev_calculated pour l'appel suivant
   return(rates_total);
  }
//+------------------------------------------------------------------+