Einteilung der offenen Stellen in Gruppen - Seite 7

 

Gibt es meiner Meinung nach einen schnelleren und effizienteren Algorithmus zum Hinzufügen einer neuen Position (und ihrer 6 Eigenschaften) zur Positionsstruktur? Bei mir funktioniert das so: Ich stelle mit roher Gewalt sicher, dass die Position wirklich neu ist, ermittle die Werte der erforderlichen Parameter, erhöhe das Array um 1 und schreibe ein neues Element. Ich habe in dem Artikel gelesen, dass man das Vergrößern und Schreiben anders machen kann und sollte. Ich habe die dort angegebene Funktion in meinem Terminal nicht gefunden und weiß nicht, wie ich sie ausfüllen soll.

 
Sergey Voytsekhovsky:

Gibt es meiner Meinung nach einen schnelleren und effizienteren Algorithmus zum Hinzufügen einer neuen Position (und ihrer 6 Eigenschaften) zur Positionsstruktur? Bei mir funktioniert das so: Ich stelle mit roher Gewalt sicher, dass die Position wirklich neu ist, ermittle die Werte der erforderlichen Parameter, erhöhe das Array um 1 und schreibe ein neues Element. Ich habe in dem Artikel gelesen, dass man das Vergrößern und Schreiben anders machen kann und sollte. Ich habe die dort angegebene Funktion in meinem Terminal nicht gefunden und weiß nicht, wie ich sie ausfüllen soll.

Versuchen Sie nicht, nach Stellen zu suchen, um festzustellen, "ob die Stelle wirklich neu ist". Finden Sie einen anderen Weg. Zum Beispiel in OnTradeTransaction. Und versuchen Sie, die Funktion ArrayRemove anstelle von Array Overflow zu verwenden

 
Alexey Viktorov:

Probieren Sie nicht viele Positionen aus, um festzustellen, "ob die Position wirklich neu ist". Finden Sie einen anderen Weg. Zum Beispiel in OnTradeTransaction. Und versuchen Sie, die Funktion ArrayRemove anstelle von Array Overflow zu verwenden

Respekt, danke für die prompte Unterstützung und die hilfreichen Ratschläge, ich werde mich an die Arbeit machen. Und wie man an den Schwanz des Arrays Daten ohne +1 zu Größe, Formel aus vorgefertigten Klassen Terminal werfen über hinzufügen? Nun zur allgemeinen Entwicklung, um keine Lücken in meinem Kopf zu hinterlassen, bitte?

 
Sergey Voytsekhovsky:

Und wie man den Schwanz des Arrays Daten ohne +1, um die Größe, eine Formel aus vorgefertigten Klassen Terminal werfen bis zu einem gewissen Grad hinzufügen? Nun zur allgemeinen Entwicklung, um keine Lücken in meinem Kopf zu hinterlassen, bitte?

Ich habe die Methode selbst gefunden, aber wie man sie anbringt, verstehe ich nicht, ich habe nicht genug Erfahrung. Es ist schwer, eine Fremdsprache zu beherrschen, wenn man nicht einmal weiß, dass es sie gibt. Dies ist eine Abschweifung.

//+------------------------------------------------------------------+
//| Adding an element to the end of the array                        |
//| Добавление элемента в конец массива                              |
//+------------------------------------------------------------------+
bool CArrayInt::Add(const int element)
  {
//--- check/reserve elements of array
//--- проверка / резерв элементов массива
   if(!Reserve(1))
      return(false);
//--- add
   m_data[m_data_total++]=element;
   m_sort_mode=-1;
//--- successful
//--- успешный
   return(true);
  }

Wie schraube ich sie an? Wo platzieren Sie die Art von Array, die Sie anbauen wollen? Was ist, wenn das Array eine Struktur ist?

 
Sergey Voytsekhovsky:

Respekt, danke für die prompte Unterstützung und die hilfreichen Ratschläge, ich werde mich an die Arbeit machen. Und wie man an den Schwanz des Arrays Daten ohne +1 zu Größe, Formel aus vorgefertigten Klassen Terminal werfen über hinzufügen? Nun zur allgemeinen Entwicklung, um keine Lücken in meinem Kopf zu hinterlassen, bitte?

Ich versuche, keine vorgefertigten Klassen zu verwenden. Ich verwende CTrade nur für die Erstellung von Handelspanels. Ich bin zu faul, CTrade für meine Bedürfnisse umzuschreiben, und die Panels sind für mich kompliziert, und ich habe keine Lust, sie zu verstehen. Deshalb bin ich sicher, dass +1 zum Array und das Füllen der Strukturelemente im Vergleich zu drei Schleifen keine so große Verzögerung darstellt.
 
Sergey Voytsekhovsky:

Ich habe die Methode selbst gefunden, aber ich weiß nicht, wie ich sie anwenden kann, weil ich nicht erfahren genug bin. Es ist schwer, eine Fremdsprache zu beherrschen, wenn man nicht einmal weiß, dass es sie gibt. Dies ist eine Abschweifung.

