Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Verwendung dynamischer Arrays in mql4 (http://www.expert-advisor.com/forum/showthread.php?t=5534)

limit 10.03.17 16:04

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?

Raul0 12.03.17 12:40

Ich mach das nicht so umständlich.
Bei jedem zusätzlichen Wert, der in das Array geschrieben wird, kommt automatisch ein Resize hinzu.
Damit ist immer nur soviel genutzt wie gebraucht.

PHP-Code:

ArrayResizeElementArraySize(Element) + ); 

Abfrage Größe und Eins hinzuaddieren.

Gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:01 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum