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

 
Alexey Viktorov:

Es besteht keine Notwendigkeit, das Array nach jedem Hinzufügen eines Arrayelements zu sortieren. Es ist besser, die Sortierung zu verschieben

Aus der Referenz

Mas[Blizko2] ist der nächstkleinere Wert in der Matrix

Vielen Dank für Ihre Antwort! Könnten Sie mir bitte sagen, um das nächste Element des Arrays zu bestimmen, habe ich das bereits gefundene Element +1 verwendet, aber der Prüfer gibt an dieser Stelle einen Fehler aus.

 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_DESCEND);                           // Теперь цены открытия упорядочены по убыванию
     }
   } 
   if(ArraySize(Mas)>1)                                                         //Если массив не пустой
   
         { 
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
        

        Mas[Blizko2+1]= Blizko1;     // В этой строке перед квадратной скобкой выдает ошибку!                           //Определен индекс ближайшего меньшего по значению елемента к текущей цене

        PriceBlizko1=Mas[Blizko1];
        PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера   

Ich muss das nächste Element finden. Offensichtlich ist es +1, aber das Programm gibt mir einen Fehler! Vielleicht gibt es einen anderen Weg oder ich mache es falsch? Bitte geben Sie mir einen Hinweis)

Blizko1 = Mas[Blizko2]+1;

oder so?

aber dann beim Kompilieren die Warnung über möglichen Datenverlust

 
vikzip:

Mit dieser Konstruktion

Blizko1 = Mas[Blizko2]+1;

Sie addieren 1 zu dem Wert, den Sie aus der Blizko2-Indexzelle erhalten, und dort wird der Preis gespeichert - ein doppelter Wert. Sie addieren eine ganze Zahl 1. Um eine Warnung zu vermeiden, müssen Sie +1.0 schreiben

Aber auch das wird den "Vater der russischen Demokratie" nicht retten, denn Sie addieren 1 nicht zum Index, sondern zu dem Wert, der im Array Mas[] mit dem Index Blizko2 gespeichert ist.

Um einen Wert aus einer benachbarten Zelle des Arrays zu erhalten, müssen Sie natürlich 1 zum Index addieren oder subtrahieren. Aber hier haben wir einen Fehler, über den Sie gestolpert sind: Wenn index auf die äußerste Zelle eines Arrays zeigt - entweder auf 0 oder auf die allerletzte, dann fällt man beim Subtrahieren von 1 (bei 0) oder beim Addieren von 1 (bei der allerletzten) außerhalb des Arrays - eine solche Zelle gibt es nicht. Dementsprechend müssen Sie kontrollieren, dass Blizko2+1 nicht größer ist als ArraySize(Mas)-1, oder Blizko2-1 nicht kleiner als Null ist.

Und... Ihnen wurde gesagt, dass Sie das Array nicht bei jeder Iteration der Schleife sortieren müssen - brauchen Sie Bremsen?

Es sollte sortiert werden, nachdem überprüft wurde, dass die Größe des Arrays größer als 1 ist.

Und dieser Entwurf ist überhaupt nicht klar:

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

Mas[Blizko2+1]= Blizko1; // В этой строке перед квадратной скобкой выдает ошибку! //Определен индекс ближайшего меньшего по значению елемента к текущей цене

        PriceBlizko1=Mas[Blizko1];
        PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера   

Sehen Sie: In Blizko2 haben Sie den Index der Array-Zelle mit dem Preis.
Dann schreiben Sie in das Array - in die Zelle Blizko2+1 den Wert, der in der Variablen Blizko1 enthalten ist (warum???) - Sie sollten dort Preise haben, aber Sie stopfen sie mit unverständlichen Werten voll.

Sie müssen herausfinden, was Sie im Allgemeinen tun - kommentieren Sie einfach jede Zeile Ihrer Funktion aus. Nachdenklich.

 
Artyom Trishkin:

Mit dieser Konstruktion

Sie addieren 1 zu dem Wert, den Sie aus der Blizko2-Indexzelle erhalten, und dort wird der Preis gespeichert - ein doppelter Wert. Sie addieren eine ganze Zahl 1. Sie müssen +1,0 schreiben, um die Warnung zu vermeiden.

Aber auch das wird den "Vater der russischen Demokratie" nicht retten, denn Sie addieren 1 nicht zum Index, sondern zu dem Wert, der im Array Mas[] mit dem Index Blizko2 gespeichert ist.

Um einen Wert aus einer benachbarten Zelle des Arrays zu erhalten, müssen Sie natürlich 1 zum Index addieren oder subtrahieren. Aber hier haben wir einen Fehler, über den Sie gestolpert sind: Wenn index auf die äußerste Zelle eines Arrays zeigt - entweder auf 0 oder auf die allerletzte, dann fällt man beim Subtrahieren von 1 (bei 0) oder beim Addieren von 1 (bei der allerletzten) außerhalb des Arrays - eine solche Zelle gibt es nicht. Dementsprechend müssen Sie kontrollieren, dass Blizko2+1 nicht größer ist als ArraySize(Mas)-1, oder Blizko2-1 nicht kleiner als Null ist.

Und... Ihnen wurde gesagt, dass Sie das Array nicht bei jeder Iteration der Schleife sortieren müssen - brauchen Sie Bremsen?

Um es zu sortieren, müssen wir prüfen, ob die Größe des Arrays größer als 1 ist.

Und diese Konstruktion ist ganz und gar nicht klar:

Siehe: in Blizko2 haben Sie den Index der Array-Zelle mit dem Preis.
Dann schreiben Sie in das Array - in die Zelle Blizko2+1 den Wert, der in der Variablen Blizko1 enthalten ist (warum???) - Sie sollten dort Preise haben, aber Sie stopfen sie mit unverständlichen Werten voll.

Sie müssen herausfinden, was Sie im Allgemeinen tun - kommentieren Sie einfach jede Zeile Ihrer Funktion aus. Nachdenklich.


Vielen Dank für die informative Antwort! Der Zweck, zu dem ich das Array erstellen möchte, besteht darin, die Preise der nächstgelegenen Aufträge unter dem Preis und über dem Preis zu ermitteln, falls es welche gibt. Wenn sie verfügbar sind und der Abstand zwischen ihnen und dem Preis den von mir festgelegten Abstand überschreitet, werden die entsprechenden Aufträge eröffnet. Ich dachte, es würde so aussehen (ich habe die Logik meines Handelns hier so gut wie möglich beschrieben)

//---Создаем массив для учета всех ордеров в терминале
  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_DESCEND);                           // Теперь цены открытия упорядочены по убыванию. Я намеренно сортирую массив, потому что ордера добовляются в него в том порядке в котором появляются в 
                                                                             //терминале и не сортируются по убыванию(Верно ли это мое утверждение??)А мне необходимо позже точно определить ближайший ордер выше и ниже цены

     }
   } 
   if(ArraySize(Mas)>1)                                                         //Если массив не пустой
   
         { 
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
                                                                               //Здесь я справку прочитал и если указано MODE_ASCEND тогда будет найдено ближайшее меньшее значение, но первым я намерен определить ордер выше цены и 
                                                                               // поэтому поставил MODE_DESCEND. Скажите пожалуйста - это верно?? 
         PriceBlizko1 = Mas[Blizko2]+1;                                        //!!!Вот здесь я намереваюсь определить ордер сразу ниже цены и так как я намеренно упорядочил по убыванию уже все ордера в массиве, то по логике после 
                                                                               //определения ближайшего верхнего ордера к цене Blizko2 следующим в массиве будет ордер уже ниже цены(Верно ли мое утверждение??)И вот на этом месте я не 
                                                                               //могу понять: каким же образом это сделать? Ведь мне очевидно что он следующий, но как это записать в код я не могу понять))) Пробовал и в скобках уже 
                                                                               //прибавлять еденицу)) А мне нужно что бы PriceBlizko1 была присвоена цена ордера сразу ниже цены!! Подскажите пожалуйста как определить цену ордера ниже 
                                                                               //цены PriceBlizko2 ??
         PriceBlizko2 = Mas[Blizko2];                                          // Цена выбранного ордера выше цены         

        
 

Ich würde etwa so aussehen

double levelDown=0;
double levelUp=DBL_MAX;

int totalOrders=OrdersTotal();


   for(int i=0;i<totalOrders;i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         double price=OrderOpenPrice();
         
         if (price-Ask>_Point && levelUp-price>_Point)
            levelUp=price;
         
         if (Bid-price>_Point && price-levelDown>_Point)
            levelDown=price;
         }
      }
 