Wie schraube ich es also an?

Zu Ihrer Reihe von Strukturen - auf keinen Fall.

 
Sergey Voytsekhovsky:

Ich habe die Methode selbst gefunden, aber ich weiß nicht, wie ich sie anwenden kann, weil ich nicht erfahren genug bin. Es ist schwer, eine Fremdsprache zu beherrschen, wenn man nicht einmal weiß, dass es sie gibt. Dies ist eine Abschweifung.

Wie schraube ich es also an?

Und dies ist, wenn ich richtig verstehe, mehr für OOP-Objekt-Arrays.
 
Alexey Viktorov:
Und dies ist, wenn ich richtig verstehe, mehr für OOP-Objekt-Arrays.

Nicht "mehr", sondern "von dort".

 
Alexey Viktorov:
Ich versuche, keine vorgefertigten Klassen zu verwenden. Ich verwende CTrade nur für die Erstellung von Handelspanels. Ich bin zu faul, CTrade für meine eigenen Bedürfnisse umzuschreiben, und die Panels sind zu kompliziert für mich, und ich habe keine Lust, sie zu verstehen. Deshalb bin ich mir sicher, dass +1 zu einem Array und das Füllen von Strukturelementen im Vergleich zu drei Schleifen keine so große Verzögerung darstellt.

Die Idee ist klar, es ist unklar, warum man nicht auf bewährte Algorithmen zurückgreift, aber das mit den "drei Schleifen" ist sehr verständlich, danke. Wenn man hochwertige, einfache Lösungen bekommt, frage ich mich immer, warum ich nicht selbst darauf gekommen bin, weil es so offensichtlich ist. Ich danke Ihnen.

 
Artyom Trishkin:

Nicht "mehr", sondern "von hier".

Bitte sagen Sie mir, dass der Artikelhttps://www.mql5.com/ru/articles/567 den folgenden Code enthält und erwähnt

Этот класс находятся в файле "CDynamicArray.mqh" приложения. Файл должен располагаться в каталоге "MQL5\Include" каталога данных терминала.
class CDynamicArray
  {
private:
   int               m_ChunkSize;    // Размер блока
   int               m_ReservedSize; // Реальный размер массива
   int               m_Size;         // Количество занятых элементов массива
public:
   double            Element[];      // Собственно массив. Находится в секции public, 
                                     // чтобы в случае необходимости работать с ним напрямую
   //+------------------------------------------------------------------+
   //|   Конструктор                                                    |
   //+------------------------------------------------------------------+
   void CDynamicArray(int ChunkSize=1024)
     {
      m_Size=0;                            // Количество занятых элементов
      m_ChunkSize=ChunkSize;               // Размер блока
      m_ReservedSize=ChunkSize;            // Реальный размер массива
      ArrayResize(Element,m_ReservedSize); // Подготовка массива
     }
   //+------------------------------------------------------------------+
   //|   Функция добавления в конец массива                             |
   //+------------------------------------------------------------------+
   void AddValue(double Value)
     {
      m_Size++; // Увеличение количества занятых элементов
      if(m_Size>m_ReservedSize)
        { // Требуемое количество больше реального размера массива
         m_ReservedSize+=m_ChunkSize; // Рассчитываем новый размер массива
         ArrayResize(Element,m_ReservedSize); // Увеличиваем реальный размер массива
        }
      Element[m_Size-1]=Value; // Добавляем значение
     }
   //+------------------------------------------------------------------+
   //|   Функция получения количества занятых элементов массива         |
   //+------------------------------------------------------------------+
   int Size()
     {
      return(m_Size);
     }
  };
Этот класс находятся в файле "CDynamicArray.mqh" приложения. Файл должен располагаться в каталоге "MQL5\Include" каталога данных терминала.

Сравним быстродействие при последовательном увеличении массива на 1 и при увеличении размера массива блоками:

int n=50000;
   double ar[];
   CDynamicArray da;

//--- Вариант 1 (увеличение размера по 1-му элементу)
   long st=GetTickCount(); // Запомним время начала 
   ArrayResize(ar,0); // Установка нулевого размера массива 
   for(int i=0;i<n;i++)
     {
      ArrayResize(ar,i+1); // Последовательное изменение размера массива
      ar[i]=i;
     }
   Alert("Вариант 1: "+IntegerToString(GetTickCount()-st)+" мс"); // Сообщение о времени, затраченном на первый вариант

//--- Вариант 2 (увеличение размера блоками)
   st=GetTickCount(); // Запомним время начала 
   for(int i=0;i<n;i++)
     {
      da.AddValue(i); // Добавляем элемент
     }
   Alert("Вариант 2: "+IntegerToString(GetTickCount()-st)+" мс"); // Сообщение о времени, затраченном на второй вариант

  }

Aber ich konnte sie nicht im Standardpaket finden. Ich habe nicht genau genug hingesehen, oder ist der Artikel veraltet?

Grund der Beschwerde: