Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1466

 

Guten Tag! Beim Schreiben eines Expert Advisors auf Mql5 bin ich auf ein Problem gestoßen. Es gibt ein Array mit Werten von Candlesticks Eröffnung für das Jahr. Auf jeder Kerze dieses Arrays muss ich ein Array von n-Kerzen erstellen, sagen wir 30, um die Hochs und Tiefs zu überprüfen. So etwas wie ein Zickzack-Indikator.

Ich schrieb diesen Code, der einen Fehler gibt: "Array außerhalb des Bereichs" oder die Werte von Maximum und Minimum in das gesamte Array, aber nicht in der erforderlichen 30-Kerzen-Periode.

for(int i=0; i<ArraySize(opens); i++)
  {
    if(i+30<=ArraySize(opens))
      {
       double maximum=0;
       double minimum=9;
       for(int j=0; j<30; j++)
        {
         maximum = ArrayMaximum(opens, i, i+j);
         minimum = ArrayMaximum(opens, i, i+j);
        }
     }
  }

Vielleicht muss ich ein anderes Array erstellen, um es in den Funktionen ArrayMaximum() und ArrayMinimum() zu überprüfen, aber ich bin verwirrt mit verschachtelten Schleifen und Array-Größe.

Bitte, geben Sie mir einen Tipp.

 
Dmitry Ivanushko #:
if(i+30<=ArraySize(opens))
if(i+30<ArraySize(opens))

Hier ist die Ausgabe außerhalb des Arrays

 
if(i+30<ArraySize(opens))

Dieser Fehler ist auf Unachtsamkeit zurückzuführen. Die Behebung des Fehlers löst das Problem nicht.

Wie kann ich ein Array mit 30 Candlestick-Eröffnungskursen erstellen, um darin nach Hochs und Tiefs zu suchen?

 
Dmitry Ivanushko #:
ArrayMaximum
ArrayMaximum

Rückgabe Index des Höchstwertes zurück, nicht den Preis.

//+------------------------------------------------------------------+
int indexMax[];
int indexMin[];
int sizeArray = ArraySize(opens);
int size = 0;
int n = 30;

for(int i = n; i < sizeArray; i + n)
  {
   ArrayResize(indexMax, size + 1);
   indexMax[size] = ArrayMaximum(opens, i - n, i);
   indexMin[size] = ArrayMinimum(opens, i - n, i);
   size++;
  }
//+------------------------------------------------------------------+

Ich habe es nicht überprüft, aber es scheint der Weg zu sein, um die Indizes der Minima und Maxima von Kerzeneröffnungen (Openings) zu erhalten.

Obwohl Sie auch den Preis auf einmal erhalten können, aber nicht die Indizes.

double PriseMin = opens[ArrayMinimum(opens, i - n, i)];
 
for(int i = n; i < sizeArray; i + n)

Ich habe nirgendwo ein Beispiel für eine mql-Schleife mit einem Schritt gefunden. Das vereinfacht die ganze Angelegenheit.

Nur ChatGPT hat mir geraten, es auf diese Weise zu schreiben:

for(int i = n; i < sizeArray; i += n)

Ich werde weiter experimentieren. Der Code funktioniert. Ich danke Ihnen.

Der Fehler "array out of range" tritt auf, wenn man ArrayResize nicht durchführt.

 
Dmitry Ivanushko #:

Dieser Fehler ist auf Unachtsamkeit zurückzuführen. Die Behebung des Fehlers löst das Problem nicht.

Wie kann ich ein Array mit 30 Candlestick-Eröffnungskursen erstellen, um darin nach Hochs und Tiefs zu suchen?

Wo liegt das Problem? Deklarieren Sie ein Array temp[] und kopieren Sie 30 Elemente hinein und suchen Sie nach dem Index des Minimal-/Maximalwertes. Und wenn es am Ende weniger als 30 sind, wird kopiert, wie viele übrig sind. Und in diesem Fall würde ich lieber eine while()-Schleife verwenden.

 
Alexey Viktorov #:
Wo liegt das Problem? Deklarieren Sie ein Array temp[] und kopieren Sie 30 Elemente hinein und suchen Sie den Index des Minimal-/Maximalwertes. Und wenn es am Ende weniger als 30 sind, wird kopiert, wie viele übrig sind. Und in diesem Fall würde ich lieber eine while()-Schleife verwenden.

Ja, das kann man machen. Ich kann nicht klar denken, also bitte ich um Rat.

 
Dmitry Ivanushko #:

Ja, das könnten Sie tun. Ich kann nicht klar denken, also bitte ich um Rat.

In einem statischen Array ist die Größe konstant, sie kann nicht geändert werden, in einem dynamischen Array kann sie geändert werden, aber die Größe des Arrays ist festgelegt! d.h. die Größe des Arrays ist bekannt und die Indizes der Elemente von 0 bis zum Ende. <= ist unzulässig, weil die Indizes der Elemente von Null an und der Index des letzten Elements um eine Einheit der Array-Größe kleiner sind.

Alles liegt in Ihren Händen))))

 
Valeriy Yastremskiy #:

In einem statischen Array ist die Größe konstant und kann nicht geändert werden, in einem dynamischen Array kann sie geändert werden, aber die Größe des Arrays ist festgelegt! d.h. die Größe des Arrays ist bekannt und die Indizes der Elemente sind von 0 bis zum Ende. <= ist unzulässig, weil die Indizes der Elemente von Null an beginnen und der Index des letzten Elements um eine Einheit der Array-Größe kleiner ist.

Alles liegt in Ihren Händen))))

Was meinen Siedamit ? Meinen Sie, dass man, wenn man eine bestimmte Anzahl von Elementen von einem Array in ein anderes Array, z.B. temp[], kopieren will, die Arraygröße vor dem Kopieren festlegen sollte ArrayResize(temp, new_size); ?????

 
Dmitry Ivanushko #:

Ja, das könnten Sie tun. Ich kann nicht klar denken, also bitte ich um Rat.

Sie brauchen nicht einmal ein temporäres Array.

int  ArrayMaximum( 
   const void&   array[],             // массив для поиска 
   int           start=0,             // с какого индекса начинаем поиск 
   int           count=WHOLE_ARRAY    // количество проверяемых 
   );

Dieser Code

  double open[];
  int copy = CopyOpen(_Symbol, PERIOD_CURRENT, 0, 100, open);
  int arrMaximum = ArrayMaximum(open, 85, 20);

sucht nach den maximal 15 verbleibenden Elementen, obwohl er auf die Suche nach 20 Elementen eingestellt ist.

Sie sollten also besser die while()-Schleife verwenden und sich nicht um die Anzahl der verbleibenden Array-Elemente kümmern.