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?