Einzelnen Beitrag anzeigen
  #1 (permalink)  
Alt 10.03.17
limit limit ist offline
Neues Mitglied
 
Registriert seit: Mar 2017
Beiträge: 3
limit befindet sich auf einem aufstrebenden Ast
Post Verwendung dynamischer Arrays in mql4

Ich beschäftige mich gerade mit effektiveren Möglichkeiten Arrays zu befüllen und bin auf diesen Artikel gestoßen: https://www.mql5.com/de/articles/567
Es geht mir um den Punkt: "Verwendung dynamischer Arrays" im Artikel.
Der Author beschreibt dort leider nur die Variante für mql5, doch das Ergebnis ist beachtlich.

Ich hab mich dran versucht und stehe gedanklich auf dem Schlauch wie ich das Problem in mql4 lösen kann.

Hier der Code:
Code:
#property strict
#property indicator_chart_window

int size1=0,size2=0;
double      Element[];  

class CDynamicArray2
  {
private:
   int   m_ChunkSize, m_ReservedSize, m_Size;       
public:
                                                   
   void CDynamicArray2(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
     }
   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
     }
   int Size()
     {
      return(m_Size);
     }
  };
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[])
  {
     int n=200000;
  
  CDynamicArray2 da;
   for(int k=0;k<n;k++)
     {
      da.AddValue(k);   
     }
     size2=ArraySize(Element);
     
   PrintFormat("Chunk Array: "+(string)size2); // Message regarding the amount of time required to perform the second option
   PrintFormat("Durchläufe: "+(string)n); // Message regarding the amount of time required to perform the second option

   return(rates_total);
  }
Wie man sehen kann, das Array zu befüllen klappt schon wunderbar, nur leider wirkt sich die Chunksize auf die Durchläufe aus, statt also der gewünschten 200000, bekomm ich 200000/1000*1024 raus, also 200704.
Mein Ziel ist natürlich eine korrekte Arbeitsweise mit dem Vorteil der Zeitersparnis bei der Berechnung.

Kann man das überhaupt so umschreiben, dass die Funktion für mt4 Sinn macht? Und lässt sich diese Funktion auch variabel einsetzen, so das ich den Code nicht für jedes Array anpassen muss?