Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 327

 

Hallo! Ich habe eine Frage zu Arrays. Ich habe ein eindimensionales Array mit einigen Schwierigkeiten erstellt. Ich sollte in Ordnung sein, weil ich keinen Fehler bei der Kompilierung Zeit haben, aber jetzt sollte ich es in der Tester laufen und sehen Fehler EURUSD,M1: Array außerhalb des Bereichs in ,, (218,12), die genau die Position meiner Trauer Array angibt. Bitte sagen Sie mir, was daran falsch ist

int Totall=OrdersTotal();
  double Price;                                                               // Цена выбранного ордера
  double Mas[];                                                                //массив для упорядочивания всех ордеров
  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();
       Mas [i] = Price;                                                        //Как раз перед квадратной скобкой и есть ошибка  array out of range in ,, (218,12)
         
         ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
             PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера

          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko1=ArrayBsearch(Mas,Bid,WHOLE_ARRAY,0,MODE_ASCEND);           //Определен индекс ближайшего меньшего по значению елемента к текущей цене
            PriceBlizko1=Mas[Blizko1];
     }
   }       
Gibt es vielleicht eine andere Möglichkeit, jedem Element des Arrays einen Bestellpreis zuzuweisen?
 
vikzip:

Hallo! Ich habe eine Frage zu Arrays. Ich habe ein eindimensionales Array mit einigen Schwierigkeiten erstellt. Ich sollte in Ordnung sein, weil ich keinen Fehler bei der Kompilierung Zeit haben, aber jetzt sollte ich es in der Tester laufen und sehen Fehler EURUSD,M1: Array außerhalb des Bereichs in ,, (218,12), die genau die Position meiner Trauer Array angibt. Bitte sagen Sie mir, was daran falsch ist


Ihr Code ist an der Wurzel falsch, aber der Fehler ist auf die Tatsache zurückzuführen, dass die Array-Größe vor dem Füllen nicht festgelegt wird

if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();
       ArrayResize(Mas, i+1);
       Mas [i] = Price; 
 
Vitaly Muzichenko:

Ihr Code ist grundsätzlich falsch, aber der Fehler ist darauf zurückzuführen, dass die Array-Größe vor dem Befüllen nicht festgelegt wurde


Herzlichen Dank! Können Sie mir bitte sagen, ob die Reihenfolge nicht stimmt? Es geht darum, die Preise der Aufträge zu ermitteln, die dem Preis von unten und oben am nächsten kommen. Bitte teilen Sie mir Ihren Standpunkt mit.

 
vikzip:

Herzlichen Dank! Können Sie mir bitte sagen, ob die Reihenfolge nicht korrekt ist? Die Idee ist, die Preise der Aufträge zu ermitteln, die dem Preis von unten und von oben am nächsten kommen. Bitte teilen Sie mir Ihren Standpunkt mit.

Sie haben eine Menge unnötiger Dinge in Ihrem Kreislauf. Sie müssen das Array in der Schleife mit Preisen füllen und außerhalb der Schleife mit ihnen arbeiten

  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       ArrayResize(Mas, i+1);
       Mas[i] = OrderOpenPrice();                                                        //Как раз перед квадратной скобкой и есть ошибка array out of range in ,, (218,12)
   /*
         ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
             PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера

          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko1=ArrayBsearch(Mas,Bid,WHOLE_ARRAY,0,MODE_ASCEND);           //Определен индекс ближайшего меньшего по значению елемента к текущей цене
            PriceBlizko1=Mas[Blizko1];
   */
     }
   }       
 
Vitaly Muzichenko:

Sie haben eine Menge unnötiger Dinge in der Schleife. Sie müssen das Array in der Schleife mit Preisen füllen und außerhalb der Schleife mit ihnen arbeiten.


Ich verstehe. Vielen Dank!!! Habe ich die Idee richtig verstanden?

 
vikzip:

Ich verstehe. Vielen Dank!!! Haben Sie die Idee richtig verstanden?

Das ist möglich. Die gleiche Aufgabe kann auf verschiedene Weise erfüllt werden.

 
double Price;                                                               // Цена выбранного ордера
  double Mas[];                                                                //массив для упорядочивания всех ордеров
  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();
       ArrayResize(Mas, i+1);
       Mas [i] = Price; 
     }
   } 
          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
             PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера                                                             Вот в этой строке

          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko1=ArrayBsearch(Mas,Bid,WHOLE_ARRAY,0,MODE_ASCEND);           //Определен индекс ближайшего меньшего по значению елемента к текущей цене
            PriceBlizko1=Mas[Blizko1];


Vitaly Muzichenko:

Das ist möglich. Ein und dieselbe Aufgabe kann auf verschiedene Weise ausgeführt werden.


Ich habe gerade eine Schleife gemacht, um die nächstgelegenen Element-Indizes zu bestimmen, und der Tester zeigt einen Fehler bei Mas[Blizko2] Vielleicht liegt es daran, dass es noch keine Aufträge gibt, wenn ich den EA ausführe?

(Bitte um Rat, vielleicht wissen Sie, wo man etwas Ähnliches finden kann?)
 
vikzip:

Ich habe gerade aus der Schleife die Definition der engsten Element-Indizes und in der Tester zeigt einen Fehler in Ort Mas[Blizko2] .Vielleicht ist es, weil, wenn Sie die EA gibt es keine Aufträge noch laufen?

Probieren Sie es so

if(ArraySize(Mas)>0) { // если массив не пустой, то

         ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
             PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера

          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko1=ArrayBsearch(Mas,Bid,WHOLE_ARRAY,0,MODE_ASCEND);           //Определен индекс ближайшего меньшего по значению елемента к текущей цене
            PriceBlizko1=Mas[Blizko1];

 }
 
Vitaly Muzichenko:

Versuchen Sie dies


Vielen Dank!!! Ich habe noch eine weitere Frage: Bestimme ich den Index des dem aktuellen Preis am nächsten liegenden kleineren Elements richtig, indem ichMODE_DESCEND inMODE_ASCENDändere?

 
vikzip:

Ich danke Ihnen vielmals!!! Ich habe noch eine weitere Frage: Bestimme ich den Index des Elements, das dem aktuellen Preis am nächsten liegt, richtig, indem ichMODE_DESCEND inMODE_ASCENDändere?

Keine Antwort, ich habeArrayBsearch noch nie benutzt