Dynmaisches Array

 

Hi Leute,


ich möchte in ein dynamisches Array Werte hinzufügen und wieder herauslesen. Ich weiß allerdings nicht wie das genau geht weil ich noch Anfänger in Sachen objektorientierter Programmierung bin.

Ich habe folgendes mqh-file eingebunden:

//+------------------------------------------------------------------+
//|                                                CDynamicArray.mqh |
//|                                                          Integer |
//|                          https://login.mql5.com/ru/users/Integer |
//+------------------------------------------------------------------+
#property copyright "Integer"
#property link "https://login.mql5.com/ru/users/Integer"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CDynamicArray
  {
private:
   int               m_ChunkSize;    // Chunk size
   int               m_ReservedSize; // Actual size of the array
   int               m_Size;         // Number of active elements in the array
public:
   double            Element[];      // The array proper. It is located in the public section, 
                                     // so that we can use it directly, if necessary
   //+------------------------------------------------------------------+
   //|   Constructor                                                    |
   //+------------------------------------------------------------------+
   void CDynamicArray(int ChunkSize=1024)
     {
      m_Size=0;                            // Number of active elements
      m_ChunkSize=ChunkSize;               // Chunk size
      m_ReservedSize=ChunkSize;            // Actual size of the array
      ArrayResize(Element,m_ReservedSize); // Prepare the array
     }
   //+------------------------------------------------------------------+
   //|   Function for adding an element at the end of array             |
   //+------------------------------------------------------------------+
   void AddValue(double Value)
     {
      m_Size++; // Increase the number of active elements
      if(m_Size>m_ReservedSize)
        { // The required number is bigger than the actual array size
         m_ReservedSize+=m_ChunkSize; // Calculate the new array size
         ArrayResize(Element,m_ReservedSize); // Increase the actual array size
        }
      Element[m_Size-1]=Value; // Add the value
     }
   //+------------------------------------------------------------------+
   //|   Function for getting the number of active elements in the array|
   //+------------------------------------------------------------------+
   int Size()
     {
      return(m_Size);
     }
  };
//+------------------------------------------------------------------+

in meinem EA füge ich einen Wert mit AddValue hinzu:

CDynamicArray dahigh;

double high=mrate[1].high;
  
   dahigh.AddValue(high);

Aber wie kann ich jetzt auf den Wert high in dem Array wieder zugreifen?


Vielen Dank!

 

Hallo Benedikt,

ist im Code beschrieben:

public:
   double            Element[];      // The array property. It is located in the public section, 
                                     // so that we can use it directly, if necessary

Ob die Verwendung dieser Klasse die Arbeit erleichtert wage ich zu bezweifeln, denn du musst dir den Index des hineingeschriebenen Wertes merken.

Der einzige Vorteil dieser Klasse ist, das Memory 'chunkweise' alloziert wird, vorgabemäßig immer um 1024 doubles.

Zugriff auf die Werte hast du mit

MySavedHigh = dahigh.Element[theIndexYouHaveToRemember];

Wenn du das Besondere suchst: https://www.mql5.com/de/code/1379

ArrayResize(...) bietet ja die Möglichkeit eine Reservegröße festzulegen. F1 erklärt's.

Für CopyHigh, CopyLow, CopyRates, usw. brauchst du die Größe des Arrays nicht beachten, das machen diese Fubktionen für dich.

Da ist allerdings wieder ArraySetAsSeries(...) notwendig. Steht alles in der Dokumentation. F1 erklärt's.

Es braucht halt seine Zeit um da sattelfest zu werden.

Ich hoffe deine Frage ist damit beantwortet.

LG, Otto

Klasse um einen Ringbuffer zu erstellen
Klasse um einen Ringbuffer zu erstellen
  • Stimmen: 34
  • 2016.05.13
  • Konstantin Gruzdev
  • www.mql5.com
Ein Ringbuffer ist eine Organisationsform, um Daten zu speichern. Üblicherweise präsentiert er ein Array von endlicher Länge bei dem das älteste Element durch die neuesten Daten ersetzt wird. Es gibt somit immer Zugriff auf eine bestimmte Anzahl der letzten Daten. Vor allem verwendet für asynchrones Lesen und Schreiben von Stromdaten. Für...
 

Ok super! Danke. Funktioniert soweit!

Ich hab das dynamische Array so gemacht, weil in diesem Artikel steht, dass es wesentlich schneller geht als mit ArrayResize: https://www.mql5.com/de/articles/567

Was meinst du mit "...du musst dir den Index des hineingeschriebenen Wertes merken." Das muss ich doch bei jedem Array wenn ich auf einen bestimmten Wert zugreifen will, oder?


VG, Ben
Grundlagen der Programmierung in MQL5: Arrays
Grundlagen der Programmierung in MQL5: Arrays
  • 2016.05.05
  • Dmitry Fedoseev
  • www.mql5.com
Arrays sind zusammen mit Variablen und Funktionen ein wesentlicher Bestandteil so gut wie jeder Programmiersprache. Viele Programmierneulinge haben oft Angst vor Arrays. Es klingt seltsam, doch es ist wahr! Ich kann Ihnen versichern, dass sie überhaupt nicht furchteinflößend sind. Tatsächlich sind Arrays herkömmlichen Variablen ähnlich. Lässt...
Grund der Beschwerde: