Discussione sull’articolo "Fondamenti di programmazione MQL5: Arrays" - pagina 3

 
Ernie Gunning:

Ok, proviamo la versione inglese di MQL.


Grazie per il tuo post sul codice. Mi ha fatto risparmiare tempo. Ho provato a usare gli array di MQL e mi hanno confuso. Ero molto depresso per il fatto di dover scrivere ancora una volta strutture di base che avrebbero dovuto essere presenti, ma poi ho trovato il tuo codice che mi ha fatto risparmiare tempo di ricerca sugli array e su come farli crescere o aumentare dinamicamente. Fantastico, grazie.

Spero di poter ricambiare! Il codice qui sotto funziona per tutti i tipi di dati. Funzionerà anche sugli oggetti, ma il metodo Contains (search) potrebbe non funzionare. L'ho testato solo su tipi (double, int, bool). Anche le stringhe potrebbero dare problemi e il codice potrebbe dover essere esteso.



Quindi si può dichiarare per tutti i tipi di cui si ha bisogno in questo modo:




Spero che questo aiuti qualcuno


Si prega di ignorare il mio suggerimento precedente di utilizzare l'array dinamico per qualsiasi tipo di dati. Esiste già un generico CArrayList dichiarato. utilizzare questo. Ho riscontrato un problema nell'utilizzo degli oggetti che è stato risolto in questo thread: 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...
 
Ho già letto alcuni suoi buoni articoli. Questo non fa eccezione.
 

Sembra che ci sia un errore nella funzione arrayResize(), nell'esempio il contenuto dell'array è 1, 1, 3 in un'indicizzazione normale e non 1, 2, 3. Vedere questo esempio:

//+------------------------------------------------------------------+
//|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
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'indicatore personalizzata |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mappatura dei buffer degli indicatori
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Funzione di iterazione dell'indicatore personalizzata|
//+------------------------------------------------------------------+
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[]; // Array
ArrayResize(ar,2); // Preparare l'array
ar[0]=1; // Impostare i valori
ar[1]=2; 
ArraySetAsSeries(ar,true); // Modifica dell'ordine di indicizzazione
ArrayResize(ar,3); // Aumenta la dimensione dell'array
ar[0]=3; // Impostare il valore del nuovo elemento dell'array
Alert(ar[0]," ",ar[1]," ",ar[2]); // Stampa i valori dell'array
ArraySetAsSeries(ar,false);
Alert("Normal indexing: ", ar[0]," ",ar[1]," ",ar[2]); // Stampa i valori dell'array
//--- restituisce il valore di prev_calculated per la chiamata successiva
   return(rates_total);
  }
//+------------------------------------------------------------------+
Nell'aggiunta della funzione arraySetAsSeries() sembra essere influenzata dalla funzione arrayresieze, vedere questo esempio:
//+------------------------------------------------------------------+
//|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
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'indicatore personalizzata |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mappatura dei buffer degli indicatori
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Funzione di iterazione dell'indicatore personalizzata|
//+------------------------------------------------------------------+
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[]; // Array
ArrayResize(ar,2); // Preparare l'array
ar[0]=9; // Impostare i valori
ar[1]=8; 
ArrayResize(ar,6); // Aumenta la dimensione dell'array
Alert("Normal resize: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3], " ", ar[4], " ", ar[5]);
ArraySetAsSeries(ar,true); // Modifica dell'ordine di indicizzazione
ArrayResize(ar,4); // Aumenta la dimensione dell'array
ArraySetAsSeries(ar, false);
Alert("See the random element added: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]);
ArraySetAsSeries(ar,true); // Modifica dell'ordine di indicizzazione 0
ar[0]=8; // Impostare il valore del nuovo elemento dell'array
Alert("Modify the first as serlies: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]); // Stampa i valori dell'array
//--- restituisce il valore di prev_calculated per la chiamata successiva
   return(rates_total);
  }
//+------------------------------------------------------------------+

Passi:

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

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

4. Impostare come serie vera:

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

5. Ridimensionare a 4

ar = {0, 0, 8, 0}

6. Impostare come serie false:

ar = {0, 8, 0, 0}

7. Imposta come serie true:

ar = {0, 0, 8, 0}

8. Modificare il primo elemento a[0]

ar = {8, 0, 8, 0}


Non so quale array ridimensionare (3 -5) prende i valori e li copia nelle nuove posizioni, 6 in avanti prende valori casuali, credo. Preferisco prima ridimensionare() e poi impostareasseries() in questo modo:

//+------------------------------------------------------------------+
//|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
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'indicatore personalizzata |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mappatura dei buffer degli indicatori
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Funzione di iterazione dell'indicatore personalizzata|
//+------------------------------------------------------------------+
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[]; // Array
ArrayResize(ar,2); // Preparare l'array
ar[0]=1; // Impostare i valori
ar[1]=2;
ArrayResize(ar,3); // Aumenta la dimensione dell'array
Alert("Redimension to 3 normal: ", ar[0], " ", ar[1], " ", ar[2]); 
ArraySetAsSeries(ar,true); // Modifica dell'ordine di indicizzazione
Alert("Redimension to 3 series: ", ar[0], " ", ar[1], " ", ar[2]); 
ar[0]=8; // Impostare il valore del nuovo elemento dell'array
Alert("Change the first element: ", ar[0]," ",ar[1]," ",ar[2]); // Stampa i valori dell'array
ArraySetAsSeries(ar, false);
Alert("Normal renew: ", ar[0]," ",ar[1]," ",ar[2]); // Stampa i valori dell'array
//--- restituisce il valore di prev_calculated per la chiamata successiva
   return(rates_total);
  }
//+------------------------------------------------------------------+