Diskussion zum Artikel "Grundlagen der Programmierung in MQL5: Arrays" - Seite 3

 
Ernie Gunning:

Ok, versuchen wir die englische Version von MQL.


Danke für deinen Code-Post. Es hat mir Zeit gespart. Ich habe versucht, die MQL-Arrays zu verwenden und sie waren verwirrend. Ich war dann sehr deprimiert, dass ich wieder brauchen, um grundlegende Strukturen zu schreiben, die dort sein sollte, aber dann fand ich Ihren Code, der mir einige Zeit der Forschung auf Arrays gespeichert und wie man sie wachsen\increase dynamisch zu machen. Großartiger Dank.

Ich hoffe, ich kann mich revanchieren! Der folgende Code funktioniert für alle Datentypen. Er funktioniert auch bei Objekten, aber die Methode Contains (search) funktioniert möglicherweise nicht. Ich habe es nur mit den Typen double, int und bool getestet. Bei String könnte es ebenfalls Probleme geben und der Code muss eventuell erweitert werden.



Dann können Sie es für alle Typen deklarieren, die Sie wie folgt benötigen:




Ich hoffe, das hilft jedem


Bitte ignorieren Sie meinen obigen Vorschlag, das dynamische Array für jeden Datentyp zu verwenden. Es ist bereits eine generische CArrayList deklariert. bitte verwenden Sie diese. Ich bin auf ein Problem bei der Verwendung von Objekten gestoßen, das in diesem Thread behoben wurde: 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...
 
Habe von Dir schon einige gute Artikel gelesen. Dieser hier war keine Ausnahme.
 

Es scheint ein Fehler in der Funktion arrayResize(), in dem Beispiel der Inhalt des Arrays ist 1, 1, 3 in normalen Indizierung nicht 1, 2, 3. Siehe dieses Beispiel:

//+------------------------------------------------------------------+
//|false.mq5 |
//|Urheberrecht 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
//+------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Zuordnung von Indikatorpuffern
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Iterationsfunktion|
//+------------------------------------------------------------------+
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); // Bereiten Sie das Array vor
ar[0]=1; // Einstellen der Werte
ar[1]=2; 
ArraySetAsSeries(ar,true); // Ändern Sie die Indizierungsreihenfolge
ArrayResize(ar,3); // Vergrößerung des Arrays
ar[0]=3; // Den Wert für das neue Array-Element festlegen
Alert(ar[0]," ",ar[1]," ",ar[2]); // Array-Werte drucken
ArraySetAsSeries(ar,false);
Alert("Normal indexing: ", ar[0]," ",ar[1]," ",ar[2]); // Array-Werte drucken
//--- Rückgabe des Wertes von prev_calculated für den nächsten Aufruf
   return(rates_total);
  }
//+------------------------------------------------------------------+
In der hinzugefügten Funktion arraySetAsSeries() scheint es von der Funktion arrayresieze betroffen zu sein, siehe dieses Beispiel:
//+------------------------------------------------------------------+
//|Fehlerindex.mq5 |
//|Urheberrecht 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
//+------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Zuordnung von Indikatorpuffern
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Iterationsfunktion|
//+------------------------------------------------------------------+
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); // Bereiten Sie das Array vor
ar[0]=9; // Einstellen der Werte
ar[1]=8; 
ArrayResize(ar,6); // Vergrößerung des Arrays
Alert("Normal resize: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3], " ", ar[4], " ", ar[5]);
ArraySetAsSeries(ar,true); // Ändern Sie die Indizierungsreihenfolge
ArrayResize(ar,4); // Vergrößerung des Arrays
ArraySetAsSeries(ar, false);
Alert("See the random element added: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]);
ArraySetAsSeries(ar,true); // Ändern Sie die Indizierungsreihenfolge 0
ar[0]=8; // Den Wert für das neue Array-Element festlegen
Alert("Modify the first as serlies: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]); // Array-Werte drucken
//--- Rückgabe des Wertes von prev_calculated für den nächsten Aufruf
   return(rates_total);
  }
//+------------------------------------------------------------------+

Schritte:

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

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

4. Als Serie true einstellen:

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

5. Größe auf 4 ändern

ar = {0, 0, 8, 0}

6. Als Serie false einstellen:

ar = {0, 8, 0, 0}

7. Als Serie true einstellen:

ar = {0, 0, 8, 0}

8. Ändern Sie das erste Element a[0]

ar = {8, 0, 8, 0}


Ich weiß nicht, was array resize (3 -5) nimmt die Werte und kopiert sie in die neuen Positionen, 6 in forward nimmt zufällige Werte, denke ich. Ich bevorzuge resize() zuerst und dann setasseries() wie diese:

//+------------------------------------------------------------------+
//|indexingarraytest.mq5 |
//|Urheberrecht 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
//+------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Zuordnung von Indikatorpuffern
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Iterationsfunktion|
//+------------------------------------------------------------------+
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); // Bereiten Sie das Array vor
ar[0]=1; // Einstellen der Werte
ar[1]=2;
ArrayResize(ar,3); // Vergrößerung des Arrays
Alert("Redimension to 3 normal: ", ar[0], " ", ar[1], " ", ar[2]); 
ArraySetAsSeries(ar,true); // Ändern Sie die Indizierungsreihenfolge
Alert("Redimension to 3 series: ", ar[0], " ", ar[1], " ", ar[2]); 
ar[0]=8; // Den Wert für das neue Array-Element festlegen
Alert("Change the first element: ", ar[0]," ",ar[1]," ",ar[2]); // Array-Werte drucken
ArraySetAsSeries(ar, false);
Alert("Normal renew: ", ar[0]," ",ar[1]," ",ar[2]); // Array-Werte drucken
//--- Rückgabe des Wertes von prev_calculated für den nächsten Aufruf
   return(rates_total);
  }
//+------------------------------------------------------------------+