Taras Slobodyanik:

Ich würde etwa so aussehen


Danke, was bedeutetDBL_MAX auf der obersten Ebene?

 
vikzip:

Vielen Dank, was bedeutetDBL_MAX?

Die clevere Forumsmaschine hat sogar einen Link eingefügt. Es ist einfacher, sie anzuklicken, als auf eine Antwort zu warten.

 
Artyom Trishkin:

Die clevere Forumsmaschine hat sogar einen Link eingefügt. Es ist einfacher, sie anzuklicken, als auf eine Antwort zu warten.


Ich danke Ihnen! Ich wünschte, ich hätte einen solchen Motor)))

 
vikzip:

Vielen Dank für die informative Antwort! Der Zweck, für den ich das Array erstellen möchte, besteht darin, die Preise der nächstgelegenen Aufträge unterhalb und oberhalb des Preises zu ermitteln, falls es welche gibt. Wenn sie verfügbar sind und der Abstand zwischen ihnen und dem Preis einen bestimmten Abstand überschreitet, werden die entsprechenden Aufträge eröffnet. Ich dachte, es würde so aussehen (ich habe die Logik meines Handelns hier so gut wie möglich beschrieben)

In diesem Zeilenkommentar liegt ein Fehler vor.

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


Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien.

Alle MQL4 Anfänger Fragen, Hilfe und Diskussion über Algorithmen und Codes

Alexey Viktorov, 2017.10.04 09:32


Aus der Hilfe

Zurückgegebener Wert

Gibt den Index des ersten gefundenen Elements zurück. Wird der gesuchte Wert nicht gefunden, wird der Index des nächstkleineren Elements zurückgegeben, zwischen denen sich der gesuchte Wert befindet.

Mas[Blizko2] ist der nächst kleinere Wert in der Matrix.


Es bleibt nur noch hinzuzufügen, dass der Verweis nichts über die Abhängigkeit von der Sortierrichtung des Arrays aussagt. Nach der ArrayBsearch ist also keine Manipulation erforderlich. Die Aufgabe ist bereits erledigt.

Artyom hat bereits alles weiter erklärt. Überprüfung der Gleichheit eines Indexes auf Null und der Größe eines Arrays, um nicht aus dem Rahmen zu fallen...

 

Wie kann ich erreichen, dass die Maus erst dann verfolgt wird, wenn die Schaltfläche angeklickt wird? Aber die Situation geschieht (in der Idee der Übertragung eines Stopps auf alle Aufträge zu einem Punkt durch Mausklick aus dem EA), wenn ich auf die Schaltfläche klicken, ein Stopp auf alle Aufträge zu dem Preis, wo die Schaltfläche geklickt wurde, beginnt auf einmal übertragen werden. Wie kann diese Eigenschaft if(id==CHARTEVENT_CLICK)

if(ObjectGetInteger(0, "cm STOP ALL",OBJPROP_STATE))

 
Basicprof:

Wie kann ich erreichen, dass die Maus erst dann verfolgt wird, wenn die Schaltfläche angeklickt wird? Aber die Situation geschieht (in der Idee der Übertragung eines Stopps auf alle Aufträge zu einem Punkt durch Mausklick aus dem EA), wenn ich auf die Schaltfläche klicken, ein Stopp auf alle Aufträge zu dem Preis, wo die Schaltfläche geklickt wurde, beginnt auf einmal übertragen werden. Wie kann diese Eigenschaft if(id==CHARTEVENT_CLICK)

nur ausgeführt werden, wenn diese Schaltfläche angeklickt wurde if(ObjectGetInteger(0, "cm STOP ALL",OBJPROP_STATE))


if(id==CHARTEVENT_OBJECT_CLICK && sparam == "cm STOP ALL") { // код }
Grund der Beschwerde: